このページの目次
IPsec と IKEv2
最も「エンタープライズ向け」の VPN プロトコル——カーネルネットワークスタックに深く組み込まれ、ハードウェアオフロードをサポートし、サイト間接続で広く使用されています。IKEv2 は 2 回の exchange で SA を確立し、MOBIKE は接続の移行をサポートします。複雑度が高く、誤った設定は明示的なエラー表示ではなく、サイレントフォールトとして現れることがよくあります。
概要
IPsec は最も「エンタープライズ向け」の VPN プロトコル——カーネルネットワークスタックに深く組み込まれ、ハードウェアオフロードをサポートし、サイト間接続やリモートアクセスで広く使用されています。ただし、複雑度も最も高く、IKEv2 のネゴシエーションには完全なステートマシンが必要であり、誤った設定は往々にしてサイレントフォールトとして現れます。IKEv2(2014)は IKEv1 のネゴシエーションプロセス(2 回の exchange で SA を確立)を大幅に簡素化し、MOBIKE(接続の移行)をネイティブにサポートしています。Linux 上での主要な実装は strongSwan と libreswan です。
IPsec データプレーン
ESP (IP プロトコル 50) は暗号化と完全性を提供します:
ESP パケット:
[SPI (4B)][シーケンス番号 (4B)]
[暗号化済み: ペイロード + パディング + パッド長 + Next Header]
[ESP Auth (ICV, 可変長, GCM の場合 12B)]
SPI: セキュリティパラメータインデックス — 受信側の SA を検索
シーケンス番号: 単調増加 (リプレイ攻撃防止)
Next Header: カプセル化されたプロトコル (4=IPv4-in-IP トンネル, 6=TCP トランスポートモード)
2つの動作モード:
トランスポートモード:
[元の IP ヘッダ][ESP ヘッダ][TCP][ペイロード]
元の IP ヘッダを保持 (Protocol フィールド = 50 に変更)
→ ホスト間通信に使用。追加の IP ヘッダを節約
トンネルモード:
[新しい IP ヘッダ][ESP ヘッダ][元の IP ヘッダ][TCP][ペイロード]
→ ゲートウェイ間通信に使用。新しい IP ヘッダで全体のパケットをカプセル化
→ 元のパケットは IPv4/IPv6 のいずれでも可能 (IPsec は IPv4 上で IPv6 を転送可能)
IKEv2 コントロールプレーン
IKEv2 (Internet Key Exchange v2, RFC 7296) は IKEv1 よりもシンプルです: 2回の exchange で IKE SA および最初の Child SA を確立します。
IKE_SA_INIT (1 RTT, 平文):
Initiator → Responder: SAi1, KEi, Ni
SAi1: 提案された暗号化アルゴリズム (ENCR, PRF, INTEG, DH グループ)
KEi: Diffie-Hellman 公開値
Ni: nonce
Responder → Initiator: SAr1, KEr, Nr, [CERTREQ]
SAr1: 選択されたアルゴリズム (提案から選択)
KEr: DH 公開値
Nr: nonce
双方で各自: DH(KEi, KEr) → g^ir → SKEYSEED = prf(Ni | Nr, g^ir)
→ 派生: SK_d, SK_ai, SK_ar, SK_ei, SK_er, SK_pi, SK_pr
IKE_AUTH (1 RTT, 全暗号化!):
Initiator → Responder: IDi, [CERT], [CERTREQ], AUTH, SAi2, TSi, TSr
IDi: 身份 (FQDN, メールアドレス, IP, ...)
AUTH: IKE_SA_INIT メッセージへの署名 (証明書秘密鍵を使用)
SAi2: Child SA の提案
TSi/TSr: トラフィックセレクタ (どのトラフィックがこの Child SA を通過するか)
Responder → Initiator: IDr, [CERT], AUTH, SAr2, TSi, TSr
双方向認証が完了
CREATE_CHILD_SA (< 0.5 RTT):
用途: さらなる Child SA の作成、または既存 SA の再キーイング (定期的なセッションキーの更新)
鍵の派生
IKE SA:
SKEYSEED = prf(Ni | Nr, g^ir)
7つの鍵 = prf+(SKEYSEED, Ni | Nr | SPIi | SPIr)
SK_d: Child SA の鍵を派生するために使用
SK_ai/ar: IKE_AUTH メッセージの完全性鍵
SK_ei/er: IKE_AUTH メッセージの暗号化鍵
SK_pi/pr: AUTH ペイロード (署名) の生成
Child SA (ESP):
KEYMAT = prf+(SK_d, Ni | Nr | [g^ir_new]) ← PFS の場合: 新しい DH は任意
参考
- RFC: 7296 (IKEv2), 4303 (ESP), 4301 (IPsec Architecture)
- 実装: strongSwan (C), libreswan
- ツール:
ipsec status,swanctl --list-sas
Keywords: IPsec, ESP, IKEv2, IKE_SA_INIT, IKE_AUTH, CREATE_CHILD_SA, strongSwan, tunnel mode, transport mode