IPv6メモ(2/2)
この記事は、ニューノーマル ぴょこりんクラスタ Advent Calendar 2020 のために書いたものです。 このAdvent Calendarが何なのかについては、主催者による紹介記事を見てください。
はじめに
前回は前半3つについて記載した。
今回は最後の1つのIPv6アドレスの自動設定方法のうち、 Stateless address auto configuration(SLAAC)と呼ばれるものについて調べた結果をまとめる。
SLAAC
おおまかな流れ
- リンクローカルアドレスを生成
- Neighbor Solicitationメッセージをリンク内全ノードに送り、被ってないか確認する
- 被ってない場合(Neighbor Advertisementが飛んでこない場合)、リンクローカルアドレスを確定する
- リンクローカルアドレスを用いて、Router Solicitationを全ルータに対してマルチキャストする。
- ルータからRouter Advertisementを受信する。RAには、プレフィックスに関する情報が入っている。
- RAを元にIPv6アドレスを生成する。
- Neighbor Solicitationメッセージを送り、被ってないかを確認する
- IPv6アドレスを確定し、全ノードにNeighbor Advertisementを送る
Neighbor Solicitation
自分のアドレスを通知したり、相手(同じルータに接続されているノード)の アドレスを要求するのに使う。パケットフォーマットは以下。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Target Address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options ... +-+-+-+-+-+-+-+-+-+-+-+-
Neighbor Advertisement
Neighbor Advertisementは、Neighbor Solicitationの応答として送るもの。 パケットフォーマットは以下の通り。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |R|S|O| Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Target Address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options ... +-+-+-+-+-+-+-+-+-+-+-+-
Router Solicitation
Router Solicitationは、ルータに対して送るもの。パケットのフォーマットは以下の通りで、 シンプルなものになっている。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options ... +-+-+-+-+-+-+-+-+-+-+-+-
Router Advertisement(RA)
Router Advertisementは、ルータから送られてくるもの。ルータ以外が送ることは禁止されている。 RSを受け取ったら送るとか、定期的に送るとかしているらしい。 パケットのフォーマットは以下の通りで、 中身の細かいところはさておき、Optionsのなかにサブネットプレフィクスに関する情報が入っている。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Cur Hop Limit |M|O| Reserved | Router Lifetime | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reachable Time | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Retrans Timer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options ... +-+-+-+-+-+-+-+-+-+-+-+-
RA/RS/NS/NAをどうやって受け取るのか?
さて、ここで問題になるのが、RAやNAを受け取ったり、NSやRSを送ることである。
ドコモ光、つまりNTTのネットワークでは、ひかり電話に加入していない限り、サブネットプレフィクスのbit長は64bitになる。インタフェース識別子が64bitなので、NTTのネットワークから直接サブネットプレフィクスをもらう必要がある。 つまり、ルータ配下のコンピュータが直接RA/RS/NA/NSをやり取りできないといけない。だがしかし、NSやRSはリンクローカルアドレスを使うので、普通にやるとルータを越えられないのである。越えないとサブネットプレフィクスが取得できない。困った。
ここで登場するのがND Proxy。これは、RAやNAやNSやRSを中継してくれるものである。EdgeRouter XにはND Proxyが載ってないので、クロスコンパイルして載っける必要がある。とりあえず載っけるとIPv6アドレスが無事生成できるようになる。
まとめ
- SLAACによるIPv6アドレス設定方法がわかった
次は、DHCPv6とかDNSキャッシュサーバアドレスどうやって取得するのとかを調べるかもしれない。 ともかくここまでくればとりあえずインターネットに繋げて、当初の目的は果たせたと思うので、一旦おしまい。
参考文献
- RFC 4861 - Neighbor Discovery for IP version 6 (IPv6)
- Professional IPv6, 小川晃通