このページの目次

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 StackIPv4とIPv6を同時に実行理想的だが、IPv4アドレスの枯渇が必要
DS-LiteAFTRへのIPv4-in-IPv6トンネリングISPが提供
NAT64 + DNS64IPv6のみのクライアントがIPv4サービスにアクセスモバイルネットワーク(T-Mobile USなど)
464XLATCLAT(クライアント翻訳)+ 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