IPv6について、すぐ忘れるのでまとめる
基本
128ビット(16バイト)。::は0が連続していることを表す。
2byte:2byte:2byte:2byte:2byte:2byte:2byte:2byte で表す。
ex: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
(ffff:ffff:ffff:ffff:ffff:ffff:ffff:a)のように、2byte部分はデータ列というより数値と考えて良いみたい。つまり、勝手に先頭は0埋めしてくれる。自分で0埋めしてもよい。
リンクローカルアドレス
同じリンク上で使うアドレス。FE80::/10で始まるらしい。
FE 80 = 11111110 10000000 だと思うので、最初の10bitは、11111110 10 のこと。
例えば、FE80::1など。各インターフェイスでユニークになるように、通常はMACアドレスや他のインターフェイス識別子から自動生成される。
なお、1つのマシンが複数のリンクに参加している時、自身の利用するインターフェースを%で指定して、外部のマシンのリンクローカルアドレスを参照する。例えば、FE80::10%eth0は、FE80::10のアドレスであり、自身のeth0が属しているリンクアドレスを指す(IPv4においては、サブネットがあるので、宛先アドレスと自身の各インターフェースの与えられたサブネットとを突き合わせて、どのインターフェースかが定まる。リンクローカルアドレスは、サブネットの概念がない(/10はあるが、これ以上はさらに細かく区切らない)ので、これが必要らしい)
手元のマシンで見たら、fe80::a4c2:2cf2:61ae:5db/64と書かれていた。また、同じリンク間でping6してみたら、相手のリンクローカルアドレス%<インターフェース名>の%以降のところを省略したら通信できなかった。厳密みたい(嘘。ip routeで見て、fe80::/60のルーティング行が3つあり、そのうちで一番優先度の高いものはdocker0だったため、docker0インターフェースがデフォルトで選ばれていたためだった。実際、%docker0についてだけはインターフェースを省略できた)
同じリンクに含まれるリンクローカルアドレスの一覧を得るには、下記コマンドを打つ。FF02::1は、全てのリンクローカルアドレスへのマルチキャストアドレスのよう。
ping6 ff02::1%<インターフェース名>
<コラム>
ユニキャストアドレス
グローバルユニキャストアドレス
インターネット上で一意に割り当てられるアドレス。
範囲: 2000::/3(0x20=00100000なので、001で始まるものということ)
開始と終端: 2000::と3fff::ffff::ffff::ffff::ffff::ffff::ffff::ffff。
例: 2404:6800:4004:825::200e(google.com)
リンクローカルアドレス
同じリンク(セグメント)内で通信するためのアドレス。
範囲: FE80::/10
例: FE80::1%eth0
自動的に割り当てられ、必ず存在する。ルーターを超える通信には使用されない。
ユニークローカルアドレス (Unique Local Address, ULA)
プライベートネットワーク内で使用するアドレス(IPv4のプライベートアドレスに相当)。
範囲: FC00::/7(通常はFD00::/8が使われるらしい)
例: FD00:abcd::1
グローバルにはルーティングされない。
マルチキャストアドレス
FF00::/8 マルチキャストアドレス
次の8bitはスコープを表す。
スコープの例:
02(つまり、FF02::/16 ) リンクローカル
0E グローバル
ループバックアドレス
::1/128 つまり、000...001のみ。
デフォルトゲートウェイを知るには
ip -6 route
2400:2411:3ec4:bd01::/64 dev enx6c1ff71a06b4 proto ra metric 100 pref medium
fe80::/64 dev docker0 proto kernel metric 256 pref medium
fe80::/64 dev vetha7dbd4e proto kernel metric 256 pref medium
fe80::/64 dev enx6c1ff71a06b4 proto kernel metric 1024 pref medium
default via fe80::1e7c:98ff:fe13:5420 dev enx6c1ff71a06b4 proto ra metric 100 pref medium
ここで、1行目について、RAという仕組みがあるらしいので調べた。
Router Advertisementとは
- 送信者: IPv6対応ルーター
- 受信者: IPv6クライアントデバイス(ホスト)
内容: 以下のような情報を提供する。
- ネットワークプレフィックス
ホストが自身のIPv6アドレスを生成するためのプレフィックス情報(例: /64)。 - デフォルトゲートウェイの情報
ルーターのリンクローカルアドレス(例: fe80::1)。
ルーターパラメータ
ルーターの有効期限や優先度。 - その他オプション
MTU(最大転送単位)。
DNSサーバーアドレス(RFC 6106)。
RAメッセージの仕組み
-
ルーターからの送信
IPv6対応ルーターは、定期的にまたはホストからのリクエストに応じて、RAメッセージを送信する。送信先アドレスはリンクローカルマルチキャストアドレス FF02::1(リンク内の全ノード)である。 -
ホスト側での処理
ホストはRAを受信すると、その内容に基づいて以下を設定する:
IPv6アドレスの自動生成(SLAAC: Stateless Address Autoconfiguration)
RAメッセージに含まれるプレフィックス情報を使用して、インターフェースIDを付加し、自身のIPv6アドレスを生成する。
- デフォルトゲートウェイの設定
RAに含まれるルーターのリンクローカルアドレスをデフォルトゲートウェイとして設定する。 - ルートエントリの追加
ネットワークプレフィックスを基に適切なルートエントリを作成する。 - ホストからのリクエスト
必要に応じて、ホストは Router Solicitation (RS) メッセージを送信し、RAを要求することができる。ルーターがこれに応答してRAを送信することで、ネットワーク情報がホストに提供される。
NDP(Neighbor Discovery Protocol)
IPv4のARPに代わって、Neighbor Discovery Protocolを利用する。
ARPはIPv4アドレスからMACアドレスへの変換を行なうプロトコルだったが、NDPは同様にIPv6からMACアドレスへの変換を行う。さらに他にも、近隣キャッシュ管理、自動アドレス設定(SLAAC)、デフォルトゲートウェイの検出、重複アドレス検出 (DAD)、ルータープレフィックス学習などを行うらしい。
ARP相当CLIコマンド: ip -6 neighbor
デフォルトゲートウェイを、MACアドレスから探す方法
ip -6 route | grep default