IPv6メモ(2/2)

この記事は、ニューノーマル ぴょこりんクラスタ Advent Calendar 2020 のために書いたものです。 このAdvent Calendarが何なのかについては、主催者による紹介記事を見てください。

はじめに

前回は前半3つについて記載した。

  1. IPv6アドレスの表記法
  2. IPv6アドレスの構造と生成方法
  3. IPv6アドレスの種類
  4. IPv6アドレスの自動設定方法

今回は最後の1つのIPv6アドレスの自動設定方法のうち、 Stateless address auto configuration(SLAAC)と呼ばれるものについて調べた結果をまとめる。

SLAAC

おおまかな流れ

  1. リンクローカルアドレスを生成
  2. Neighbor Solicitationメッセージをリンク内全ノードに送り、被ってないか確認する
  3. 被ってない場合(Neighbor Advertisementが飛んでこない場合)、リンクローカルアドレスを確定する
  4. リンクローカルアドレスを用いて、Router Solicitationを全ルータに対してマルチキャストする。 
  5. ルータからRouter Advertisementを受信する。RAには、プレフィックスに関する情報が入っている。
  6. RAを元にIPv6アドレスを生成する。
  7. Neighbor Solicitationメッセージを送り、被ってないかを確認する
  8. 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キャッシュサーバアドレスどうやって取得するのとかを調べるかもしれない。 ともかくここまでくればとりあえずインターネットに繋げて、当初の目的は果たせたと思うので、一旦おしまい。

参考文献