3-13 IPv6 アドレス体系 — 表記・種別・複数アドレス
IPv6 アドレスの 128 ビット構造、アドレス種別 (GUA / LLA / ULA / anycast)、1 インタフェースが複数アドレスを持つ IPv4 との違いを整理する。CML2.9 IOS-XE 17.x の show ipv6 interface で実機確認する。
1. 前節の振り返りと本節の内容
3-3 から 3-12 まで、第 3 章では IPv4 を前提に経路制御と冗長化を扱ってきました。距離ベクトル型とリンクステート型の IGP (Interior Gateway Protocol)、パスベクトル型の BGP (Border Gateway Protocol)、プロトコル間の再配送、route-map によるルーティングポリシー、そして FHRP (First Hop Redundancy Protocol) によるデフォルトゲートウェイ冗長化まで、アドレスはすべて IPv4 でした。
本節 3-13 からは IPv6 に視点を移します。IPv6 は「アドレスが長くなった IPv4」ではなく、アドレスの表記・種別・スコープ・自動設定の仕組みが IPv4 と大きく異なります。IPv6 の扱いは内容が広いため、3 節に分けます。本節 3-13 が IPv6 アドレス体系 (表記・種別・プレフィックス・複数アドレス)、3-14 が NDP (Neighbor Discovery Protocol) と SLAAC (StateLess Address AutoConfiguration)、3-15 が OSPFv3 / MP-BGP (Multiprotocol BGP) による IPv6 ルーティングです。
実機検証では、CML2.9 IOS-XE 17.x の R1 / R2 に各種別の IPv6 アドレス (GUA / ULA / anycast) を設定し、LLA を ipv6 enable で自動生成させます。show ipv6 interface / show ipv6 route / show ipv6 neighbors の出力を引用し、1 つのインタフェースが複数のアドレスを持つ様子・アドレス種別とスコープの差・ルーティングテーブルの connected / local の区別を裏付けます。NDP / SLAAC は LLA の自動生成や neighbor 表への出現という結果だけ示し、仕組みの詳細は 3-14 へ送ります。
2. IPv6 アドレスの構造 — 128 ビットと表記の省略規則
IPv6 アドレスは、128 ビットの値を 16 ビットずつ 8 つのグループに区切り、各グループを 16 進数で : (コロン) 区切りで表記します。IPv4 が 32 ビットを 8 ビットずつ 4 つに区切って 10 進数で書く (192.168.1.1) のに対し、IPv6 は 16 進数 4 桁 × 8 グループになります。完全表記では、たとえば 2001:0db8:0000:0013:0000:0000:0000:0001 のように 32 桁の 16 進数で表されます。
このままでは長いため、IPv6 には 2 つの省略規則があります。1 つ目は、各グループの先頭にある 0 を省略できる規則です。0db8 は db8、0013 は 13、0001 は 1 と書けます。これにより 2001:0db8:0000:0013:0000:0000:0000:0001 は 2001:db8:0:13:0:0:0:1 まで短くなります。
2 つ目は、連続する 0 のグループを :: (ダブルコロン) で圧縮できる規則です。先ほどの例の 0:0:0 の部分 (16 進では 0000:0000:0000) を :: に置き換えると、2001:db8:0:13::1 になります。ただし :: はアドレス内で 1 回しか使えません。2 回使うと省略された 0 の個数が一意に決まらなくなるためです。これらの省略規則を適用した最終的な表記が 2001:db8:0:13::1 で、本節ではこの圧縮表記に統一します。
IPv6 アドレスのうち、どこまでがネットワークを識別する部分かは、IPv4 と同様にプレフィックス長で示します。2001:db8:0:13::1/64 の /64 は、先頭 64 ビットがネットワーク部 (プレフィックス)、残り 64 ビットがホストを識別するインタフェース ID (IID = Interface ID) であることを意味します。IPv4 のサブネットマスクに相当する考え方で、IPv6 では /64 が基本単位になります。アドレスの構造と省略規則は以下のとおりです。
3. 本ラボのトポロジ — R1/R2 に各種別のアドレスを設定
検証ラボは、2001:db8:0:13::/64 という 1 つの IPv6 セグメント上に R1 と R2 の 2 台のルータを置き、その下に観察用の HOST を 1 台ぶら下げる最小構成です。アドレス種別を 1 つのラボで網羅するため、R1 / R2 の GigabitEthernet2 には GUA (Global Unicast Address) / ULA (Unique Local Address) / anycast を意図的に割り当て、LLA (Link-Local Address) は ipv6 enable で自動生成させます。R1 の Loopback0 には GUA を 1 つ設定します。
各ノードに割り当てたアドレスは以下のとおりです。本節で使うアドレスはすべて小文字で表記しますが、後で引用する show 出力では IOS-XE が大文字 (2001:DB8) で表示する点に注意してください。表記の大小は同じアドレスを指します。
| ノード | 種別 | アドレス |
|---|---|---|
| R1 Gi2 | GUA | 2001:db8:0:13::1/64 |
| R1 Gi2 | anycast | 2001:db8:0:13::ffff/64 |
| R1 Gi2 | ULA | fd00:13::1/64 |
| R1 Gi2 | LLA | fe80::5054:ff:fe9a:62 (自動生成) |
| R1 Lo0 | GUA | 2001:db8:0:ffff::1/128 |
| R2 Gi2 | GUA | 2001:db8:0:13::2/64 |
| R2 Gi2 | anycast | 2001:db8:0:13::ffff/64 (R1 と同一) |
| R2 Gi2 | ULA | fd00:13::2/64 |
| R2 Gi2 | LLA | fe80::5054:ff:fe12:ef1f (自動生成) |
| HOST | GUA | 2001:db8:0:13::10/64 (手動) |
ここで使う GUA 2001:db8:0:13::1 のプレフィックス 2001:db8::/32 は、RFC 3849 で文書記述用に予約された GUA 範囲です。GUA 全体の範囲 2000::/3 に含まれるため、種別としてはグローバルユニキャストです。トポロジ全体は以下のとおりです。
R1 の GigabitEthernet2 の実機 running-config は以下のとおりです。ipv6 address が 3 つ並び、ipv6 enable で LLA が自動生成される構成です。
interface GigabitEthernet2
description IPv6 segment 2001:db8:0:13::/64
no ip address
negotiation auto
ipv6 address 2001:DB8:0:13::1/64
ipv6 address 2001:DB8:0:13::FFFF/64 anycast
ipv6 address FD00:13::1/64
ipv6 enable
no mop enabled
no mop sysid
end加えて、ルータが IPv6 パケットを転送し RA (Router Advertisement) を送出するために、両ルータには ipv6 unicast-routing をグローバルに設定しています。ipv6 enable がインタフェースに LLA を付けるのに対し、ipv6 unicast-routing は転送と RA 送出を有効にするコマンドで、両者は別の役割です。この差は §10 で改めて整理します。
4. プレフィックスとインタフェース ID — /64 が基本
IPv6 アドレスは、先頭側のネットワーク部 (プレフィックス) と、後半のインタフェース ID (IID) の 2 つの部分で構成されます。2001:db8:0:13::1/64 であれば、先頭 64 ビット 2001:db8:0:13 がプレフィックス、残り 64 ビット ::1 (完全には 0:0:0:1) が IID です。IPv6 では /64 を基本単位とし、1 つのセグメントに /64 を割り当てるのが標準です。これは次節 3-14 で扱う SLAAC が /64 を前提とするためでもあります。
IID は手動で設定することも、自動生成させることもできます。LLA の場合、IOS-XE は IID を MAC アドレスから EUI-64 (Extended Unique Identifier 64) という規則で生成します。R1 の MAC アドレス 5254.009a.0062 から LLA が生成される流れは、次の 3 段階です。
- MAC
52:54:00:9a:00:62の先頭オクテット52の U/L ビット (上位から 7 番目のビット) を反転します。0x52 ^ 0x02 = 0x50で、先頭が50に変わります。 - MAC の中央 (上位 3 オクテットと下位 3 オクテットの間) に
ff:feを挿入し、64 ビットの IID5054:00ff:fe9a:0062を作ります。 - プレフィックス
fe80::/64と IID を結合し、省略表記にすると LLA はfe80::5054:ff:fe9a:62になります。
実機でも、MAC アドレスから生成された LLA がこのとおりになっていることを確認できます。show interface で取得した MAC 5254.009a.0062 と、show ipv6 interface の link-local address を並べると、EUI-64 で計算した fe80::5054:ff:fe9a:62 と一致します。
show interface GigabitEthernet2 | include address
Hardware is CSR vNIC, address is 5254.009a.0062 (bia 5254.009a.0062)
R1#show ipv6 interface GigabitEthernet2 | include link-local
IPv6 is enabled, link-local address is FE80::5054:FF:FE9A:62
No Virtual link-local address(es):EUI-64 の詳細は次節 3-14 (NDP + SLAAC) で扱うため、本節では LLA の出所として生成規則を 1 段だけ示すにとどめます。重要なのは、ipv6 enable を設定するだけで、MAC アドレスから LLA が自動的に付与されるという点です。
5. アドレスの種別 — GUA / LLA / ULA
IPv6 のユニキャストアドレスは、アドレス先頭のプレフィックスによって種別とスコープ (到達できる範囲) が決まります。IPv4 でグローバルアドレスとプライベートアドレスを範囲で区別したのと同様に、IPv6 でも先頭ビットを見れば種別が判別できます。主なユニキャスト種別は、GUA / LLA / ULA の 3 つです。
GUA (Global Unicast Address) は、インターネット全体で一意なアドレスで、範囲は 2000::/3 です。IPv4 のグローバルアドレスに相当し、リンクを越えてインターネット全体に到達できるグローバルスコープを持ちます。本ラボの 2001:db8:0:13::1 は、文書記述用に予約された 2001:db8::/32 (RFC 3849) ですが、2000::/3 に含まれるため種別は GUA です。
LLA (Link-Local Address) は、同一リンク内でのみ有効なアドレスで、範囲は fe80::/10 です。ipv6 enable で自動生成され、リンクを越えられないリンクローカルスコープを持ちます。LLA は NDP の近隣探索や、ルーティングプロトコルがネクストホップを指す際に使われ、IPv6 では IPv4 にない重要な役割を担います。LLA のスコープは §6 で実機検証します。
ULA (Unique Local Address) は、ローカル通信用に予約された範囲 fc00::/7 のアドレスです。IPv4 のプライベートアドレス (10.0.0.0/8 など) に相当する位置づけで、サイト境界でインターネットへ広告・漏洩させない運用にして使います。ここで 1 点正確に区別したいのは、ULA の formal な IPv6 scope は global だという点です (Linux の出力でも ULA は scope global と表示されます)。「組織内のみ」というのは到達範囲を境界フィルタで絞る運用上の話であって、LLA の link-local のようにプロトコル上 scope が制限されているわけではありません。RFC 4193 は fc00::/7 のうち L ビットを 1 にした fd00::/8 を実用範囲とし、グローバルに一意となるよう乱数でプレフィックスを作る形式を定めており、本ラボの fd00:13::1 もこの範囲です。アドレス種別とスコープの対応は以下のとおりです。
このほかに、用途が決まった特別なアドレスが 2 つあります。loopback アドレス ::1/128 は自ノードを指し、IPv4 の 127.0.0.1 に相当します。unspecified アドレス ::/128 はアドレスが未定であることを示し、後述の DAD (Duplicate Address Detection) で送信元として使われます。マルチキャスト ff00::/8 は §7 で扱います。
6. リンクローカルアドレスのスコープ — リンクを越えない
LLA のスコープは、同一リンク内に限られます。GUA がルーティングによってリンクを越えて到達できるのに対し、LLA は fe80::/10 の範囲が常にそのリンク内だけで意味を持ちます。同じ fe80::... というアドレスが別々のリンクに存在しうるため、LLA だけでは「どのリンクの相手か」が一意に決まりません。
この差は、ルータから LLA へ ping を打つときに表面化します。R2 の LLA fe80::5054:ff:fe12:ef1f へ ping を実行すると、宛先 LLA だけでは出力リンクが決まらないため、IOS-XE は Output Interface: を尋ねます。GigabitEthernet2 を指定すると、送信元アドレスに %GigabitEthernet2 というゾーン ID が付き、!!!!! で 100% 成功します。出力は以下のとおりです。
ping FE80::5054:FF:FE12:EF1F
Output Interface: GigabitEthernet2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to FE80::5054:FF:FE12:EF1F, timeout is 2 seconds:
Packet sent with a source address of FE80::5054:FF:FE9A:62%GigabitEthernet2
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 msこれに対し、GUA への ping では出力インタフェースの指定が不要です。R2 の GUA 2001:db8:0:13::2 へ ping を打つと、出力 IF を尋ねられることなく即座に !!!!! で成功します。GUA はルーティングテーブルに従って到達先が決まるため、宛先アドレスだけで送信できるスコープの差です。
ping 2001:DB8:0:13::2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:DB8:0:13::2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 msLLA の ping で相手のアドレスが解決されると、その結果が neighbor 表に記録されます。show ipv6 neighbors を見ると、R2 の GUA 2001:db8:0:13::2 と LLA fe80::5054:ff:fe12:ef1f が、それぞれ R2 の MAC 5254.0012.ef1f に対応付けられて現れます。これは NDP がアドレスを解決した証跡で、IPv4 の ARP テーブルに相当します。
show ipv6 neighbors
IPv6 Address Age Link-layer Addr State Interface
2001:DB8:0:13::2 0 5254.0012.ef1f REACH Gi2
2001:DB8:0:13:5054:FF:FE86:F81D 93 5254.0086.f81d STALE Gi2
FE80::5054:FF:FE12:EF1F 0 5254.0012.ef1f REACH Gi2
FE80::5054:FF:FE86:F81D 93 5254.0086.f81d STALE Gi2neighbor 表に現れるのは「アドレスが実在し、NDP で解決された」という事実です。NDP の NS / NA (Neighbor Solicitation / Advertisement) というメッセージの中身や状態遷移 (REACH / STALE / DELAY) の仕組みは、次節 3-14 の主題なので、本節では neighbor 表にアドレスが並ぶ結果のみを示します。スコープの差は以下のとおりです。
7. マルチキャストと anycast — IPv6 にブロードキャストは無い
IPv6 には、IPv4 にあったブロードキャストが存在しません。「同一セグメント上の全員へ送る」通信は、IPv6 ではすべてマルチキャストで代替します。マルチキャストアドレスは ff00::/8 で、先頭が ff で始まります。よく使うものに、リンク内の全ノードを指す ff02::1 (all-nodes) と、リンク内の全ルータを指す ff02::2 (all-routers) があります。
ルータが参加しているマルチキャストグループは、show ipv6 interface の “Joined group address(es)” に現れます。R1 の Gi2 を見ると、ff02::1 (全ノード) と ff02::2 (全ルータ、ipv6 unicast-routing が有効なため) に加え、各ユニキャストアドレスごとに対応する solicited-node マルチキャスト に参加していることが分かります。ff02::1:ff00:1 は GUA ::1 の、ff02::1:ff00:ffff は anycast ::ffff の、ff02::1:ff9a:62 は LLA ...9a:62 の solicited-node です。これらは各ユニキャストアドレスの下位 24 ビットから自動算出されます。
show ipv6 interface GigabitEthernet2
GigabitEthernet2 is up, line protocol is up
IPv6 is enabled, link-local address is FE80::5054:FF:FE9A:62
No Virtual link-local address(es):
Description: IPv6 segment 2001:db8:0:13::/64
Global unicast address(es):
2001:DB8:0:13::1, subnet is 2001:DB8:0:13::/64
2001:DB8:0:13::FFFF, subnet is 2001:DB8:0:13::/64 [ANY]
FD00:13::1, subnet is FD00:13::/64
Joined group address(es):
FF02::1
FF02::2
FF02::1:FF00:1
FF02::1:FF00:FFFF
FF02::1:FF9A:62solicited-node マルチキャストは NDP のアドレス解決で使われます。その仕組みも次節 3-14 の主題なので、本節では「アドレスごとに対応する solicited-node に自動参加する」事実を確認するにとどめます。
上の出力には、もう 1 つの種別である anycast が現れています。anycast は、同一のアドレスを複数のノードが持ち、送信側から最も近い 1 台に届く仕組みです。本ラボでは R1 と R2 の両方に同じ 2001:db8:0:13::ffff を anycast キーワード付きで設定しています。show ipv6 interface では、このアドレスに [ANY] マークが付いて anycast として認識されていることが分かります。R1 / R2 のどちらの出力でも、2001:DB8:0:13::FFFF, subnet is 2001:DB8:0:13::/64 [ANY] と表示されます。
通常のユニキャストアドレスを 2 台に重複して設定すると DAD (重複アドレス検出) で衝突しますが、anycast キーワードを付けた場合は重複が許され、複数ノードが同じアドレスを共有します。HOST から anycast アドレス 2001:db8:0:13::ffff へ ping すると、応答するのはそのアドレスを持つ 2 台のうち 1 台です。本ラボでは R2 (2001:db8:0:13::2) が応答しました。
HOST:~$ ping6 -c 3 2001:db8:0:13::ffff
PING 2001:db8:0:13::ffff (2001:db8:0:13::ffff): 56 data bytes
64 bytes from 2001:db8:0:13::2: seq=0 ttl=64 time=40.418 ms
64 bytes from 2001:db8:0:13::2: seq=1 ttl=64 time=1.269 ms
64 bytes from 2001:db8:0:13::2: seq=2 ttl=64 time=0.832 ms
--- 2001:db8:0:13::ffff ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.832/14.173/40.418 ms宛先は anycast の ::ffff ですが、応答元は 2001:db8:0:13::2 (R2) です。本ラボでは R1 / R2 が同一リンク上で等距離のため「最も近い 1 台」は構成に依存し、ここでは R2 が応答しました。実運用では、anycast は地理的に分散した同一サービス (DNS ルートサーバなど) に同じアドレスを割り当て、利用者を最寄りのサーバへ誘導する用途で使われます。
8. 1 つのインタフェースが複数のアドレスを持つ
IPv6 で IPv4 と最も異なる点の 1 つが、1 つのインタフェースが複数のアドレスを同時に持つのが普通である点です。IPv4 では 1 つのインタフェースに primary IP を 1 つ持つのが基本で、secondary を足すことはできても日常的ではありませんでした。IPv6 では、LLA を 1 つ必ず持ち、それに加えて GUA / ULA / anycast を複数併せ持ちます。
実機の show ipv6 interface brief を見ると、R1 の GigabitEthernet2 が 1 つのインタフェースの下に 4 つのアドレスを列挙していることが分かります。LLA fe80::5054:ff:fe9a:62、GUA 2001:db8:0:13::1、anycast 2001:db8:0:13::ffff、ULA fd00:13::1 がすべて同じインタフェースに属します。Loopback0 も同様に LLA と GUA を持ちます。
show ipv6 interface brief
GigabitEthernet1 [up/up]
unassigned
GigabitEthernet2 [up/up]
FE80::5054:FF:FE9A:62
2001:DB8:0:13::1
2001:DB8:0:13::FFFF
FD00:13::1
Loopback0 [up/up]
FE80::21E:BDFF:FE9F:7800
2001:DB8:0:FFFF::1この LLA は、ipv6 address を 1 つも設定しなくても ipv6 enable だけで自動的に付きます。GUA / ULA / anycast を設定した場合も、LLA はそれらとは独立に自動生成され、すべてが共存します。show ipv6 interface の詳細表示では、link-local address が 1 行、Global unicast address(es) に GUA / anycast / ULA が並ぶという構造で表示されます。複数アドレスの併存は以下のとおりです。
複数アドレスの併存は、HOST 側でも観察できます。HOST には手動で GUA 2001:db8:0:13::10 を 1 つ設定しただけですが、ip -6 addr show を見ると 4 つのアドレスが付いています。手動の GUA ::10 に加え、ルータの RA を受けて SLAAC で自動取得した GUA 2001:db8:0:13:5054:ff:fe86:f81d と ULA fd00:13::5054:ff:fe86:f81d (どちらも scope global dynamic)、そして LLA fe80::5054:ff:fe86:f81d (scope link) です。
HOST:~$ ip -6 addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 fd00:13::5054:ff:fe86:f81d/64 scope global dynamic flags 100
valid_lft 2591978sec preferred_lft 604778sec
inet6 2001:db8:0:13:5054:ff:fe86:f81d/64 scope global dynamic flags 100
valid_lft 2591978sec preferred_lft 604778sec
inet6 2001:db8:0:13::10/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe86:f81d/64 scope link
valid_lft forever preferred_lft foreverHOST が手動設定なしに GUA / ULA を自動取得したのは、ルータが送る RA を受けて SLAAC が動いた結果です。SLAAC の仕組み (RA の中身・EUI-64 によるアドレス生成・DHCPv6 との対比) は次節 3-14 の主題です。本節では、これも「1 つのインタフェースが複数アドレスを持つ」実例として扱い、SLAAC の詳細は 3-14 へ送ります。
9. IPv6 のルーティングテーブル — connected と local
IPv6 のルーティングテーブルは show ipv6 route で確認します。IPv4 の show ip route と同様に、各経路の先頭にコードが付きます。directly connected を示す C (Connected) と、自分宛を示す L (Local) が基本で、IPv6 ではこの 2 つの区別がより明確に現れます。R1 の show ipv6 route は以下のとおりです。
show ipv6 route
IPv6 Routing Table - default - 7 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
B - BGP, R - RIP, H - NHRP, I1 - ISIS L1
I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary, D - EIGRP
EX - EIGRP external, ND - ND Default, NDp - ND Prefix, DCE - Destination
NDr - Redirect, RL - RPL, O - OSPF Intra, OI - OSPF Inter
OE1 - OSPF ext 1, OE2 - OSPF ext 2, ON1 - OSPF NSSA ext 1
ON2 - OSPF NSSA ext 2, la - LISP alt, lr - LISP site-registrations
ld - LISP dyn-eid, lA - LISP away, le - LISP extranet-policy
lp - LISP publications, a - Application, m - OMP
C 2001:DB8:0:13::/64 [0/0]
via GigabitEthernet2, directly connected
L 2001:DB8:0:13::1/128 [0/0]
via GigabitEthernet2, receive
L 2001:DB8:0:13::FFFF/128 [0/0]
via GigabitEthernet2, receive
LC 2001:DB8:0:FFFF::1/128 [0/0]
via Loopback0, receive
C FD00:13::/64 [0/0]
via GigabitEthernet2, directly connected
L FD00:13::1/128 [0/0]
via GigabitEthernet2, receive
L FF00::/8 [0/0]
via Null0, receiveこの出力は、1 つのインタフェースに付いた IPv6 アドレスがルーティングテーブルにどう現れるかを示します。C 2001:DB8:0:13::/64 が directly connected の プレフィックス全体 (/64) で、転送に使うネットワーク経路です。L 2001:DB8:0:13::1/128 が自分宛の ホスト経路 (/128) で、receive (自ノードで受信) を意味します。1 つのインタフェースの GUA から、/64 の connected 経路と /128 の local 経路が併存する点が、IPv4 のルーティングテーブルとの対比になります。anycast ::ffff も local /128 で受信され、ULA fd00:13::/64 も同じく connected として現れます。
Loopback0 の GUA だけは、C でも L でもなく LC (Local + Connected の統合コード) という 1 行で表示されます。物理インタフェースの GUA が C (/64) と L (/128) の 2 行に分かれるのに対し、Loopback の /128 は LC の 1 行にまとまります。これは IOS-XE の表示上の挙動で、教科書が C / L を分けて説明するのとは異なります。末尾の L FF00::/8 via Null0, receive は、マルチキャスト (ff00::/8) を受信するためのレンジで、IPv4 RIB には現れない IPv6 固有のエントリです。
10. 落とし穴・補足
本節で押さえておきたい論点と、教科書 / ツールの挙動との差を 5 件まとめます。3-3〜3-12 と同じ「正直記録」枠で、CML2.9 IOS-XE 17.x (csr1000v) の実装の振る舞いと python での検算を優先します。
落とし穴 1: 2001:db8::/32 は GUA だが、ツールは private 判定することがある
文書記述用に予約された 2001:db8::/32 (RFC 3849) は、2000::/3 に含まれる GUA です。一方、Python の ipaddress ライブラリで 2001:db8::1 を判定すると、is_global が False、is_private が True を返します。これは、このライブラリがドキュメント用予約を「インターネットで使えないアドレス」と分類するためで、種別としての GUA / ULA の区別とは別の観点です。
種別を判定するときは、ツールの is_global のような flag を鵜呑みにせず、範囲 (2000::/3 に含まれるか) で判断するのが確実です。実際、2001:db8::1 in 2000::/3 は True であり、種別は GUA です。本節でアドレスの種別を断定する際は、この範囲を根拠にしています。
落とし穴 2: 1 インタフェースが複数アドレスを持つのが当たり前
IPv4 の「1 インタフェース 1 primary IP」という感覚で show ipv6 interface を見ると、LLA + GUA + ULA + anycast の 4 つが並んで戸惑うかもしれません。IPv6 ではこれが正常な状態です (§8)。LLA は ipv6 enable で必ず 1 つ付き、GUA / ULA / anycast は設定した数だけ追加されます。さらに HOST のように SLAAC が動く環境では、手動設定したつもりがないアドレスまで自動で増えます。アドレスの数が多いこと自体は異常ではなく、それぞれの種別とスコープを区別して読むことが重要です。
落とし穴 3: LLA はリンクローカルスコープで出力 IF 指定が要る
LLA fe80::... へ ping するときに Output Interface: を尋ねられるのは、エラーではありません (§6)。同じ fe80:: のアドレスが複数のリンクに存在しうるため、「どのリンクの相手か」を出力インタフェースで明示する必要があるからです。これに対し GUA はルーティングテーブルで到達先が決まるため、宛先アドレスだけで送信できます。LLA を指定するときは、fe80::5054:ff:fe12:ef1f%GigabitEthernet2 のように % でゾーン ID を付けるか、ping 対話で出力インタフェースを答えます。「LLA に ping が通らない」と感じたら、まず出力 IF の指定漏れを疑うのが切り分けの近道です。
落とし穴 4: ipv6 enable と ipv6 unicast-routing は別の役割
ipv6 enable はインタフェースに LLA を生成し、そのインタフェースで IPv6 を有効にするコマンドです。これに対し ipv6 unicast-routing はグローバル設定で、ルータが IPv6 パケットを転送し、RA を送出することを有効にします。両者は別の役割で、ipv6 enable だけでは LLA は付きますが、ルータとしての転送や RA 送出は動きません。
本ラボで HOST が SLAAC で GUA / ULA を自動取得できたのは、ルータ側で ipv6 unicast-routing が有効になっていて RA が送出されていたためです。show ipv6 interface の ND router advertisements are sent every 200 seconds がその証跡です。「アドレスは付いているのに通信できない」「ホストがアドレスを自動取得しない」という切り分けでは、この 2 つのコマンドの役割の違いが効きます。
落とし穴 5: Loopback の RIB コードは LC で統合表示され、anycast は [ANY] マークが付く
show ipv6 route の表示には、実機固有の挙動が 2 つあります。1 つは、Loopback の /128 が C / L に分かれず、LC (Local + Connected) という 1 行で統合表示される点です (§9)。物理インタフェースの GUA は C (/64) と L (/128) の 2 行に分かれるため、Loopback だけ表示が異なることに注意します。
もう 1 つは、anycast アドレスの判別です。同一アドレスを複数ノードに設定する anycast は、設定上は通常のユニキャストと anycast キーワードの有無しか違いません。show ipv6 interface では、anycast に [ANY] マークが付くことで通常のユニキャストと区別できます (§7)。本ラボで R1 / R2 の両方に 2001:db8:0:13::ffff を設定しても、両者とも [ANY] 付きで表示され、DAD が衝突として扱わないことを実機で確認しました。
11. 次節
本節 3-13 では、IPv6 のアドレス体系を扱いました。128 ビットを 16 進数 8 グループで表記し、先頭 0 の省略と連続 0 の :: 圧縮で短く書くこと、/64 を基本単位としてプレフィックスとインタフェース ID に分かれること、アドレス種別 (GUA / LLA / ULA / マルチキャスト / anycast と loopback ::1 / unspecified ::) が先頭プレフィックスで決まること、そして 1 つのインタフェースが LLA + GUA + ULA + anycast を同時に持つことを、CML2.9 IOS-XE 17.x の show ipv6 interface / show ipv6 route で裏付けました。LLA のリンクローカルスコープ (ping に出力 IF 指定が要る) と GUA の到達性の差、anycast の [ANY] マークも実機で確認しました。
本節では、LLA が自動生成されること・HOST が SLAAC で GUA / ULA を自動取得したこと・neighbor 表にアドレスが現れることを「結果」として示しましたが、その仕組みには立ち入りませんでした。次節 3-14 NDP + SLAAC では、これらの仕組みそのものを扱います。NDP の NS / NA / RS / RA という 4 種類のメッセージ、重複アドレスを検出する DAD、MAC アドレスから IID を作る EUI-64 の詳細、そしてルータの RA を受けてホストがアドレスを自動設定する SLAAC と DHCPv6 との対比を、HOST がアドレスを取得する過程の実機観察とともに見ていきましょう。