IPsecで重要なESPプロトコルを初心者向けに解説

IPsec で実際にデータを守っているのは、ESP(Encapsulating Security Payload)というプロトコルです。IPsec VPN の設定で esp-aes や esp-sha256-hmac といった名前を見かけるのは、この ESP の暗号化と認証の方式を選んでいるためです。

この記事では、ESP を初めて学ぶ方向けに、IPsec の中での ESP の位置づけ、パケットの中身、SA と SPI の関係、送信・受信のときに何をしているのかを順に解説します。後半では、トンネルモードとトランスポートモードの違い、NAT トラバーサル、MTU など、実務でつまずきやすい点もまとめます。

この記事でわかること
  1. IPsec の中での ESP の役割と、AH・IKE との分担
  2. ESP パケットの各フィールドと、SA・SPI の関係
  3. 送信・受信の処理で4つの機能がどう実現されているか
  4. トンネル/トランスポートモード、NAT トラバーサル、MTU の注意点

IPsec の全体像と ESP の位置づけ

IPsec は、IP パケットを暗号化したり、改ざんされていないかを確認したりして、IP レベルで通信を守る仕組みの総称です。拠点間 VPN やリモートアクセス VPN でよく使われます。IPsec は1つのプロトコルではなく、役割の違う複数のプロトコルの組み合わせでできています。

プロトコル役割識別
IKE通信相手を認証し、暗号化に使う鍵やアルゴリズムを取り決めて SA(後述)を作る。いわば「準備係」UDP 500(NAT 越えでは UDP 4500)
ESP実際のデータを暗号化し、改ざん検出とリプレイ防止を行う。「データを運んで守る係」IP プロトコル番号 50
AH改ざん検出と送信元の確認だけを行う。暗号化はしないIP プロトコル番号 51

流れとしては、まず IKE で相手と話し合って鍵を決め、その鍵を使って ESP がデータを守ります。IKE がつながっていても ESP のパケットが通らなければ通信はできないので、ESP の動きを理解しておくとトラブル時の切り分けがしやすくなります。

IKE SA(UDP 500/4500) 相手の認証、鍵とアルゴリズムの取り決め IP ネットワーク R1 192.168.12.1 R2 192.168.12.2 IPsec SA(ESP)R1 → R2 SPI 0x26654b60 IPsec SA(ESP)R2 → R1 SPI 0x8d19e557
図1 IKE SA で準備し、ESP の SA は方向ごとに1本ずつ作られる(SPI はキャプチャの値)

IPsec(ESP)が提供する4つの機能

ESP が提供するのは、次の4つの機能です。それぞれ「何から守るのか」と「ESP のどの仕組みで実現しているのか」を対応させると理解しやすくなります。

機能守るもの(防ぐ攻撃)ESP での実現方法
データ送信元の認証なりすまし(偽の相手からのパケット)SA の鍵を知っている相手しか正しい ICV を作れないことで確認する
データの完全性途中での改ざんHMAC や AEAD で計算した ICV(整合性チェック値)を付けて検証する
データの機密性盗聴AES などでペイロードを暗号化する
アンチリプレイ過去のパケットの再送(リプレイ攻撃)シーケンス番号とリプレイウィンドウで、重複や古すぎるパケットを捨てる

データ送信元の認証(Authentication)

受け取ったパケットが、本当に SA を結んだ相手から来たものかを確認する機能です。ESP では、送信側が SA の鍵を使ってパケットごとに ICV を計算して付けます。鍵を知らない第三者は正しい ICV を作れないため、受信側で ICV が一致すれば「鍵を共有している相手から来た」と判断できます。

なお、機器どうしが最初にお互いを確認する(事前共有鍵や証明書を使う)のは IKE の役割です。ESP の認証は、IKE で確認済みの相手とだけ共有している鍵を使って、1パケットずつ送信元を確かめるものです。

データの完全性(Integrity)

通信の途中でデータが書き換えられていないかを確認する機能です。送信側と受信側が同じ鍵とアルゴリズムで ICV を計算し、値が一致しなければパケットを捨てます。代表的な方式は HMAC-SHA-256 などの HMAC 方式と、暗号化と完全性チェックを一度に行う AES-GCM(AEAD 方式)です。

元記事で例に挙げていた HMAC-MD5 は、現在の推奨(RFC 8221)では使ってはいけない(MUST NOT)方式です。HMAC-SHA1 も今後外される扱いのため、新しく設定するなら HMAC-SHA-256 以上か AES-GCM を選びます。

データの機密性(Confidentiality)

経路上でパケットを盗聴されても、中身を読めないようにする機能です。ESP はペイロード部分を共通鍵暗号で暗号化します。現在の主流は AES(CBC モードや GCM モード)です。3DES は RFC 8221 で「使うべきでない(SHOULD NOT)」とされ、DES は使用禁止です。

アンチリプレイ(Anti-Replay Protection)

リプレイ攻撃は、過去に盗聴した正規のパケットをそのまま送り直す攻撃です。中身は正しく暗号化され ICV も正しいので、完全性チェックだけでは見破れません。そこで ESP では、送信側がパケットごとに1ずつ増えるシーケンス番号を付け、受信側が「すでに受け取った番号」と「古すぎる番号」を捨てます。

受信側は、これまでに受け取った最大の番号を基準に一定の幅(リプレイウィンドウ)を持ち、その範囲で受信済みかどうかを記録します。経路上で順番が多少入れ替わっても、ウィンドウの範囲内なら受け取れます。Cisco IOS の既定のウィンドウサイズは64パケットです。

補足:認証なしの ESP は使わない

ESP の規格(RFC 4303)では、暗号化だけで完全性チェックを使わない構成も定義されています。ただし、完全性チェックがないとアンチリプレイも使えず、暗号文を改ざんされても気づけません。RFC 8221 でも「認証なしの暗号化は効果がなく、使ってはならない」とされています。「ESP は4つの機能をすべて提供する」というのは、暗号化と完全性チェックの両方を有効にした場合の話です。

アルゴリズム選びの目安(RFC 8221)
  • 暗号化:AES-GCM(MUST)、AES-CBC(MUST)、ChaCha20-Poly1305(SHOULD)、3DES(SHOULD NOT)、DES(MUST NOT)
  • 完全性:HMAC-SHA2-256-128(MUST)、HMAC-SHA2-512-256(SHOULD)、HMAC-SHA1-96(MUST-:今後外される見込み)、HMAC-MD5-96(MUST NOT)
  • AES-GCM のような AEAD 方式は、暗号化と完全性チェックを1つのアルゴリズムで行うため、別に HMAC を指定しません。

ESP パケットの構成

ESP は、守りたいデータを「ESP ヘッダ」と「ESP トレーラ」「ICV」で挟む形でカプセル化します。各フィールドの並びと、暗号化される範囲・完全性チェックの対象になる範囲は次のとおりです。

← 32 ビット → SPI(セキュリティパラメータインデックス) シーケンス番号 ペイロードデータ(可変長) 守りたい元のデータ(先頭に IV が入る方式もある) パディング(0〜255 バイト) パッド長(8bit) ネクストヘッダ(8bit) ICV(整合性チェック値・可変長) ESP ヘッダ ESP トレーラ ESP 認証データ 暗号化範囲 認証(完全性)範囲 ICV 自体は暗号化も認証もされず、末尾に付く
図2 ESP パケットのフォーマットと、暗号化・認証の範囲
フィールドサイズ役割
SPI32 ビットこのパケットがどの SA に属するかを示す番号。受信側は SPI を見て、復号や検証に使う鍵とアルゴリズムを決める
シーケンス番号32 ビットSA ごとに 1 から始まり、パケットごとに 1 ずつ増える。アンチリプレイに使う(拡張シーケンス番号 ESN を使うと内部的に 64 ビット)
ペイロードデータ可変守りたい元のデータ(トンネルモードなら元の IP パケット全体)。AES-CBC などでは先頭に IV(初期化ベクトル)が入る
パディング0〜255 バイト暗号方式のブロック長に合わせるための詰め物
パッド長8 ビットパディングが何バイトあるか。受信側はこれを見てパディングを取り除く
ネクストヘッダ8 ビットペイロードの中身の種類。トンネルモードなら IPv4(4)、トランスポートモードなら TCP(6)や UDP(17)など
ICV可変完全性チェック用の値。HMAC-SHA2-256-128 なら 16 バイト。受信側が同じ計算をして一致を確認する

ポイントは、SPI とシーケンス番号が暗号化されないことです。受信側は、パケットを受け取った時点ではまだどの鍵で復号すればよいかわかりません。そのため SPI は平文で置かれ、受信側はそれを手がかりに SA を探します。

キャプチャで ESP を見る

実際に ESP のパケットを Wireshark でキャプチャすると、次のように表示されます。暗号化されている部分は、鍵がなければ Wireshark でも中身を表示できません。見えるのは外側の IP ヘッダと、ESP ヘッダの SPI・シーケンス番号だけです。

画面イメージについて

この記事のキャプチャ画面は、実際の画面ではなく、検証時の Wireshark の画面から表示内容のポイントを抜き出して描いたイメージです。Wireshark のバージョンによって表記は変わります。

パケットキャプチャ(Wireshark)画面イメージ
TimeSourceProtocolInfo
8.6924…192.168.12.1ESPESP (SPI=0x26654b60)
8.7030…192.168.12.2ESP4ESP (SPI=0x8d19e557)
8.7129…192.168.12.1ESPESP (SPI=0x26654b60)
▸ Frame 12: 198 bytes on wire (1584 bits), 198 bytes captured …▸ Ethernet II, Src: 00:00:00_00:11:11 (00:00:00:00:11:11), Dst: …▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 12▾ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.2    Total Length: 180    Time to live: 2551    Protocol: Encap Security Payload (50)    Source: 192.168.12.1    Destination: 192.168.12.2▾ Encapsulating Security Payload2    ESP SPI: 0x26654b60 (644172640)3    ESP Sequence: 1
図3 ESP パケットのキャプチャ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Protocol: Encap Security Payload (50)IP ヘッダのプロトコル番号が 50(ESP)。TCP や UDP ではないので、ポート番号はない
2ESP SPI: 0x26654b60192.168.12.1 → 192.168.12.2 方向の SA を示す SPI
3ESP Sequence: 1この SA で最初に送られたパケット。以降 2、3… と増えていく
4SPI=0x8d19e557逆方向(192.168.12.2 → 192.168.12.1)のパケットは別の SPI。SA が方向ごとに分かれていることがわかる

SA と SPI:ESP を理解するカギ

ESP の動きを理解するうえで欠かせないのが、SA(Security Association)です。SA は「この相手とは、この鍵とこのアルゴリズムで、このモードで通信する」という取り決めをまとめたものです。SPI は、その SA を指す番号にすぎません。

元記事の表現の修正

元記事では SPI について「この中には、暗号化アルゴリズム、暗号鍵、暗号鍵の有効時間が含まれます」と書いていました。正しくは、アルゴリズムや鍵、有効時間を持っているのは SA で、SPI はその SA を探すための番号(インデックス)です。パケットの中に鍵が入っているわけではありません。

SA が持つ情報内容
SPIこの SA を識別する番号。受信側が決めて相手に伝える
暗号アルゴリズムと鍵例:AES-256 と、その鍵
完全性アルゴリズムと鍵例:HMAC-SHA-256 と、その鍵(AES-GCM なら暗号化と兼用)
モードトンネルモードかトランスポートモードか
寿命(ライフタイム)時間やデータ量の上限。上限が近づくと新しい SA を作り直す(リキー)
シーケンス番号とリプレイウィンドウ送信側は次に付ける番号、受信側は受信済みの番号の記録

SA には次の3つの特徴があります。

  • 一方向:1つの SA は片方向の通信だけを扱います。双方向で通信するには、送信用と受信用の2つの SA が必要です。図3のキャプチャで、方向によって SPI が違ったのはこのためです。
  • IKE が作る:SA は IKE のネゴシエーションで作られます。IKEv1 では フェーズ1 で IKE SA、フェーズ2(クイックモード)で IPsec SA を作ります。IKEv2 では IKE SA と、Child SA と呼ばれる IPsec SA を作ります。
  • 作り直される:寿命が来る前にリキーが行われ、新しい鍵と新しい SPI の SA に切り替わります。長時間キャプチャすると SPI の値が途中で変わるのはこのためです。

ESP の送信処理と受信処理

ここまでのフィールドと SA を使って、ESP は次の順番でパケットを処理します。4つの機能が、どの手順で実現されているかを確認してください。

送信側 受信側 ① 送るパケットに使う SA を決める ② シーケンス番号を1つ増やす ③ パディングとネクストヘッダを付ける ④ ペイロード〜トレーラを暗号化する ⑤ ICV を計算して末尾に付ける ① SPI で SA を探す ② シーケンス番号を確認(リプレイ検出) ③ ICV を検証(改ざん・なりすまし検出) ④ 復号する(機密性) ⑤ パディングを外し、次の処理へ渡す ②③で問題があれば、復号する前にパケットを捨てる
図4 ESP の送信処理と受信処理の流れ

受信側が、復号よりも先にシーケンス番号と ICV を確認している点が大事です。改ざんされたパケットや再送されたパケットは復号する前に捨てるので、無駄な処理をせずに済み、攻撃への耐性も上がります。

暗号化モード:トンネルモードとトランスポートモード

ESP には、何を守るかによって2つのモードがあります。違いは「元の IP ヘッダを暗号化の中に入れるかどうか」です。

トンネルモード 新IPヘッダ ESPヘッダ 元IPヘッダ TCP/UDP データ ESPトレーラ ICV 暗号化の対象(元のパケット全体) 認証(完全性チェック)の対象 トランスポートモード 元IPヘッダ ESPヘッダ TCP/UDP データ ESPトレーラ ICV 暗号化の対象(IP ヘッダより後ろ) 認証(完全性チェック)の対象 ESP が付ける部分 新しく付く IP ヘッダ(トンネルモード)
図5 トンネルモードとトランスポートモードのパケット構成

トンネルモード

元の IP パケットをヘッダごと丸ごと暗号化し、その外側に新しい IP ヘッダを付けます。新しい IP ヘッダの送信元と宛先は、VPN 装置(ルータやファイアウォール)どうしのアドレスです。経路上では VPN 装置どうしの通信にしか見えず、拠点内の PC やサーバのアドレスは隠れます。

本社と支社のルータを結ぶ拠点間 VPN や、リモートアクセス VPN で使われます。新しい IP ヘッダ(IPv4 で 20 バイト)が増える分、トランスポートモードよりパケットが大きくなります。

トランスポートモード

元の IP ヘッダはそのまま残し、その後ろ(TCP/UDP とデータ)だけを暗号化します。IP ヘッダが増えない分オーバーヘッドは小さくなりますが、通信している2台の実際のアドレスは経路上から見えます。

元記事では「ヘッダが暗号化されないため、トンネルモードほどのセキュリティ強度はありません」と書いていましたが、暗号そのものの強さは同じです。違いは、元の IP ヘッダ(誰と誰が通信しているか)が見えるかどうかです。通信する2台自身が暗号化する、ホスト間の保護で使います。実務では、GRE over IPsec や L2TP/IPsec のように、すでに別のトンネルでカプセル化したパケットを守るときによく使われます。

比較項目トンネルモードトランスポートモード
暗号化する範囲元の IP パケット全体IP ヘッダより後ろ(TCP/UDP とデータ)
新しい IP ヘッダ付ける(VPN 装置どうしのアドレス)付けない
経路上から見えるアドレスVPN 装置のアドレスだけ通信している2台の実際のアドレス
オーバーヘッド大きい(IP ヘッダ分が増える)小さい
主な用途拠点間 VPN、リモートアクセス VPNホスト間の通信、GRE over IPsec、L2TP/IPsec

AH との違い

ESP とよく比較される AH(Authentication Header)は、暗号化を行いません。さらに、AH は外側の IP ヘッダ(途中で変わらないフィールド)まで完全性チェックの対象に含めるため、NAT で IP アドレスが書き換わるとチェックに失敗します。このため実務では、ほぼ ESP が使われます。

比較項目ESPAH
IP プロトコル番号5051
暗号化(機密性)ありなし
完全性チェックの範囲ESP ヘッダ〜ESP トレーラ(外側の IP ヘッダは含まない)外側の IP ヘッダの不変部分も含む
アンチリプレイありあり
NAT との相性NAT トラバーサルで対応できるアドレス変換でチェックが失敗するため使えない

NAT 環境と NAT トラバーサル(NAT-T)

家庭用ルータやモバイル回線のように、1つのグローバルアドレスを複数の端末で共有する NAT(NAPT)は、TCP や UDP のポート番号を書き換えて通信を区別します。ところが ESP は TCP でも UDP でもない IP プロトコル番号 50 のパケットで、ポート番号がありません。そのため NAPT 装置は ESP のパケットをうまく変換できず、通信できないことがあります。

元記事では原因を「IPアドレスが動的に変わるため」と書いていましたが、主な原因はこのポート番号がない点です。

これを解決するのが NAT トラバーサル(NAT-T)です。IKE のネゴシエーション中に経路上の NAT を検出すると、IKE の通信を UDP 4500 に移し、ESP のパケットも UDP 4500 のヘッダで包んで送ります。UDP のポート番号があるので、NAPT 装置でも変換できるようになります。

通常の ESP(IP プロトコル 50) IPヘッダ ESPヘッダ 暗号化されたデータ ESPトレーラ ICV NAT-T(UDP 4500 でカプセル化) IPヘッダ UDP 4500 ESPヘッダ 暗号化されたデータ ESPトレーラ ICV ポート番号があるので NAPT で変換できる
図6 NAT-T では ESP を UDP 4500 で包む

経路上のファイアウォールでは、IPsec のために次の通信を許可しておく必要があります。NAT-T を使うと ESP も UDP 4500 に乗るため、IP プロトコル 50 を許可しなくても通るようになります。

通信用途
UDP 500IKE(NAT がない場合、または NAT 検出前)
UDP 4500NAT-T 使用時の IKE と ESP
IP プロトコル 50NAT-T を使わない場合の ESP

実務で気を付けたいポイント

ESP のオーバーヘッドと MTU

ESP はパケットにヘッダやトレーラを足すため、元のパケットより大きくなります。インターネット回線の MTU は多くの場合 1500 バイト(PPPoE ならさらに小さい)なので、もともと 1500 バイトのパケットに ESP を付けると、そのままでは送れずにフラグメントやパケットロスの原因になります。

増える部分サイズの目安
新しい IP ヘッダ(トンネルモード)20 バイト(IPv4)
UDP ヘッダ(NAT-T 使用時)8 バイト
ESP ヘッダ(SPI+シーケンス番号)8 バイト
IVAES-CBC で 16 バイト、AES-GCM で 8 バイト
パディング+パッド長+ネクストヘッダ2 バイト+ブロック長に合わせた詰め物
ICVHMAC-SHA2-256-128、AES-GCM(16 バイト ICV)で 16 バイト

合計すると数十バイト増えます。そのため VPN のインターフェイスでは、IP MTU を小さめにし、TCP の MSS を調整するのが一般的です。Cisco IOS では、トンネルインターフェイスに ip mtu 1400 と ip tcp adjust-mss 1360 を設定する例がよく使われます。

うまく通信できないときの切り分け

状態よくある原因確認すること
IKE は確立、データ不通経路上のファイアウォールで ESP(IP プロトコル 50)が止められているFW のポリシーとログ。NAT-T で UDP 4500 に乗っているか
NAT 配下だけ不通NAT-T が無効、または UDP 4500 が許可されていない両端で NAT-T が有効か、UDP 4500 の許可
片方向しか通らない対向の暗号化対象(ACL など)やルーティングの不一致両端で暗号化・復号したパケット数(Cisco なら show crypto ipsec sa の #pkts encaps と #pkts decaps)
大きいパケットだけ失敗ESP のオーバーヘッドによる MTU 超過サイズを変えた ping、MTU・MSS の設定
リプレイエラーで破棄QoS などでパケットの順番が大きく入れ替わり、リプレイウィンドウから外れたリプレイ関連のカウンタ、QoS の設定、ウィンドウサイズ
片側の再起動後に不通片側だけが古い SA を持ち続け、相手が知らない SPI で送っているSA の再作成、invalid SPI 関連のログ

まとめ

ESP は、IKE が作った SA の鍵とアルゴリズムを使って、IP パケットを暗号化し、改ざんとリプレイから守るプロトコルです。押さえておきたい点をまとめます。

項目ポイント
位置づけIKE が準備(認証・鍵交換・SA 作成)、ESP がデータの保護を担当
識別IP プロトコル番号 50。ポート番号はない
4つの機能送信元の認証・完全性は ICV、機密性は暗号化、アンチリプレイはシーケンス番号で実現
SA と SPISA は一方向の取り決め、SPI はそれを指す番号。双方向で2つの SA を使う
アルゴリズムAES-GCM か、AES と HMAC-SHA-256 以上。MD5・DES は使わず、3DES も避ける
モード拠点間 VPN はトンネル、ホスト間や GRE over IPsec はトランスポート
NATNAT-T で UDP 4500 に包んで通す
MTUオーバーヘッドの分、IP MTU と TCP MSS を調整する

コメント