このページの目次
IPv6 プロトコル
128ビットアドレスがNATの支配を終焉させた――SLAACによる自動設定、簡素化された固定長ヘッダー、ネイティブIPsecサポート。IPv6を理解することは、単に「アドレスが長くなった」ことではなく、その近隣発見およびアドレス自動設定モデルがIPv4と全く異なることを意味する。
概要
IPv6はIPv4の後継プロトコルであり、1998年にRFC 2460で定義され(2017年にRFC 8200へ更新)、128ビットアドレス(43億から3.4×10³⁸へ)、固定40バイトのヘッダー(オプションのオーバーヘッドなし、チェックサムなし)、ネイティブセキュリティ(IPsecサポート)、ステートレスアドレス自動設定(SLAAC)といった核心的な改善が行われた。現在のグローバルなIPv6展開率は約40〜50%だが、モバイルネットワーク(4G/5G)や大規模クラウドプロバイダーでは広く使用されている。移行期は長期化し、Dual-StackやNAT64/DNS64などの併用技術が存在し続ける。
IPv6ヘッダー: 40バイト、固定
0 1 2 3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|Traffic Class| Flow Label |
| (4) | (8 bits) | (20 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
| (16 bits, ≥0) | (8 bits) | (8 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
| (128 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
| (128 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IPv4ヘッダーとの主な違い:
削除された項目:
IHL: なし → ヘッダーは固定40バイト
ヘッダーチェックサム: なし → L2 CRCとL4チェックサムで十分、ホップごとのチェックサム再計算は非効率
Identification/Flags/フラグメントオフセット: なし → エンドポイントでのフラグメンテーション(IPv6におけるPMTUD)
オプション: 拡張ヘッダーへ移動
追加された項目:
Flow Label: 20ビット → フローをマーキング(ECMPハッシュやQoSに主に使用)
Next Header: Protocolに取って代わる → ただし拡張ヘッダーチェーンを指すことも可能
維持された項目:
Traffic Class ≈ DSCP + ECN
Hop Limit ≈ TTL
Flow Label
20ビットの擬似ランダムなマーキングで、送信側によって選択され、同一フロー内のすべてのパケットで同一となる。設計目標は、ルーターやスイッチがL4ポート(IPsec ESPで暗号化されている可能性がある)を解析する必要なく、Flow Labelと送信元/宛先IPのみでフローを区別できるようにすることである。
実装例: Linuxでは skb->hash を使用してランダムなFlow Labelを生成する(net.ipv6.auto_flowlabels=1)— TCP接続ごとに1つ。
Next Headerと拡張ヘッダーチェーン
基本構造:
Next Header = 6 (TCP) → TCPヘッダーを直接指す
拡張ヘッダーチェーン:
IPv6ヘッダー (Next Header=0, Hop-by-Hop)
→ Hop-by-Hop Optionsヘッダー (Next Header=43, Routing)
→ Routingヘッダー (Next Header=44, Fragment)
→ Fragmentヘッダー (Next Header=6, TCP)
→ TCPヘッダー + データ
各拡張ヘッダー(EH)の形式:
[Next Header (1バイト)] [Hdr Ext Len (1バイト)] [オプション (可変長)]
→ 8バイト境界にアラインメントが必要
EHの順序 (RFC 8200):
1. Hop-by-Hop Options (タイプ0)
2. Destination Options (タイプ60) — 中間宛先での処理用
3. Routing (タイプ43)
4. Fragment (タイプ44)
5. Authentication Header (AH, タイプ51)
6. Encapsulating Security Payload (ESP, タイプ50)
7. Destination Options (タイプ60) — 最終宛先での処理用
8. 上位層プロトコル (TCP=6, UDP=17, ICMPv6=58)
セキュリティ: RH0 (タイプ0 Routingヘッダー) は廃止済み — ソースルーティングはDDoS増幅攻撃に利用可能
(攻撃者: パケット → ホストA → ホストB → ホストA → ... 無限ループ)
IPv6フラグメンテーション(エンドポイントのみ)
IPv6はIPv4とは異なり、ルーターはフラグメンテーションを行わない(IPv6ではDFビットは常に1)。リンクサイズを超えるパケットは、ルーターによって破棄され、ICMPv6 Packet Too Big(タイプ2、コード0)が送信される。
エンドポイントはフラグメント拡張ヘッダーを使用する:
[フラグメントEH: Next Header=6, Reserved, フラグメントオフセット, Mフラグ, 識別子]
[元のパケットのフラグメント: オフセットから開始]
SLAACの詳細
アドレス生成フロー
1. インターフェースアップ → リンクローカルアドレスを生成: fe80::/64 + IID
2. DAD: リンクローカルアドレスの一意性を検証 → 成功 → tentative → preferred
3. RS (ルーター索引用):
ICMPv6 タイプ133, src=:: (未指定) または リンクローカル, dst=ff02::2 (全ルーター)
オプション: ソースリンク層アドレス(任意)
4. RA (ルーター広告):
ICMPv6 タイプ134, src=ルーターのリンクローカル, dst=ユニキャスト (RSへの応答)
含むオプション: プレフィックス情報, MTU, ソースリンク層アドレス
プレフィックス情報オプション:
タイプ=3, 長さ=4 (32バイト)
プレフィックス長: (1バイト、通常は64)
L (on-link): このプレフィックスは同じリンク上にある → 直接通信可能
A (autonomous): このプレフィックスを使用してSLAACを行う
有効期間 (Valid Lifetime): アドレスの有効期限 (UINT32_MAX ≈ 無限 または 具体的な値)
優先期間 (Preferred Lifetime): アドレスの優先度 (有効期間以内)
プレフィックス: (16バイト)
5. グローバルユニキャストアドレスの生成:
プレフィックスはRAから + IID(プライバシー拡張またはEUI-64由来)
6. グローバルアドレスに対するDAD再実行
7. RAでMフラグ(管理)が設定されている場合 → DHCPv6でDNS/NTPなどを追加取得
RAでOフラグ(その他設定)が設定されている場合 → DHCPv6でDNSのみ取得(アドレスはSLAACを使用)
プライバシー拡張 (RFC 8981)
恒久アドレス (EUI-64ベース):
自動生成、安定、サーバーに適している
一時アドレス (ランダムIID):
有効期間 ≤ 24時間 (短期)
優先期間 ≤ 24時間 (さらに短い)
周期性: 新しいランダムIID + 新しいIPを生成 → 古いIPを廃棄 → 古いIPを削除
→ 外向き接続には一時アドレス(プライバシー用)、内向き接続には恒久アドレス(到達性用)を使用
Linux:
sysctl net.ipv6.conf.default.use_tempaddr=2 # 外向き接続には一時アドレスを優先
移行技術
| 技術 | 原理 | 使用例 |
|---|---|---|
| Dual Stack | IPv4とIPv6を同時に実行 | 理想的だが、IPv4アドレスの枯渇が必要 |
| DS-Lite | AFTRへのIPv4-in-IPv6トンネリング | ISPが提供 |
| NAT64 + DNS64 | IPv6のみのクライアントがIPv4サービスにアクセス | モバイルネットワーク(T-Mobile USなど) |
| 464XLAT | CLAT(クライアント翻訳)+ PLAT(プロバイダー翻訳) | プロバイダーレベルのNAT64 |
参考
- RFC: 8200 (IPv6), 4862 (SLAAC), 8201 (PMTUD), 8981, 4291 (アドレスアーキテクチャ)
- ソースコード:
net/ipv6/ディレクトリ,include/net/ipv6.h
キーワード: IPv6, 拡張ヘッダー, SLAAC, RA, RS, DAD, プライバシー拡張, Dual Stack, NAT64, DNS64