はじめに
IPv6はこれまでのIPv4を代替するものなので、それ以外のアプリケーションプロトコル等をほぼそのまま利用できます。 とはいっても、IPv6に関わるプロトコルは非常に広範囲にわたっており、いきなり全てを理解することは困難です。 このポストは、今までIPv4で提供していたサービスをIPv6に対応する際に、どこから始めればよいのか判断する手助けをする事を目標にしています。
このポストをまとめるにあたってProfessional IPv6を参照しています。
IPアドレス体系
表記ルール
IPv6アドレスは128bitの長さを持ちます。 16進数表記されますが、それでも長いので省略表記ルールが定義されています。 代表的なルールは次の通りですがこの他にも細かなルールがRFC5952に定義されています。
- 各16bitフィールドの先頭の連続する0を省略できる
2001:0bd8:11aa:22bb:33cc:44ee:55ff:0006 ↓ 2001:bd8:11aa:22bb:33cc:44ee:55ff:6
- 複数の16bitフィールドに渡って連続する0を::に置き換えできる
2001:0db8:0000:0000:0000:0002:0000:0001 ↓ 2001:0db8::2:0:1
IPv6アドレスはサブネットプレフィックスとインタフェースIDから構成されています。 異なるサブネットプレフィックスを持つインタフェースから送信されたパケットを受け取るためにはIPv4と同じようにルーティングが必要です。
リンクローカルアドレス
リンクローカルアドレスは同一セグメント間で通信するためのアドレスであり、このアドレスから送信されたパケットはルータを通過することが出来ません。
IPv6ネットワークインタフェースには必ずリンクローカルアドレスが割り当てられます。
リンクローカルアドレスの上位10bitはfe80
です。
ユニークローカルアドレス
ユニークローカルアドレスは組織内の複数のサブネットプレフィックス間に渡って通信するためのアドレスです。
IPv4におけるプライベートIPアドレスに該当します。
ユニークローカルアドレスの上位8bitはfd00
です。
グローバル識別子の算出方法はRFC4193 3.2.2 Sample Code for Pseudo-Random Global ID Algorithmに定義されています。
- 現在時刻を64bit NTP形式で取得する
- インタフェース識別子としてEUI-64識別子を取得する
- 1と2を連結してキーを作る
- 連結したキーのSHA1ダイジェストを計算する
- SHA1ダイジェストの最下位40bitをグローバル識別子として利用する
サブネット識別子はその組織内で重複しないように設定する必要があります。 営業部のサブネット識別子がAABBで技術部のサブネット識別子はCCDDのように設定します。
マルチキャストアドレス
IPv6ではIPv4に存在したブロードキャストという仕組みがなくなり、ブロードキャストが担っていた役割をすべてマルチキャストが担うようになりました。
マルチキャストアドレスは先頭8bitがff00
です。
更にマルチキャストが配送されるスコープを以下の通り定義しています。 IPv4におけるブロードキャストは、IPv6ではリンクローカルスコープのマルチキャストが担います。
ff01::0/16 # インタフェースローカル
ff02::0/16 # リンクローカル
ff03::0/16 # レルムローカル
ff04::0/16 # アドミンローカル
ff05::0/16 # サイトローカル
ff08::0/16 # 組織ローカル
ff0e::0/16 # グローバルスコープ
IPアドレスの割り当て
SLAAC
IPv6にはIPアドレスを自動的に設定する機能が組み込まれておりSLAAC(State Less Address Auto Configuration)と呼ばれています。
- EUI-64フォーマットのインタフェースIDを取得する
- インタフェースIDからリンクローカルアドレスを仮設定する
- NAパケットとNSパケットを使ってリンクローカルアドレスが重複していないか確認する
- 重複していなければリンクローカルアドレスを正式採用する
- リンクローカルアドレスを送信元にしてRSパケットをリンクローカルマルチキャストする
- ルーターはRAパケットにプレフィックスとゲートウェイの情報を含めて返信する
- プレフィックスとインタフェースIDからユニキャストアドレスを自動生成する
NSパケットとNAパケット
IPv4においてARPメッセージが担っていた役割を、IPv6ではICMPv6 Neighborメッセージが担っています。 以下のネットワーク構成でNS/NAパケットの挙動を確認していきます。
# ip a s enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:ec:e1:e7 brd ff:ff:ff:ff:ff:ff
inet6 1920:1680::1/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::a550:a30:4e93:50bc/64 scope link
valid_lft forever preferred_lft forever
# ip a s enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:87:f2:d4 brd ff:ff:ff:ff:ff:ff
inet6 1920:1680::2/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::311c:887d:690:b5a6/64 scope link
valid_lft forever preferred_lft forever
# ping -6 1920:1680::1
PING 1920:1680::1(1920:1680::1) 56 data bytes
64 bytes from 1920:1680::1: icmp_seq=1 ttl=64 time=0.941 ms
64 bytes from 1920:1680::1: icmp_seq=2 ttl=64 time=1.02 ms
64 bytes from 1920:1680::1: icmp_seq=3 ttl=64 time=0.952 ms
Neighbor Solicitationパケットはff02::1:ff**:****
宛てに送出されています。
アドレスの末尾24bitはエニーキャストアドレスから算出されており、自分宛のパケットを受け取ったインタフェースはNeighbor Advertisementパケットで応答します。
以下の例はIPv4におけるDHCPのパケットです
NS/NAパケットを利用してDAD (Duplicate address detection)が行われます。 リンクローカルアドレスが重複していた場合はインタフェースのステータスがdadfailedとなり利用できません。
# ip a s enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:87:f2:d4 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.2/24 brd 192.168.0.255 scope global noprefixroute enp0s8
valid_lft forever preferred_lft forever
inet6 1920:1680::1/64 scope global tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::311c:887d:690:b5a6/64 scope link
valid_lft forever preferred_lft forever
NSパケットにNAパケットの応答がなければ、そのアドレスを利用している他のノードが居ないということなので、そのアドレスを継続利用できます。
# ip a s enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:87:f2:d4 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.2/24 brd 192.168.0.255 scope global noprefixroute enp0s8
valid_lft forever preferred_lft forever
inet6 1920:1680::10/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::311c:887d:690:b5a6/64 scope link
valid_lft forever preferred_lft forever
DHCPv6
IPv6ではIPv4におけるDHCPと似たDHCPv6というプロトコルが利用されます。 DHCPv6には大きく分けてステートレスDHCPv6、ステートフルDHCPv6、DHCPv6-PDの3種類の利用形態があります。
- EUI-64フォーマットのインタフェースIDを取得する
- インタフェースIDからリンクローカルアドレスを仮設定する
- Neighbor AdversitementとNeighbor Solicitationパケットを使ってリンクローカルアドレスが重複していないか確認する
- 重複していなければリンクローカルアドレスを正式採用する
- リンクローカルアドレスを送信元にしてRouter Solicitationパケットをリンクローカルマルチキャストする
- ルーターはRouter AdvertisementパケットにManaged address configurationフラグを付けて返信する
- DHCPv6 Solicitパケットをリンクローカルマルチキャストする
- DHCPv6サーバはDHCPv6 Replyメッセージを返信する
- DHCPv6 Information requestパケットをリンクローカルマルチキャストする
- DHCPv6 Replyパケットにユニキャストアドレスやネットワークに付随する情報を含めて返信する
- Neighbor AdvertisementとNeighbor Solicitationパケットを使ってユニキャストアドレスが重複していないか確認する
- 重複していなければユニキャストアドレスを正式採用する