読者です 読者をやめる 読者になる 読者になる

IPsec の ESP パケットを復号化して読みたいとき(メモ)

IPsecのデータ転送に使われるESPパケットをどうしても復号化して読みたいときの手順メモ。
だいたい全部ググれば出てくるけどもう一回ググるのダルい。Wireshark利用者向け。

1. パケットをキャプチャする

IPsecの終端にあたるルータでキャプチャする。全部のパケットを取りたいときはこんな感じ。
オプションはお好みで、MTUは切れてそうだったら指定。

$ sudo tcpdump -w hoge.pcap -i eth0 -X -s 1500

ESPパケットだけ取りたいときはこんな感じ。
ESPのプロトコル番号は50、オプションが本当にas you likeすぎて不安になる。

$ sudo tcpdump -i eth0 -n -vvv 'ip proto 50' -w hoge_esp.pcap

2. キャプチャしている間にip-xfrmを取り続けておく

ip-xfrmのstateを1秒おきくらいに取っておく。scriptコマンドとか使って自動的にファイルに保存してくれるShell書いとくといいと思う。
なんでそういうことするかというと、いわゆるSAを作り直すときに出力される値が変わり、しかもSAが作り直されるタイミングはリアルタイムにログ見てても分かりづらくて発狂するので、逐次保存しておくようにしている。ESPのパケットを見ながらSPI(※ここは暗号化されない)の部分を目で追ってみると、なんとなく言いたいことが分かると思う。要するに、あとからSPIをキーにして複合用の情報をWiresharkに入れることになるので、その準備。

これもIPsecの終端にあたるルータとかで実行。自分が使ってるのはソフトウェアルータのVyatta(Vyatta Core 6.6R1、ブロケード買収前の最後のバージョン)なので中はStrongSwanだと思う。昔はOpenSwanだったらしいけど同じ感じだと思う。他のルータはちょっと分かりません。
とにかくip-xfrmのstatusはこんな感じで出力される。

$ ip xfrm state
src xx.xx.xx.xx dst yy.yy.yy.yy
        proto esp spi 0xcad4ad43 reqid 16388 mode tunnel
        replay-window 32 flag af-unspec
        mark -1879048190/0xffffffff
        auth-trunc hmac(sha1) 0x64199e7ed6d609f513bb6167548b14bd0e7d24f5 96
        enc cbc(aes) 0x22ef6804199ff8e299d1ea073589fcc0

これが複合したいトンネル(というかSA)の数だけ保存されていればOK。
本当はルータに設定している鍵からいろいろ割り出せるとよさそうなものの、自分みたいにIPsecを悠長に勉強している暇がないときは機械になりきってやるといいと思う。(もっと良いやり方あるよって人がいたら教えてください土下座) IPsecは用語が多いので最初から全部把握しようとしてもなかなかうまくいかない。

3. Wiresharkに複合用の設定を入れる

キャプチャファイルを表示させて、Edit > Preferences > Protocols > ESP を選んで、2番めの「Attempt to detect/decode ESP payloads」だけにチェックを入れる。
「Edit」を選択して、ip-xfrmで取った値をそのままコピペして入れると復号できる。SPIをキーにして残りを埋める感じです。

最初にESPパケットだけフィルタしたい場合はproto 50でやってもいいし、トンネルの終端のIPアドレスで絞ってもいいと思う。SPI値をHex Streamでコピーして2のファイル内をgrepすると、ちょっとだけ楽かもしれない。

まあここに書いてある英語を読み飛ばして図だけ見れば勘でもできる。 
http://ask.wireshark.org/questions/12019/how-can-i-decrypt-ikev1-andor-esp-packets

以下は余談

仮想環境を使っていると、こうでもしないと障害対応なんかできないときがある。でも一般的なクラウド事業者さんだと普通はパケットモニタリングは禁止されているので、サポート窓口などに問い合わせてOKもらってからやりましょう。当たり前だけど。障害発生時はよほどの理由がない限りOKしてくれるような気がします。

あと、仮想環境でも物理と同じで、障害発生時は必ず切り分け用に「故障した機器と可能な限り同じ条件下で」+「正常に動く」機器を少なくとも1つは用意して比較すると早い。これも当たり前だけど。いわゆる検証環境というやつです。

こういう当たり前のこと、本1冊読むよりいきなり現場に放り出されたほうが覚える、という経験をしてきた自分は、知識労働に従事する者とはとても言えずマッチョな老害だと思うのでつらい。しかも今のところ上記をやっても何も解決されてなくてつらさが倍増している。

猫画像ください。