IPsec でハマッたので、メモ

とある事情で IPsec を勉強することになりました。って、以前も書いたっけか。インターネット関連プロトコルの勉強の近道は、実際にパケットをアナライザ*1で覗くことだと痛感しているので、試してみました。最近の Wireshark は、IPsec をデコード(認証チェック、暗号の復号)をできるので、非常に勉強になります*2

まず最初に NetBSD

NetBSDIPsec を使う方法は、ここに詳しいです。

一つ注意しなくてはならない点として、上記ドキュメントでは ESP と AH を別々に用いる*3方法が書かれているのですが、IPsec version 2 以降、ESP プロトコル内部で認証を有効にすることができるようになったので、今は、そちらのほうが主流ではないかということです*4。実際、以下の Wireshark のデコード機能でも、ESP 内部の認証機能では ICV の正当性チェックができますが、AH プロトコル単体のほうでは、それができないようであることです。(AH の構造は分析できるけど、ICV が正しいかどうかまでは見てくれないっぽい。)
さて、NetBSDIPsec を使うには(とりあえず、IKE を使わない場合)、setkey コマンドで手動で SPD、SAD を定義します。上記ドキュメントでは ESP を AH でカプセル化する方法が書かれていますが、ESP で認証を使うには、setkey の man ページを読みましょう。こんな感じです。

add 10.0.0.1 10.0.0.2 esp 9876 -E 3des-cbc "hogehogehogehogehogehoge" -A hmac-md5 "fugafugafugafuga";

これで、ESP で暗号化に 3DES-CBC を使い、認証に HMAC-MD5 を使う SAD ができました。
SPD の定義は、上記マニュアルにあるのと変わりません。

spdadd 10.0.0.1 10.0.0.2 any -P out ipsec esp/transport//use;

これだけで、認証も有効になります。
ところで、setkey コマンドには注意点があります。以下、NetBSD 5.1 の場合ですが。setkey -F を使うと SAD がクリアされますが、SPD は残ったままです。SPD を消すには、別途 setkey -P -F としなくてはいけません。私はこれでハマりました*5。setkey -D と setkey -P -D で、内容をダンプして設定を確認しましょう*6

続いて Wireshark

Wireshark のバージョンは 1.4.3 で、libGcypt 付きです。
以下に解説があります。

が、注意しなくてはいけないのは、ここで書かれている authentication とは ESP の認証機能であり、AH ではないということです。私は、またここではまりました。
Wireshark の preference には AH の設定もありますが、ここには秘密鍵を記述することはできず、つまり、ICV の正当性チェックはできません。
まず最初に、NetBSD の上記ドキュメントに出てくる ESP in AH をデコードする方法です。ESP 自信では認証機能を使わないとします。
ESP の Preference を開き、以下のように設定します。

  • Attempt to detect/decode encryption ESP payloads: チェックする
  • Attempt to Check ESP Authentication: チェックなし
  • SA #1: IPv4|10.0.0.1|10.0.0.2|9876

ここで、9876 は SA 識別子です。

  • Encryption Algorithm #1: TrippleDES-CBC
  • Authentication Algorithm #1: NULL
  • Encryption Key #1: 0x686f6765686f6765686f6765686f6765686f6765686f6765 (16進数で書いてみました。この値は setkey -D すると分かります。)

SA #2 のほうも、同様に設定します。通常は SA #2 には、上記の例だと、10.0.0.2 から 10.0.0.1 向きの SA を設定します。
次に、ESP 内部で認証も有効にする場合です。その場合は、上記に対して

  • Attempt to Check ESP Authentication: チェックする
  • Authentication Algorithm #1: HMAC-MD5-96 (上記の NetBSD 設定の場合)
  • Authentication Key #1: fugafugafugafuga

もちろん、SA #2 の設定も必要です。
いかがでしょうか? 動きましたでしょうか? 認証付き ESP を Wireshark でデコードした場合、ICV が正しいか誤っているか(改竄されているかも)、表示されます。
これで、IPsec の勉強もはかどりますね、というところで、おしまい。

*1:Sniffer とか Wireshark とか。

*2:暗号化パケットの追跡は、復号ができないと辛い。

*3:まず ESP で暗号化してから、AH でICV を加える。

*4:自信ありませんが。

*5:マニュアル読めって。

*6:私がはまったのは、SAD は再設定したのに、SPD がそのままだったので、AH が有効になっていなかった、というものです。