どうもみむらです。
なんだかんだ、私の家では NVR500 を使って良い感じでインターネットをしていたりします。
YAMAHA NVR500 と OCN でひかり電話と IPv6
ヤマハルータと Hyper-V でネットワーク的な隔離環境を作ってみる
過去に書いたこの2つの記事を見れば、どういう環境かは簡単に想像出来るかと思います(
なんだかんだで、 Hyper-V 側に ipv6 環境を持って行かないとなーと思いまして
セグメントを変えて RA (Router Advertisement) を使って配信しようと思ってハマりましたのでメモ。
(どうでも良い雑談をすっ飛ばしたい方は、下の方まで読み飛ばしてください・・w)
プロローグ:
まず、何となく適当に、
ipv6 prefix 2 dhcp-prefix@pp2:cafe::/80
ipv6 lan1/1 address dhcp-prefix@pp2:cafe::1/80
ipv6 lan1/1 rtadv send 1 o_flag=on
こんな感じで書いてみました。
設定としては、
プロバイダから指定されたアドレスのプレフィックス (dhco-prefix@pp2) に
”cafe” というアドレスをくっつけたものをサブネットプレフィックスとして配信する設定。
(o_flag = ON : Other Flag, これが設定されていると、DHCPv6 等を使ってアドレス以外の情報を撮ってくるようになります。)
一見、なんとなく良さそうな感じで RA が配信されるのですが、
どうもシステムに IP アドレスが設定される気配が無く。
どうしようか・・と思っていた所で、ルータの設定画面のトップページを見てみますと
・・・! “/56 じゃん!” (OCN IPv6)
なら、 /64 としていじればいいんじゃね! ということで、
ipv6 prefix 2 dhcp-prefix@pp2:1100::/64
ipv6 lan1/1 address dhcp-prefix@pp2:1100::1/64
ipv6 lan1/1 rtadv send 1 o_flag=on
こんな感じで書いてみたところ、(これの書き方については後述)
なんかとっても良い感じで出てきたのでにっこり。
もちろん、カメさん、歩きます。
原因調査:
・・とはいっても気持ち悪いので、原因を調べることに。
友人に聞くのが早いかな・・と思ったので
いつもいろいろとお世話になっている、あたがわさんに聞いてみることに。
そうしましたらさくっと、
「RA は /64 限定ですよ!」 と。
まじすか・・! ということで RFC を当たってみることに。
参考にしましたのは下記の2つ。
RFC 4862 : IPv6 Stateless Address Autoconfiguration
http://tools.ietf.org/rfc/rfc4862.txt
RFC 4291 : IP Version 6 Addressing Architecture
http://tools.ietf.org/rfc/rfc4291.txt
まず、RFC 4862 の 5.5.3 “Router Advertisement Processing” を見てみますと、
こんな感じでアドレスが設定されますよ、と書いてあります。
でもって、次に RFC 4291 の 2.5.1 “Interface Identifiers” を見てみますと、
For all unicast addresses, except those that start with the binary value 000, Interface IDs are required to be 64 bits long and to be constructed in Modified EUI-64 format.
すべてのユニキャストアドレス(ネットワーク内においてただ一つの特定ノードを指すアドレスのこと)は、b000 (2進数表記) で始まるもの以外のアドレスの Interface ID は、すべて 64bit 長の “Modified EUI-64” 形式で表現される必要がある。
ということで。(訳はものすごく適当です。)
ここから考えるに、まず RFC 4862 5.5.3 の図に照らし合わせると、
N は N=64 である必要があって、 “Link prefix” は残った分 (64bit) になるということが読めます。
(※ RA の場合のみ。 DHCPv6 で割り当てる場合は、もちろん自由に設定できます。。)
このことから、先ほど上の方に書いたような、 /64 ではないプレフィックスを持った
RA が飛んできても、今のところ RFC と比較した際に誤ったデータであると見ることが出来て、
弾いた、というところが読み取れます。
ただ、上の図に挙げたように、
/64 でないプレフィックスの RA を飛ばすことが出来ているところから、
もしかすると /64 でないアドレスの配信も行えるようになるんですかね・・んー。
そういえば:
最初の部分のラストで、
ipv6 prefix 2 dhcp-prefix@pp2:1100::/64
ipv6 lan1/1 address dhcp-prefix@pp2:1100::1/64
ipv6 lan1/1 rtadv send 1 o_flag=on
こんな感じで設定を書きましたが、
ipv6 prefix 2 dhcp-prefix@pp2:11::/64
とかでも動くのでは、と思う方結構いると思うんです。でも動かないんです。。
今回のケースだと、プロバイダーから振ってくるアドレスは /56 でした。
IPv6 は 16バイト毎に “:” で区切って表現しますが、
今回の場合はすでに 56 バイト分指定されていますので、
xxxx:xxxx:xxxx:xxoo:oooo:oooo:oooo:oooo
こんな感じ ( o が指定できる場所 ) になります。
また、IPv6 のアドレスでは、高い位の 0 は省略できる事になっています。
(数学や算数での数字の表現と一緒です。)
つまり、 1234:56:7::1 は、 1234:0056:0007:0000:0000:0000:0000:0001 と同値です。
・・・たぶんヤマハルータ内の処理プログラムのバグのような気がするのですが
ipv6 prefix 2 dhcp-prefix@pp2:11::/64
と書いた場合に一度、 dhcp-prefix@pp2:0011::/64 として展開されるようで、
:xxxx:xxoo:oooo:: の部分に :xxxx:xx00:11oo:: として当てはめられて、
/64 ですから、 :xxxx:xx00:oooo:: として配信されてしまうようです。
(解析等はしていませんので、何とも言えませんが・・。
一方で、
ipv6 prefix 2 dhcp-prefix@pp2:1100::/64
と書きますと、
:xxxx:xxoo:oooo:: の部分に :xxxx:xx11:00oo:: として当てはめられて、
/64 ですから、 :xxxx:xx11:oooo:: として配信される、と。そういう感じ。
・・・ちょっとヤマハさんの中の人に聞いてみようかなぁと思ったのですが、
どうやら明日から夏期休業らしく・・。どこかで聞いてみよう・・。