IPsec で実際にデータを守っているのは、ESP(Encapsulating Security Payload)というプロトコルです。IPsec VPN の設定で esp-aes や esp-sha256-hmac といった名前を見かけるのは、この ESP の暗号化と認証の方式を選んでいるためです。
この記事では、ESP を初めて学ぶ方向けに、IPsec の中での ESP の位置づけ、パケットの中身、SA と SPI の関係、送信・受信のときに何をしているのかを順に解説します。後半では、トンネルモードとトランスポートモードの違い、NAT トラバーサル、MTU など、実務でつまずきやすい点もまとめます。
- IPsec の中での ESP の役割と、AH・IKE との分担
- ESP パケットの各フィールドと、SA・SPI の関係
- 送信・受信の処理で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 の動きを理解しておくとトラブル時の切り分けがしやすくなります。
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 の規格(RFC 4303)では、暗号化だけで完全性チェックを使わない構成も定義されています。ただし、完全性チェックがないとアンチリプレイも使えず、暗号文を改ざんされても気づけません。RFC 8221 でも「認証なしの暗号化は効果がなく、使ってはならない」とされています。「ESP は4つの機能をすべて提供する」というのは、暗号化と完全性チェックの両方を有効にした場合の話です。
- 暗号化: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」で挟む形でカプセル化します。各フィールドの並びと、暗号化される範囲・完全性チェックの対象になる範囲は次のとおりです。
| フィールド | サイズ | 役割 |
|---|---|---|
| SPI | 32 ビット | このパケットがどの 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 のバージョンによって表記は変わります。
| Time | Source | Protocol | Info |
|---|---|---|---|
| 8.6924… | 192.168.12.1 | ESP | ESP (SPI=0x26654b60) |
| 8.7030… | 192.168.12.2 | ESP | 4ESP (SPI=0x8d19e557) |
| 8.7129… | 192.168.12.1 | ESP | ESP (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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Protocol: Encap Security Payload (50) | IP ヘッダのプロトコル番号が 50(ESP)。TCP や UDP ではないので、ポート番号はない |
| 2 | ESP SPI: 0x26654b60 | 192.168.12.1 → 192.168.12.2 方向の SA を示す SPI |
| 3 | ESP Sequence: 1 | この SA で最初に送られたパケット。以降 2、3… と増えていく |
| 4 | SPI=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つの機能が、どの手順で実現されているかを確認してください。
受信側が、復号よりも先にシーケンス番号と ICV を確認している点が大事です。改ざんされたパケットや再送されたパケットは復号する前に捨てるので、無駄な処理をせずに済み、攻撃への耐性も上がります。
暗号化モード:トンネルモードとトランスポートモード
ESP には、何を守るかによって2つのモードがあります。違いは「元の IP ヘッダを暗号化の中に入れるかどうか」です。
トンネルモード
元の 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 が使われます。
| 比較項目 | ESP | AH |
|---|---|---|
| IP プロトコル番号 | 50 | 51 |
| 暗号化(機密性) | あり | なし |
| 完全性チェックの範囲 | 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 装置でも変換できるようになります。
経路上のファイアウォールでは、IPsec のために次の通信を許可しておく必要があります。NAT-T を使うと ESP も UDP 4500 に乗るため、IP プロトコル 50 を許可しなくても通るようになります。
| 通信 | 用途 |
|---|---|
| UDP 500 | IKE(NAT がない場合、または NAT 検出前) |
| UDP 4500 | NAT-T 使用時の IKE と ESP |
| IP プロトコル 50 | NAT-T を使わない場合の ESP |
実務で気を付けたいポイント
ESP のオーバーヘッドと MTU
ESP はパケットにヘッダやトレーラを足すため、元のパケットより大きくなります。インターネット回線の MTU は多くの場合 1500 バイト(PPPoE ならさらに小さい)なので、もともと 1500 バイトのパケットに ESP を付けると、そのままでは送れずにフラグメントやパケットロスの原因になります。
| 増える部分 | サイズの目安 |
|---|---|
| 新しい IP ヘッダ(トンネルモード) | 20 バイト(IPv4) |
| UDP ヘッダ(NAT-T 使用時) | 8 バイト |
| ESP ヘッダ(SPI+シーケンス番号) | 8 バイト |
| IV | AES-CBC で 16 バイト、AES-GCM で 8 バイト |
| パディング+パッド長+ネクストヘッダ | 2 バイト+ブロック長に合わせた詰め物 |
| ICV | HMAC-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 と SPI | SA は一方向の取り決め、SPI はそれを指す番号。双方向で2つの SA を使う |
| アルゴリズム | AES-GCM か、AES と HMAC-SHA-256 以上。MD5・DES は使わず、3DES も避ける |
| モード | 拠点間 VPN はトンネル、ホスト間や GRE over IPsec はトランスポート |
| NAT | NAT-T で UDP 4500 に包んで通す |
| MTU | オーバーヘッドの分、IP MTU と TCP MSS を調整する |
コメント