3 分で読了 #networking #vpn-and-tunnels
このページの目次

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