IPsec(Security Architecture for Internet Protocol)とは、暗号化によってパケットの秘匿や改ざん検知を行うプロトコルで、主に拠点間のインターネットVPN(Virtual Private Network)として広く利用されています。
暗号化モードと認証プロトコル
IPsecには、2つの暗号化モードと2つの認証プログラムがあります。
まず、2つの暗号化モードは以下になります。
- トランスポートモード
- トンネルモード
トランスポートモードは、IPパケットのペイロードのみを暗号化し、IPヘッダは暗号化しません。このモードは、IPsecに対応した端末同士が直接エンドツーエンドの通信を行うことを前提としています。
トンネルモードは、IPヘッダを含めたIPパケット全体を暗号化(カプセル化)します。このモードは、各端末の間にVPN装置が入り、その間で暗号化通信を行うことを想定しています。この場合、VPN装置で新しいIPヘッダが付加されます。
次に、2つの認証プロトコルは以下になります。
- AH(Authentication Header:認証ヘッダ)
- ESP(Encapsulated Security Payload:暗号化ペイロード)
AH
AHは通信データの認証のために使用されるプロトコルで、暗号化の機能はありません。AHでは、IPヘッダの後にAHヘッダが挿入されます。
MAC(メッセージ認証コード)を用いてIPヘッダを含めたパケット全体のICV(Integrity Check Value)を生成し、AHヘッダにセットします。ICVは、データの完全性をチェックするための値です。
AHではパケット全体のICVを使用するため、完全性チェックの精度は高くなりますが、NAT(Network Address Translation)が使われている場合は正常性が正しく行えないという問題があります。
ESP
ESPは通信データの認証と暗号化の両方の機能があります。ESPでは、IPヘッダの後にESPヘッダ、データ部の後にESPトレーラとESP認証データが挿入されます。
AHと同じくMACを使ってICVを生成しますが、IPアドレスを含めないため、NATを行ってもICVは影響を受けません。ICVはESP認証データに格納されます。
通信手順
IKE(Internet Key Exchange:鍵交換)とは、SA(Security Association)の作成、暗号化を行う鍵の作成などに使用するプロトコルです。SAとは、IPsecにおける論理的コネクションで、以下の順に作成されます。
- ISAKMP SA(制御用) :IPsecゲートウェイ間で1つ作成
- IPsec SA(データ通信用):通信の方向やプロトコル毎に作成
ISAKMP SAの作成にはメインモードかアグレッシブモード、IPsec SAの作成にはクイックモードが使用されます。
メインモード
送信側(イニシエータ)と受信側(レスポンダ)が、次の3往復のパケット交換によりISAKMP SAを作成します。
- ネゴシエーション
イニエータがISAKMPパラメタ(暗号化アルゴリズム・ハッシュアルゴリズム・認証方式など)を提案し、レスポンダがその中から対応可能なものを選択。 - 秘密対象鍵の生成・交換
イニエータとレスポンダがDiffie-Hellman鍵交換アルゴリズムにより、秘密鍵(DH秘密鍵)を共有。 - 相手の認証
IDと認証用ハッシュ値により相手を認証し、ISAKMP SAが確立。
アグレッシブモード
送信側と受信側が、次の1往復半のパケット交換によりISAKMP SAを作成します。
- イニシエータ→レスポンダ
ISAKMPパラメタ、DH公開値、ID、認証用乱数を送信。メインモードと異なり、最初のパケットでIDを送るため、暗号化されていません。 - レスポンダ→イニシエータ
受諾するISAKMPパラメタ、DH公開値、ID、認証用乱数、認証用ハッシュ値を送信。これによりイニシエータとレスポンダは、DH秘密鍵を共有することができます。 - イニシエータ→レスポンダ
認証用ハッシュ値を送信。これによりレスポンダがイニシエータを認証し、ISAKMP SAが確立されます。
クイックモード
イニシエータとレスポンダが、次の1往復半のパケット交換によりIPsec SAを作成します。この通信はISAKMP SAを使って行われるため、パケットのデータ部分が暗号化されます。
- イニシエータ→レスポンダ
IPsec SAパラメタ、認証用乱数、認証用ハッシュ値を送信。 - レスポンダ→イニシエータ
受諾するIPsec SAパラメタ、認証用乱数、認証用ハッシュ値を送信します。イニシエータとレスポンダはIPsec SAで使用する秘密対象鍵を生成。 - イニシエータ→レスポンダ
認証用のハッシュ値を送信。

