復号パケットで学ぶSEIL IKE/IPsec

2020年12月22日 火曜日


【この記事を書いた人】
芦原 渉

ルータのファームウェア開発をしています。河原でプログラミングするのが好きです。

「復号パケットで学ぶSEIL IKE/IPsec」のイメージ

IIJ 2020 TECHアドベントカレンダー 12/22(火)の記事です】

ネットワークプロトコルを学ぶ一番の方法は、実際のパケットを見ることだ、と私は考えています。ルータ・サーバの設定を変えて、コマンドを打って、パケットやログの変化を見てプロトコルの雰囲気をつかむことが、そのプロトコルへの入門の第一歩となります。

IPsec VPNはIIJ独自開発ルータSEILの人気機能の一つで、IPsecの鍵交換を行うのがIKE (Internet Key Exchange) プロトコルです。私の部署では配属後「SEILをさわってみよう研修」というのがあるのですが、最も難しい機能の一つがIKE/IPsecでした。馴染みの無い概念・用語が多く登場する上に、パケットキャプチャを見ても暗号化されていて何をしているのか分からなかったためです。

ようやく少し分かり始めたのは1年後のことで、WiresharkでIKE/IPsecパケットを復号できることが分かってからでした。

SEILの機種は

  • seil3: SEIL/B1、SEIL/X1、SEIL/X2、SEIL/BPV4、SEIL/x86 Fuji
  • seil8: SEIL/X4、SEIL/x86 Ayame

と分類されます。この記事ではseil8 静的IPv4アドレスのルーティングベースIPsecでのIKEを、復号済パケットキャプチャを見ながら解説します。

本記事の検証中のパケットキャプチャ

本記事の検証で採取したパケットキャプチャはGitHubにアップロードしました。

Wiresharkで開いたら、Edit -> Preferences -> Protocols -> ISAKMP -> IKEv1 Decryption Table Edit… で以下のエントリを追加してください。

  • Initiator’s COOKIE: 80f5f36ce1766d90
  • Encryption Key: 4fab73ae45d51536fc833c695acb8ea75a7e59af2cc5b49eaeb7b83ccb1f4953
IKEv1 Decryption Tableエントリの追加

IKEv1 Decryption Tableエントリの追加

また、Edit -> Preferences -> Protocols -> ESP の “Attempt to detect/decode encrypted ESP payloads” にチェックを入れて、ESP SAs Edit… で以下のエントリを追加してください。

  • Protocol: IPv4
  • Src IP: 10.0.0.1
  • Dest IP: 10.0.0.1
  • SPI: 0xced62df9
  • Encryption: AES-CBC [RFC3602]
  • Encryption Key: 0x1bc9cc7a1ffc85bb3825e4d0c17d5980a6ff776a8849d9090f1cfa2db9dbb51a
  • Authentication: HMAC-SHA-256-128 [RFC4868]
  • Authentication Key: 0x539b9eab02eac2dda3f41bb0da3778d9963129b916eee10ef4ca5b3db3fe7e2c
ESP SAsエントリの追加

ESP SAsエントリの追加

OKを押してPreferenceウィンドウを閉じたら、Analyze -> Reload Lua Plugins (Ctrl+Shift+L) で設定を反映してください。(Lua PluginがバンドルされていないWiresharkには “Reload Lua Plugins” がありません。その場合Wiresharkを再起動してください)これでパケットキャプチャの #978-1005(Wiresharkのパケット番号は #<number> と表記することにします)の一部が復号されます。

全てのパケットを復号するにはこの調子で数十エントリ追加する必要がありますが、WiresharkのGUIで編集するのはとても大変です。以下のファイルを直接編集することにします。

  • IKEv1 Decryption Table (Windows): C:\Users\<user>\AppData\wireshark\esp_sa (%APPDATA%\Wireshark\ikev1_decryption_table)
  • ESP SAs (Windows): C:\Users\<user>\AppData\wireshark\esp_sa (%APPDATA%\Wireshark\esp_sa)
  • IKEv1 Decryption Table (Linux, macOS): ~/.config/wireshark/ikev1_decryption_table
  • ESP SAs (Linux, macOS): ~/.config/wireshark/esp_sa

これらのファイルに以下のテキストを追加・保存して、WiresharkでCtrl+Shift+Lで反映してください。

ikev1_decryption_table:

80f5f36ce1766d90,4fab73ae45d51536fc833c695acb8ea75a7e59af2cc5b49eaeb7b83ccb1f4953
e5a103a12f35e2e3,f67b84f7e2246fe6618aaea070c9c0f3827e512dfa83e9a4c9deee9e95431f5d
1e5638a4bca01bce,9375dde016cd43984047edb3904f83dd78be0f08f12c707af99eaf3a6e3f7042
0950d862a874c109,5929ddea253a76676dc7134d63aa7dd10765fae1e5e864dcd58ba033213a9b60
4772cd91ae9357cd,fbb34949f2b9b1787344af7067cb254d9cd290fe3fd5d181c47c1ae7e8f20948
2c838e9051164491,77f2af8720b25bd3cca22bfe4e87195c16a93910463c25f73fa4fbdf0eefbe7b
ecb34c4f68331470,801ce2be163d373c6aadeb818ac78d530cfdd282b2e10085d2d3bbcb004da36a
3584374a124f0bd9,c55c262d6fb4499ff48f02d7846e965ee11ca083bb8acf3c1a036ed701f06a2c
980f58fa3129f8c9,622553a89f8f2b0975a9daa18ed15412023255937c1f8f6d3a553ba0e0a60a86
3ee9f13b448e57c4,09dd9befa38717c330a62634ecd11dffc3b7f59e05fa3a02ec64c0f427499f03
288c294ab254529b,2ee8f41a780907bbe96a646aadae9663bb8b99edc95f2bcf9aa18e78d4d5e9f8
752e56cbe95dbe92,ad28f9f1b061aa398a7d409dc2ab139b71687c5b733b1bb008b04b436d31081c
dae30a88d1ade7f1,223e71f7f1057303a167b80e5264ac777a57563ed4051e0f4860b81f5ed251c1
58fa6c0d7408ae8d,3a26acde7b48db1757585733150a3d550800b95415dd33b9f69fa96e134c7e04
bf3c82c7fa734779,0dcc2e33c66e3ee768b1d0c6de9eaa9c3ee68494b25bd13363c122335750794d
99e43b0a8296e82b,05ad27324764f25a394a49fa86835b3e6fa8b5723af7e77a882c710d1480fe05
8c2a6542d4404ee0,b9fcf4821a1ef5bb0be22c489e9be4ba8098b910b3962eef5432ff683f41e6dd
0d7498ce2f6b04bf,7a7b970c862a821528d945c3be4fd3604734dc8def1a87b92a8df1ad3a2efae6
f779c4b3f79c8d12,9e5a48e7bb724b0d9580c2ea970dab597cb35215a5085bc4353a7659f901b334
28935cad2e003665,8d103068292e5fd2ad9a41c5c431b838445827265d71c810976475d36c39d235
97cdde1ff3ca3182,3e7a605b8e062d464ca2b0b5180da57e11302a3a70239870d73f7deaa912ef70
fb4a8404d2b8ba9f,0ddbbf585b46278591efd20fde1c65f4faa70f8a21134fad24a8e569b24a1a98
81efc36317cf7dd9,d5d89aa52b2bf2c8ebeeac56e7bd0cf4e49bb257f3eeb370bb09c48b648a47b7
d8ad22e1602d929b,f7fe0266a1bbbc4a806c03ef1e905ddd2ac40a8828c60726fec4f8358337384f
6fba47552d9a42f5,5a610681465faa91c27cc1b14e5b774525c0a44143fab7d486f6ce2597c28654
7055029f9c953c30,39d3460fe4bc20325af36cc520daf7c84eb1940617b8e6e08a60453aabfb5705
7239f352635402ff,6ce5e7ef1225bd832a3c5f225555d6ac091627eb868365beccdd7838f09ba787
c1ec37bf405d52e9,820c5ea2b9bc5db249e55f975d8824230124dc7dce359df939ce043cccff5b53
d3a9819dcac0dd39,852fc7792c53779259f2a6ce1ad858ebae7be3106acefd68ca0ec15fabeee02c
42966652d40928b0,bd82ac855b522ac876533ee814010b773218c2b7adc498374b01bcdf46e6cff4
84d51a61f762c623,72fee02de4aa916fd07135255df89b7ae7b842dd9db25edd85cfed18e4ea7fa2
8e6ab294ac90d6ca,b79b22490d3163cc547328d5259af254b1a3174705807a9928ded199a7810403
f85160166971e929,d2f7ae616658d47637fe8c23435bc8abcf9326347c40c611b74c9bbb88b5316c
3e630be8eae722e3,dcef839bf5b480be00163fc8ebce21b5f497d3a405a6e71099160e411f63958f
d1283968093c21b0,782109f33daf14fc52d2339a72244303bf3137e73edb9e14e4cc4514aec25654
27951c0311583ac7,c3e80d5fcf7bd5dd40e85c8d42ed0fe227bd7993f3cd78d0ae2ab9e7863b6a78
6c8567e8ff779551,9d2416602975abd35e733aa77bd59eee8917d357427be0b88d79787a3d2636c7
99e0f23c2e637b39,8c187de2d66d8e3ec5cc152cf6f13154a1d4423b100acddde4574c58ec3ffbf5
4e33679615665543,9bd96ad8a6b62f3472d27d9504e0a728b990b2f6b9a9f1b8037466d4bdece533
08eaaecfc7ae22c9,aec92fcd291a48dfb1d4c317cba95e3dc1af634bd875b7827ea84b74983946a6
f370c15d13d07465,49d9d805fc1813c0d04fc1ba25d3caec7c8a3ba95439af2ccc88811e7c5449b3

esp_sa:

"IPv4","10.0.0.1","10.0.0.2","0xced62df9","AES-CBC [RFC3602]","0x1bc9cc7a1ffc85bb3825e4d0c17d5980a6ff776a8849d9090f1cfa2db9dbb51a","HMAC-SHA-256-128 [RFC4868]","0x539b9eab02eac2dda3f41bb0da3778d9963129b916eee10ef4ca5b3db3fe7e2c"
"IPv4","10.0.0.2","10.0.0.1","0x0debf9ad","AES-CBC [RFC3602]","0x8312bbc91233727a835ffa67cd9f77cbc20c7b4846f27accd80e18118e2bc77a","HMAC-SHA-256-128 [RFC4868]","0x68c51a51686512ee0a67865cf76c6f17ec87be65f90e2b3a28e2ab7ac8a356d3"
"IPv4","10.0.0.2","10.0.0.1","0x0d19404b","AES-CBC [RFC3602]","0x7937c9651df7a0ce774186e3a5b3dd69","HMAC-SHA-256-128 [RFC4868]","0x47bf10b6acf76a379f65c1f560b2152a8d62c16a22fd48a9ec722b99bfb1f0ae"
"IPv4","10.0.0.1","10.0.0.2","0xc30f4395","AES-CBC [RFC3602]","0x0a13d53186bfb48647a4229a5b587597","HMAC-SHA-256-128 [RFC4868]","0x1310af7f944ea13f27e71e5aeacefed75b9a97a2ee4eaeac1f4f19de620b65af"
"IPv4","10.0.0.1","10.0.0.2","0xc44c0da1","AES-CBC [RFC3602]","0x1543cceb775d202d4fd5d6a6d7b4f8a4cdd252eeec8d06e4531477a66f827a1b","HMAC-SHA-256-128 [RFC4868]","0xbfe2cbe3b9601b66a81c161b5bfffd2716608c62d772b65724a7a4b4b0483593"
"IPv4","10.0.0.2","10.0.0.1","0x02c29b2e","AES-CBC [RFC3602]","0x78e5b8790b46ae71687e97f7799e89cd05dd36bfdb6b187a125e2afd6a0b2c75","HMAC-SHA-256-128 [RFC4868]","0x7f2f3f5971657fd821d6b165f3c1feea3321171b725dbfe957fa3c58ca2ff928"
"IPv4","10.0.0.1","10.0.0.2","0xc356d700","AES-CBC [RFC3602]","0x5d5492f8ee2d8c81a50efec34d7d89105c65620b166d64678635e659d452818b","HMAC-SHA-256-128 [RFC4868]","0x73450ed2421cb4f650dc94392e3fddd3bf5787fe4eb221a16b80e5884532b239"
"IPv4","10.0.0.2","10.0.0.1","0x073aa3b5","AES-CBC [RFC3602]","0xca76f0dd7a62a5d84178a95986fdde7d544bfab4c67c0b33eb0060a7f8fd6225","HMAC-SHA-256-128 [RFC4868]","0x0937ac64035a94a2554da825273afc586894ab5d2963fa9fb3095a95c6075c8f"
"IPv4","10.0.0.1","10.0.0.2","0xc3139aa0","AES-CBC [RFC3602]","0xf2362201e8528b74641ca9218d4dd09d6d50f762c83c2b9bc3cd34cfe8877ad7","HMAC-SHA-256-128 [RFC4868]","0x783ec7cb4dc82aa986748a61fc83add3728ce4c30f3a2808761c62ec519f77fa"
"IPv4","10.0.0.2","10.0.0.1","0x0b8e5b6f","AES-CBC [RFC3602]","0x814e18d2040f01c9b389e84a27275706e1339687dd4666ffcaf10f85f6d3d169","HMAC-SHA-256-128 [RFC4868]","0xb674b599b6f35d00ea8a5c7fa20a26f435290a1a964e31d8d5e66dbc60236316"
"IPv4","10.0.0.1","10.0.0.2","0xcfc53aed","AES-CBC [RFC3602]","0x831afa6c887323e5d24e45893b8d04bb2dd2e5bb5944eefa2697d1006a56f077","HMAC-SHA-256-128 [RFC4868]","0x72d05a422b74c0e53594ea546a3f2bef0aebea50bbe1c5197f75bdcbf0d3b9e7"
"IPv4","10.0.0.2","10.0.0.1","0x0c958257","AES-CBC [RFC3602]","0x51bea807824d1ae5b76c6c7071a8e294ee54337cda9b39dc062df167e8619951","HMAC-SHA-256-128 [RFC4868]","0x109f67adf4678feceed148383d415fc4c71ab0f4e446668e600a690af3cf5ca5"
"IPv4","10.0.0.1","10.0.0.2","0xc2bd63be","AES-CBC [RFC3602]","0x07ce81c946fa007b1540902703430ddd5b8adc9ec929bca681078bec3c16a33d","HMAC-SHA-256-128 [RFC4868]","0xadc9cbd295e1b3d7d4ed9cae422b1b6fda9217515fdcc9fee2fa5d207d9b1171"
"IPv4","10.0.0.2","10.0.0.1","0x032df195","AES-CBC [RFC3602]","0x5786886060bb982ec7b93b4a7897bc02c204e93ce5cfa6b4468346168c9e9694","HMAC-SHA-256-128 [RFC4868]","0xe39bbc6caaed197d77482939ec10ba4eae359dc3962cd1aec253c899376adcb6"
"IPv4","10.0.0.1","10.0.0.2","0xcb06cd8a","AES-CBC [RFC3602]","0x7463c13406f8422557e15b081232ca1fd8fa0c53ab4b71ef5f291321402496e9","HMAC-SHA-256-128 [RFC4868]","0xfb634164c05f39df8e03caa9fdea18091f56aa5ac8dda633481598323f59aaf6"
"IPv4","10.0.0.2","10.0.0.1","0x035152f8","AES-CBC [RFC3602]","0xc4c3bf78d846c49cda6bdf8cce739b42bb0bb5da5c090c58570c3be857731cc9","HMAC-SHA-256-128 [RFC4868]","0x58be9b6a68f94d9d611c6d1bfacbbbc07ba23bc4435773126b5300a7aaf489f5"
"IPv4","10.0.0.1","10.0.0.2","0xc651f889","AES-CBC [RFC3602]","0x4acbc81f96e22954461247af9a689378da06267f7546806acbecedc4278e2cf0","HMAC-MD5-96 [RFC2403]","0x3586956770019459f2701462c88b1ea7"
"IPv4","10.0.0.2","10.0.0.1","0x0d4a2a31","AES-CBC [RFC3602]","0xe228921a0e592d02ab8b7b8915afc7605841870a4c968101b25e321e90a41f8b","HMAC-MD5-96 [RFC2403]","0x78ec1fc8c3fa52243e50662b60e15e55"
"IPv4","10.0.0.1","10.0.0.2","0xcbfbe08a","AES-CBC [RFC3602]","0xe7ba0bea053d3634cdb47515477e93e6ad66ffd697d21a04f28b6b22a3c9e14a","HMAC-SHA-256-128 [RFC4868]","0xb8b40d77cb8abfe76c2fd01cb1a8b2c82eea69cbdcddceb1c8b598c23a7af67c"
"IPv4","10.0.0.2","10.0.0.1","0x01411b0a","AES-CBC [RFC3602]","0x7d9aa87e956e335c41ffbb4e583798c17208ec6c5ee8878c465dbeff35cad2f9","HMAC-SHA-256-128 [RFC4868]","0x163c436bf216b7f6690ecc4b7ded713f0f23e6429356e9dc22e18bbf1e514454"
"IPv4","10.0.0.1","10.0.0.2","0xcd4b0c11","AES-CBC [RFC3602]","0x3f9f6f16f918a69d21a66ad404a5f26dbc77eec43826f09105e1f933066aae00","HMAC-SHA-256-128 [RFC4868]","0xc9a2eba32904e99905133a655d8268776909a97259df326c0f7d9b5026e68c06"
"IPv4","10.0.0.2","10.0.0.1","0x0ddb57b9","AES-CBC [RFC3602]","0x2931d7d2ce9bcb05f198f08091045e4d4ccef6b87c9dd8ef4861ca4580dd9b83","HMAC-SHA-256-128 [RFC4868]","0xa35449148dd6df649082414aa6f7e8a1a8da70f3dde66c1ff32b37d03052fea3"
"IPv4","10.0.0.1","10.0.0.2","0xc9248074","AES-CBC [RFC3602]","0x7f8254197f3b18667377a51d75d233ecb3850482b1ea307be57360f17afe9dd0","HMAC-SHA-256-128 [RFC4868]","0x5f73d8068bcc15211997ac992412a912db46390d76125fb1c9fc17678e8fcff0"
"IPv4","10.0.0.2","10.0.0.1","0x03dd5368","AES-CBC [RFC3602]","0x15d6c1fedbc5f965c74dd3ce5e73752d12bd30a5f5ee60cfd0d9d3692026b6e3","HMAC-SHA-256-128 [RFC4868]","0x125269aacbb856d6c0a3b8b981839585bad5cf47a2f2a0714e08aaece15a2a4e"
"IPv4","10.0.0.1","10.0.0.2","0xca50716d","AES-CBC [RFC3602]","0x6dbbd4848f03645179f3b17ec11db13515b00721f8a69f8a5cc08177b3fcc764","HMAC-SHA-256-128 [RFC4868]","0x1d94bf804e77aedc8f31e8cc26ba97139932ded09ce4c6f53bd644f11160e0d9"
"IPv4","10.0.0.2","10.0.0.1","0x01d729bd","AES-CBC [RFC3602]","0xddeb898d403f944a20dd22129d6f47c6d13d74bd46f51cc12cbbe28f20e61e21","HMAC-SHA-256-128 [RFC4868]","0x3f9765f01393edec79cf19af2b7a70b483d3c3822c096873bb9d4d868d2ff3b3"
"IPv4","10.0.0.1","10.0.0.2","0xc346eed9","AES-CBC [RFC3602]","0x0f8bdadccbe7a375ddd05d991f4e9fda698d0fca2c17803907716e6f7c515f05","HMAC-SHA-256-128 [RFC4868]","0x51cb3bfa7e14866f5f98fcf5e80ca85c02f23faf1b2d359a365cfe2a9d880b1e"
"IPv4","10.0.0.2","10.0.0.1","0x0829486d","AES-CBC [RFC3602]","0xe5d20a2e14c7816c5b965c39d2b27f7000054817caff99ffc0098665dc118327","HMAC-SHA-256-128 [RFC4868]","0x157ba0402048c858185ce174765fc19a2706d07e6bc9c2edae3f262da2cc7af8"
"IPv4","10.0.0.1","10.0.0.2","0xc6252033","AES-CBC [RFC3602]","0xd6cb8a6d573e78dc762cfffa4677d8b86d0dc7c02a833e251bbcaae2b524dae0","HMAC-SHA-256-128 [RFC4868]","0xa6df168f9a8dd137055de37841810cad0e9ce775c01df4222e6a82d68dd2c2c5"
"IPv4","10.0.0.2","10.0.0.1","0x02cee8e9","AES-CBC [RFC3602]","0xaf0db9b630934423811115bf1c589058538fe932bdf7e517ff495045151a7850","HMAC-SHA-256-128 [RFC4868]","0xa41ee42ef1e0799df710efb9c2e28efd121e7c618d2f64a9d453329f63b9b8dc"
"IPv4","10.0.0.1","10.0.0.2","0xc77b48bc","AES-CBC [RFC3602]","0xa6dfcff0f8b3fd4f61178dd50af7483da0dbca19f6e3581ff840ce0362d892a9","HMAC-SHA-256-128 [RFC4868]","0x0a3297ab40bcaef62bdd2be6398cabf53c2bc6e402cbc819da5d3fe245b9d593"
"IPv4","10.0.0.2","10.0.0.1","0x06271fb6","AES-CBC [RFC3602]","0xe5979d5c137632bea315a38d81302c3b57200f8518dd5af0675b993feb0c309d","HMAC-SHA-256-128 [RFC4868]","0xce82f8cf6cf497ae5dc8e52d84d990b92d9e33593f295d821733412aece32df3"
"IPv4","10.0.0.1","10.0.0.2","0xc9640948","AES-CBC [RFC3602]","0xcfd68e5d9063b0a7cb6e8d9491839e350965d59af8549c340f4f362b3e2581c7","HMAC-SHA-256-128 [RFC4868]","0xabf00f35cb10240711fc8195447e73960580482e989bd9abe218b904570cf56d"
"IPv4","10.0.0.2","10.0.0.1","0x0ff91313","AES-CBC [RFC3602]","0xdbbc84853c59928eae10eebe0bb34099be832a1fe0ba68a10ce06001cff04473","HMAC-SHA-256-128 [RFC4868]","0x2ba314b908d3735238b45654f3d7124ad58437a26038581dd5a8f5b4e4b6703c"

これらのパラメータはstrongSwanのsave-keys plugin で取得しました。

ネットワーク構成

seil8の機種としてはQEMU (qemu-system-x86_64) 上で動作するSEIL/x86 Ayameを利用しました。 対向機器はQEMU上で動作するUbuntu 20.04のstrongSwanです。

192.168.1.0/24 <--> 192.168.2.0/24
                                          ______________ IPsec _______________
                       ge1    ge0        /                                    \
            192.168.1.1/24    10.0.0.1/24                                      10.0.0.2/24      192.168.2.1/24
192.168.1.0/24 ---------- SEIL ---------------------------------------------------------- remote -------------- 192.168.2.0/24

最小設定でのIKE折衝

IKE/IPsecを確立するためのパケットのやりとりを「折衝」と呼びます。 静的IPv4ルーティングベースIPsecでstrongSwanと折衝するための最小設定は以下になります。 念のためstrongSwanのコンフィグも貼っておきます。

# SEIL config
route.ipv4.1.destination:                                 : 192.168.2.0/24
route.ipv4.1.gateway:                                     : ipsec0
interface.ge0.ipv4.address                                : 10.0.0.1/24
interface.ge1.ipv4.address                                : 192.168.1.1/24
interface.ipsec0.preshared-key                            : xeeB5gohvaYi
interface.ipsec0.ipv4.source                              : 10.0.0.1
interface.ipsec0.ipv4.destination                         : 10.0.0.2
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.local  : 192.168.1.0/24
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.remote : 192.168.2.0/24

# strongSwan config - /etc/ipsec.conf
conn %default
        authby=secret
        keyexchange=ikev1
conn seil
        left=10.0.0.2
        leftsubnet=192.168.2.0/24
        right=10.0.0.1
        rightsubnet=192.168.1.0/24
        ike=aes256-sha256-modp1536!
        auto=add

# strongSwan config - /etc/ipsec.secrets
# 以降も同じ設定
10.0.0.1 : PSK xeeB5gohvaYi

このコンフィグでのパケットは #978-1005 です。

#978-1005 最小設定でのIKE折衝

#978-1005 最小設定でのIKE折衝

SEILで “IKE” と呼んでいるのは、version 1の “IKEv1” です。 IKEv1/IPsecの折衝はIKEv1プロトコルで行われますが、Wiresharkには “ISAKMP” と出ています。 RFC 2408 ISAKMPは抽象的なプロトコルになっていて、 その具体的なプロトコルの1つがRFC 2409 IKEv1です。 この記事では ISAKMP = IKE = IKEv1 とします。

IKE/IPsecの折衝は基本的に

--> Identity Protection
<-- Identity Protection
--> Identity Protection
<-- Identity Protection
--> Identity Protection
<-- Identity Protection
--> Quick Mode
<-- Quick Mode
--> Quick Mode

の9パケットで確立します。ここで、--> はSEILからの送信、<-- はSEILの受信を表します (RFC 2409の表記)。 その後、IPsecによる暗号通信が可能になります (No.988-)。

“IPsec” はRFC 4301等で定義される、 IPの暗号化のアーキテクチャを指す広い意味を持った言葉ですが、 暗号化プロトコルとしてはESP (Encapsulating Security Payload) と呼ばれるプロトコルが使われます。 (ESPと並んでAH (Authentication Headers) というプロトコルもありますが、 こちらは暗号化は行わずにパケットの認証だけを行うプロトコルです。 AHはseil8に対応していません。 この記事ではESPのみ取り扱います。)

パケット #988 はLinux 192.168.2.1 からSEIL 192.168.1.1 にpingを送信した際のものです。

#988 Linux 192.168.2.1 からSEIL 192.168.1.1 へのping(ESP復号済)

#988 Linux 192.168.2.1 からSEIL 192.168.1.1 へのping(ESP復号済)

Ethernet / IPv4 (10.0.0.2 -> 10.0.0.1) / ESP / IPv4 (192.168.2.1 -> 192.168.1.1) / ICMP という構造になっています。ここで注意して頂きたいのが、ESPの下の IPv4(192.168)/ICMP は暗号化されていることです。 ESPの設定の “Attempt to detect/decode encrypted ESP payloads” のチェックを外すと “Data” と表示され中身が分からなくなります。

#988 暗号化されたping

#988 暗号化されたping

192.168.1.1 <–> 192.168.2.1 の通信は、10.0.0.1 <–> 10.0.0.2 の暗号トンネルを経由して行われて、VPNとして機能していることが分かります。

実際にSEILでIKE/IPsecの検証を行う際は、

    • show log
    • show status ike
    • show status ipsec
    • show status ipsec.security-policy
    • show status interface.ipsec0
    • 対向機器のログ・ステータス
    • マニュアル

も参照してください。全て載せると長くなりすぎるので、この記事では割愛します。

他の細かいことは以下で解説していきます。

Initiator/Responder

SEILに interface.ipsec0.responder-only : enable を追加して、 strongSwanの auto=addauto=start に変更します。

# SEIL config
interface.ipsec0.preshared-key                            : xeeB5gohvaYi
interface.ipsec0.ipv4.source                              : 10.0.0.1
interface.ipsec0.ipv4.destination                         : 10.0.0.2
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.local  : 192.168.1.0/24
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.remote : 192.168.2.0/24
interface.ipsec0.responder-only                           : enable

# strongSwan config - /etc/ipsec.conf
conn %default
        authby=secret
        keyexchange=ikev1
conn seil
        left=10.0.0.2
        leftsubnet=192.168.2.0/24
        right=10.0.0.1
        rightsubnet=192.168.1.0/24
        ike=aes256-sha256-modp1536!
        auto=start

最小設定ではSEILから折衝を開始していましたが、responder-only : enable を設定することでSEILからは折衝を開始しなくなります。strongSwanはその逆で、自ら折衝を開始するように設定変更しました。

パケットは #1010-1021 で、strongSwan (10.0.0.2) から折衝を始めていることが分かります。ここからはWiresharkのスクリーンショットの代わりにテキストを貼っていきます。

No.	Time	Source	Destination	sport	dport	Protocol	Length	Info
1010	16:06:23.846350600	10.0.0.2	10.0.0.1	500	500	ISAKMP	258	Identity Protection (Main Mode)
1011	16:06:23.848403297	10.0.0.1	10.0.0.2	500	500	ISAKMP	206	Identity Protection (Main Mode)
1012	16:06:23.858053484	10.0.0.2	10.0.0.1	500	500	ISAKMP	374	Identity Protection (Main Mode)
1013	16:06:23.860678778	10.0.0.1	10.0.0.2	500	500	ISAKMP	398	Identity Protection (Main Mode)
1014	16:06:23.882155609	10.0.0.2	10.0.0.1	500	500	ISAKMP	150	Identity Protection (Main Mode)
1015	16:06:23.883331356	10.0.0.1	10.0.0.2	500	500	ISAKMP	134	Identity Protection (Main Mode)
1016	16:06:23.883893129	10.0.0.1	10.0.0.2	500	500	ISAKMP	150	Informational
1017	16:06:23.889781724	10.0.0.2	10.0.0.1	500	500	ISAKMP	262	Quick Mode
1018	16:06:23.894820899	10.0.0.1	10.0.0.2	500	500	ISAKMP	230	Quick Mode
1019	16:06:23.908516295	10.0.0.2	10.0.0.1	500	500	ISAKMP	118	Quick Mode
1020	16:06:27.660827582	192.168.2.1	192.168.1.1			ICMP	170	Echo (ping) request  id=0x0005, seq=445/48385, ttl=64 (reply in 1021)
1021	16:06:27.661736677	192.168.1.1	192.168.2.1			ICMP	170	Echo (ping) reply    id=0x0005, seq=445/48385, ttl=255 (request in 1020)

折衝を始めた側は “Initiator”、その対向は “Responder” と呼ばれます。 SEILのコンフィグの responder-only という名前はこの用語から来ています。

設定によっては「SEILがinitiator (or responder) のときだけIPsecが確立する」のようなことがよくあります。 トラブルシューティングの際は、responder-only を使ってこの事象の有無をチェックすることも問題の切り分けポイントになります。

Phase1プロポーザル

interface.ipsec0.ike.proposal.phase1.** を追加してみます。

# seil config
interface.ipsec0.preshared-key                              : xeeB5gohvaYi
interface.ipsec0.ipv4.source                                : 10.0.0.1
interface.ipsec0.ipv4.destination                           : 10.0.0.2
interface.ipsec0.ike.proposal.phase1.lifetime               : 777
interface.ipsec0.ike.proposal.phase1.encryption.0.algorithm : aes256
interface.ipsec0.ike.proposal.phase1.hash.0.algorithm       : sha256
interface.ipsec0.ike.proposal.phase1.dh-group               : modp1024
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.local    : 192.168.1.0/24
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.remote   : 192.168.2.0/24
interface.ipsec0.responder-only                             : enable

# strongSwan config - /etc/ipsec.conf
conn %default
        authby=secret
        keyexchange=ikev1
conn seil
        left=10.0.0.2
        leftsubnet=192.168.2.0/24
        right=10.0.0.1
        rightsubnet=192.168.1.0/24
        ike=aes256-sha256-modp1536!
        auto=add

このときの折衝は #3005-3006 です。

No.  Time         Source   Destination sport dport Protocol Length Info
3005 09:29:28.128 10.0.0.1 10.0.0.2    500   500   ISAKMP   206    Identity Protection (Main Mode)
3006 09:29:28.142 10.0.0.2 10.0.0.1    500   500   ISAKMP   98     Informational

折衝が

  • –> Identity Protection
  • <– Informational

の1往復で終わってしまいました。これはstrongSwanに折衝が拒否されています。まずSEILが送ったIdentity Protectionから見ていきましょう。左に最小設定でのパケット (#1010)、右に interface.ipsec0.ike.proposal.phase1.** を設定したパケット (#3005) を貼ります。

#1010                                                                             # 3005
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)   Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
User Datagram Protocol, Src Port: 500, Dst Port: 500                              User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol                         Internet Security Association and Key Management Protocol
    Initiator SPI: 91d78f3b8712fb9a                                                   Initiator SPI: 442f96f6896a2deb
    Responder SPI: 0000000000000000                                                   Responder SPI: 0000000000000000
    Next payload: Security Association (1)                                            Next payload: Security Association (1)
    Version: 1.0                                                                      Version: 1.0
    Exchange type: Identity Protection (Main Mode) (2)                                Exchange type: Identity Protection (Main Mode) (2)
    Flags: 0x00                                                                       Flags: 0x00
    Message ID: 0x00000000                                                            Message ID: 0x00000000
    Length: 360                                                                       Length: 164
    Payload: Security Association (1)                                                 Payload: Security Association (1)
        Next payload: Vendor ID (13)                                                      Next payload: Vendor ID (13)
        Reserved: 00                                                                      Reserved: 00
        Payload length: 252                                                               Payload length: 56
        Domain of interpretation: IPSEC (1)                                               Domain of interpretation: IPSEC (1)
        Situation: 00000001                                                               Situation: 00000001
        Payload: Proposal (2) # 1                                                         Payload: Proposal (2) # 1
            Next payload: NONE / No Next Payload  (0)                                         Next payload: NONE / No Next Payload  (0)
            Reserved: 00                                                                      Reserved: 00
            Payload length: 240                                                               Payload length: 44
            Proposal number: 1                                                                Proposal number: 1
            Protocol ID: ISAKMP (1)                                                           Protocol ID: ISAKMP (1)
            SPI Size: 0                                                                       SPI Size: 0
            Proposal transforms: 6                                                            Proposal transforms: 1
            Payload: Transform (3) # 1                                                        Payload: Transform (3) # 1
                Next payload: Transform (3)                                                       Next payload: NONE / No Next Payload  (0)
                Reserved: 00                                                                      Reserved: 00
                Payload length: 40                                                                Payload length: 36
                Transform number: 1                                                               Transform number: 1
                Transform ID: KEY_IKE (1)                                                         Transform ID: KEY_IKE (1)
                Reserved: 0000                                                                    Reserved: 0000
                IKE Attribute (t=11,l=2): Life-Type: Seconds                                      IKE Attribute (t=11,l=2): Life-Type: Seconds
                IKE Attribute (t=12,l=4): Life-Duration: 86400                                    IKE Attribute (t=12,l=2): Life-Duration: 777
                IKE Attribute (t=1,l=2): Encryption-Algorithm: AES-CBC                            IKE Attribute (t=1,l=2): Encryption-Algorithm: AES-CBC
                IKE Attribute (t=14,l=2): Key-Length: 256                                         IKE Attribute (t=14,l=2): Key-Length: 256
                IKE Attribute (t=3,l=2): Authentication-Method: Pre-shared key                    IKE Attribute (t=3,l=2): Authentication-Method: Pre-shared key
                IKE Attribute (t=2,l=2): Hash-Algorithm: SHA2-256                                 IKE Attribute (t=2,l=2): Hash-Algorithm: SHA2-256
                IKE Attribute (t=4,l=2): Group-Description: 1536 bit MODP group                   IKE Attribute (t=4,l=2): Group-Description: Alternate 1024-bit MODP group
            Payload: Transform (3) # 2                                                Payload: Vendor ID (13) : KAME/racoon
                Next payload: Transform (3)                                           Payload: Vendor ID (13) : RFC 3706 DPD (Dead Peer Detection)
                Reserved: 00                                                          Payload: Vendor ID (13) : RFC 3947 Negotiation of NAT-Traversal in the IKE
                Payload length: 40                                                    Payload: Vendor ID (13) : draft-ietf-ipsec-nat-t-ike-02\n
                Transform number: 2
                Transform ID: KEY_IKE (1)
                Reserved: 0000
                IKE Attribute (t=11,l=2): Life-Type: Seconds
                IKE Attribute (t=12,l=4): Life-Duration: 86400
                IKE Attribute (t=1,l=2): Encryption-Algorithm: AES-CBC
                IKE Attribute (t=14,l=2): Key-Length: 256
                IKE Attribute (t=3,l=2): Authentication-Method: Pre-shared key
                IKE Attribute (t=2,l=2): Hash-Algorithm: SHA
                IKE Attribute (t=4,l=2): Group-Description: 1536 bit MODP group
            Payload: Transform (3) # 3
                ...
            Payload: Transform (3) # 4
                ...
            Payload: Transform (3) # 5
                ...
            Payload: Transform (3) # 6
                ...
    Payload: Vendor ID (13) : KAME/racoon
    Payload: Vendor ID (13) : RFC 3706 DPD (Dead Peer Detection)
    Payload: Vendor ID (13) : RFC 3947 Negotiation of NAT-Traversal in the IKE
    Payload: Vendor ID (13) : draft-ietf-ipsec-nat-t-ike-02\n

Payload: Security Association (1) がスッキリしました。内容は以下のようになっています。

最小設定 (#1010):
entry  Life-Type  Life-Duration  Authentication-Method  Encryption  Hash    Group
1      Seconds    86400          Pre-shared key (psk)   aes256      sha256  modp1536
2      Seconds    86400          Pre-shared key (psk)   aes256      sha1    modp1536
3      Seconds    86400          Pre-shared key (psk)   aes128      sha256  modp1536
4      Seconds    86400          Pre-shared key (psk)   aes128      sha1    modp1536
5      Seconds    86400          Pre-shared key (psk)   3des        sha256  modp1536
6      Seconds    86400          Pre-shared key (psk)   3des        sha1    modp1536

interface.ipsec0.ike.proposal.phase1.** を設定 (#3005):
entry  Life-Type  Life-Duration  Authentication-Method  Encryption  Hash    Group
1      Seconds    777            Pre-shared key (psk)   aes256      sha256  modp1024

#3005 には、

interface.ipsec0.ike.proposal.phase1.lifetime               : 777
interface.ipsec0.ike.proposal.phase1.encryption.0.algorithm : aes256
interface.ipsec0.ike.proposal.phase1.hash.0.algorithm       : sha256
interface.ipsec0.ike.proposal.phase1.dh-group               : modp1024

が反映されていることが分かります。これはISAKMPで使う暗号方式とISAKMP SAのライフタイム(後述)の提案 (proposals) になっています。以下の図の 3-9. で使う暗号方式の提案です。

-->  ISAKMP 1. Identity Protection  Phase 1  平文 ┐  Phase 1プロポーザルの折衝
<--  ISAKMP 2. Identity Protection  Phase 1  平文 ┘
-->  ISAKMP 3. Identity Protection  Phase 1  平文 ┐  IKE公開鍵交換 (1. 2. で合意したDH-groupの公開鍵)
<--  ISAKMP 4. Identity Protection  Phase 1  平文 ┘
-->  ISAKMP 5. Identity Protection  Phase 1  暗号 ┐ 1. 2. で合意した暗号方式、3. 4. で生成した共有鍵で暗号化
<--  ISAKMP 6. Identity Protection  Phase 1  暗号 │
-->  ISAKMP 7. Quick Mode           Phase 2  暗号 │ ┐ Phase 2プロポーザルの折衝
<--  ISAKMP 8. Quick Mode           Phase 2  暗号 │ ┘
-->  ISAKMP 9. Quick Mode           Phase 2  暗号 ┘
<--> ESP                                     暗号   Phase 2プロポーザルで合意した暗号方式、nonceとpskから生成した共有鍵で暗号化

6. が終わると「Phase 1の折衝が完了した」「ISAKMP SA(ISAKMPの暗号化セッション)が確立した」などと言います。このISAKMP SAを使って 7-9. のIKE Phase 2を行う訳ですが、これは次節で解説します。

最小設定 (#1010) ではphase 1プロポーザルが6つありました。これはSEILのデフォルト設定が、

  • interface.ipsec0.ike.proposal.phase1.lifetime : 86400
  • interface.ipsec[].ike.proposal.phase1.encryption.[].algorithm : aes256, aes128, 3des
  • interface.ipsec[].ike.proposal.phase1.hash.[].algorithm : sha256, sha1
  • interface.ipsec[].ike.proposal.phase1.dh-group : modp1536

となっているためです。全ての組み合わせを提案するので 1×3×2×1 = 6通り になっています。

interface.ipsec0.ike.proposal.phase1.lifetime               : 86400
interface.ipsec0.ike.proposal.phase1.encryption.0.algorithm : aes256
interface.ipsec0.ike.proposal.phase1.encryption.1.algorithm : aes192
interface.ipsec0.ike.proposal.phase1.encryption.2.algorithm : aes128
interface.ipsec0.ike.proposal.phase1.encryption.3.algorithm : 3des
interface.ipsec0.ike.proposal.phase1.hash.0.algorithm       : sha512
interface.ipsec0.ike.proposal.phase1.hash.1.algorithm       : sha384
interface.ipsec0.ike.proposal.phase1.hash.2.algorithm       : sha256
interface.ipsec0.ike.proposal.phase1.hash.3.algorithm       : sha1
interface.ipsec0.ike.proposal.phase1.dh-group               : modp1536

と設定すれば 4×4×1 = 16通り提案します (#3371)。

今回はstrongSwanからの返りの ISAKMP 2. のパケット (#3006) が、Identity Protection ではなく Informational というパケットになっていました。Identity Protection、Informationalは「ISAKMP Exchange Types」と呼ばれるものです。ここでは、

  • Identity Protection Exchange はphase 1の折衝
  • Informational Exchange は汎用的な情報通知

として使われています。ISAKMP Exchange Typesのより正確な意味はRFC 2408 4 ISAKMP Exchangesを参照してください。

#3006 の内容を見てみます。

#3006
Frame 3006: 98 bytes on wire (784 bits), 98 bytes captured (784 bits) on interface ens4, id 0
Ethernet II, Src: RealtekU_ff:85:01 (52:54:00:ff:85:01), Dst: RealtekU_ff:38:01 (52:54:00:ff:38:01)
Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 442f96f6896a2deb
    Responder SPI: 544cc5837f7aba35
    Next payload: Notification (11)
    Version: 1.0
    Exchange type: Informational (5)
    Flags: 0x00
    Message ID: 0x1b6ded22
    Length: 56
    Payload: Notification (11)
        Next payload: NONE / No Next Payload  (0)
        Reserved: 00
        Payload length: 28
        Domain of interpretation: IPSEC (1)
        Protocol ID: ISAKMP (1)
        SPI Size: 16
        Notify Message Type: NO-PROPOSAL-CHOSEN (14)
        SPI: 442f96f6896a2deb544cc5837f7aba35
        Notification DATA: <MISSING>

Notify Message Type: NO-PROPOSAL-CHOSEN (14) がポイントです。SEILは

entry  Life-Type  Life-Duration  Authentication-Method  Encryption  Hash    Group
1      Seconds    777            Pre-shared key (psk)   aes256      sha256  modp1024

という1つのphase 1プロポーザルを提案しましたが、strongSwanは「この提案は受け入れられない」と言って拒否しています。(プロポーザルentryが2つ以上ある場合は「これら提案は1つも受け入れられない」という意味です)なぜ拒否されたのかは、strongSwanのログに書いてあります。

received packet: from 10.0.0.1[500] to 10.0.0.2[500] (164 bytes)
parsed ID_PROT request 0 [ SA V V V V ]
received unknown vendor ID: 70:03:cb:c1:09:7d:be:9c:26:00:ba:69:83:bc:8b:35
received DPD vendor ID
received NAT-T (RFC 3947) vendor ID
received draft-ietf-ipsec-nat-t-ike-02\n vendor ID
10.0.0.1 is initiating a Main Mode IKE_SA
vvvvv
received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
configured proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536
^^^^^
no proposal found
generating INFORMATIONAL_V1 request 1879518641 [ N(NO_PROP) ]
sending packet: from 10.0.0.2[500] to 10.0.0.1[500] (56 bytes)

重要な部分は vvvvv ^^^^^ で示しました。MODP_1024 を提案されたけれど、MODP_1536 じゃないとだめだ、と言っていると解釈できます。これはInformational Exchangeでは教えてくれませんが、ike-scanを使えば対向機器が対応しているphase 1をスキャンできます。

strongswan.confike=aes256-sha256-modp1536!ike=aes256-sha256-modp1024! に変更すると折衝できるようになります (#3593-3601)。

Identification

前節までのISAKMPは平文だったので、普通にパケットキャプチャすれば解析できる内容でした。ここからは復号パケットを見ていくので、本記事のメインパートです。

下図の 5. 6. のパケットを見ていきます (#982-983)。

-->  ISAKMP 1. Identity Protection  Phase 1  平文 ┐  Phase 1プロポーザルの折衝
<--  ISAKMP 2. Identity Protection  Phase 1  平文 ┘
-->  ISAKMP 3. Identity Protection  Phase 1  平文 ┐  IKE公開鍵交換 (1. 2. で合意したDH-groupの公開鍵)
<--  ISAKMP 4. Identity Protection  Phase 1  平文 ┘
-->  ISAKMP 5. Identity Protection  Phase 1  暗号 ┐ #982
<--  ISAKMP 6. Identity Protection  Phase 1  暗号 ┘ #983
-->  ISAKMP 7. Quick Mode           Phase 2  暗号
<--  ISAKMP 8. Quick Mode           Phase 2  暗号
-->  ISAKMP 9. Quick Mode           Phase 2  暗号
<--> ESP                                     暗号
#982
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 80f5f36ce1766d90
    Responder SPI: 8cfaf864c7f83e09
    Next payload: Identification (5)
    Version: 1.0
    Exchange type: Identity Protection (Main Mode) (2)
    Flags: 0x01
    Message ID: 0x00000000
    Length: 92
    Encrypted Data (64 bytes)
        Payload: Identification (5)
            Next payload: Hash (8)
            Reserved: 00
            Payload length: 12
            ID type: IPV4_ADDR (1)
            Protocol ID: UDP (17)
            Port: Unused
            Identification Data:10.0.0.1
                ID_IPV4_ADDR: 10.0.0.1 (10.0.0.1)
        Payload: Hash (8)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 36
            Hash DATA: bce6c95193e84ae9f1a9fa3b3d74b7e668d786efbcc21d66…
        Extra data: 8d3ae82a97faf1f5e39f0339b0df670f

#983
Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 80f5f36ce1766d90
    Responder SPI: 8cfaf864c7f83e09
    Next payload: Identification (5)
    Version: 1.0
    Exchange type: Identity Protection (Main Mode) (2)
    Flags: 0x01
    Message ID: 0x00000000
    Length: 92
    Encrypted Data (64 bytes)
        Payload: Identification (5)
            Next payload: Hash (8)
            Reserved: 00
            Payload length: 12
            ID type: IPV4_ADDR (1)
            Protocol ID: Unused
            Port: Unused
            Identification Data:10.0.0.2
                ID_IPV4_ADDR: 10.0.0.2 (10.0.0.2)
        Payload: Hash (8)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 36
            Hash DATA: 203e729768c31086ee05b1045bf476be26143095ef206758…
        Extra data: 00000000000000000000000000000000

Payload: Identification には自分のIPアドレスが入っています。これにより「誰が折衝しているか」を識別できるようになります (RFC 2407 4.6.2RFC 2408 3.8)。

Payload: Hash は、1. 2. で折衝したhashと 3. 4. 5. 6. のデータを使ったハッシュで、パケットの認証をしています。とても複雑な計算で長くなるので割愛します (RFC 2409 5.2)。(注:prfを折衝していればhashではなくそちらを使う)以降に登場する Payload: Hash も同様に認証を行っています。

ここまでで、Phase 1の折衝が完了してISAKMP SAが確立し、ISAKMPの暗号経路ができました。

Phase 2

ここからは暗号セッションであるISAKMP SAの中で、IPsec (ESP) の設定を行っていきます。これをphase 2と呼びます。

上でPhase 1のプロポーザルを変更したのと同様に、今度はPhase 2のプロポーザルを変更してみます。

# SEIL config (#4137-4145)
route.ipv4.1.destination:                                       : 192.168.2.0/24
route.ipv4.1.gateway:                                           : ipsec0
interface.ge0.ipv4.address                                      : 10.0.0.1/24
interface.ge1.ipv4.address                                      : 192.168.1.1/24
interface.ipsec0.preshared-key                                  : xeeB5gohvaYi
interface.ipsec0.ipv4.source                                    : 10.0.0.1
interface.ipsec0.ipv4.destination                               : 10.0.0.2
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.local        : 192.168.2.0/24
interface.ipsec0.ike.proposal.phase2.proxy-id.ipv4.remote       : 192.168.1.0/24
interface.ipsec0.ike.proposal.phase2.encryption.0.algorithm     : aes256
interface.ipsec0.ike.proposal.phase2.authentication.0.algorithm : hmac-md5

# strongSwan config - /etc/ipsec.conf (#4137-4145)
conn %default
        authby=secret
        keyexchange=ikev1
conn seil
        left=10.0.0.2
        leftsubnet=192.168.2.0/24
        right=10.0.0.1
        rightsubnet=192.168.1.0/24
        ike=aes256-sha256-modp1536!
        auto=add

するとPhase 1の設定を変えたときと同様に、strongSwanのQuick Modeの応答が NO-PROPOSAL-CHOSEN になります。

4137	13:34:14.861690548	10.0.0.1	10.0.0.2	500	500	ISAKMP	402	Identity Protection (Main Mode)
4138	13:34:14.877348548	10.0.0.2	10.0.0.1	500	500	ISAKMP	182	Identity Protection (Main Mode)
4139	13:34:14.891822617	10.0.0.1	10.0.0.2	500	500	ISAKMP	398	Identity Protection (Main Mode)
4140	13:34:14.910451782	10.0.0.2	10.0.0.1	500	500	ISAKMP	374	Identity Protection (Main Mode)
4141	13:34:14.914170168	10.0.0.1	10.0.0.2	500	500	ISAKMP	134	Identity Protection (Main Mode)
4142	13:34:14.919740541	10.0.0.2	10.0.0.1	500	500	ISAKMP	134	Identity Protection (Main Mode)
4143	13:34:14.920352388	10.0.0.1	10.0.0.2	500	500	ISAKMP	150	Informational
4144	13:34:24.948959160	10.0.0.1	10.0.0.2	500	500	ISAKMP	214	Quick Mode
4145	13:34:24.954147043	10.0.0.2	10.0.0.1	500	500	ISAKMP	134	Informational  <- Quick Mode の応答が Informational: NO-PROPOSAL-CHOSEN になっている

strongSwanのログを見ると、hmac-md5を拒否していることが分かります。

received packet: from 10.0.0.1[500] to 10.0.0.2[500] (172 bytes)
parsed QUICK_MODE request 4116798141 [ HASH SA No ID ID ]
vvvvv
received proposals: ESP:AES_CBC_256/HMAC_MD5_96/NO_EXT_SEQ
configured proposals: ESP:AES_CBC_128/AES_CBC_192/AES_CBC_256/HMAC_SHA2_256_128/HMAC_SHA2_384_192/HMAC_SHA2_512_256/HMAC_SHA1_96/AES_XCBC_96/NO_EXT_SEQ, ESP:AES_GCM_16_128/AES_GCM_16_192/AES_GCM_16_256
no matching proposal found, sending NO_PROPOSAL_CHOSEN
generating INFORMATIONAL_V1 request 3892166403 [ HASH N(NO_PROP) ]
^^^^^
sending packet: from 10.0.0.2[500] to 10.0.0.1[500] (92 bytes)

これを解消するには ipsec.confesp=aes256-md5! を追加してやります (#4326-4337)。

最小設定でスルーしていた proxy-id ですが、これを消してみます (#4371-4381)。

# SEIL config (#4371-4381)
route.ipv4.1.destination:                                       : 192.168.2.0/24
route.ipv4.1.gateway:                                           : ipsec0
interface.ge0.ipv4.address                                      : 10.0.0.1/24
interface.ge1.ipv4.address                                      : 192.168.1.1/24
interface.ipsec0.preshared-key                                  : xeeB5gohvaYi
interface.ipsec0.ipv4.source                                    : 10.0.0.1
interface.ipsec0.ipv4.destination                               : 10.0.0.2

# strongSwan config - /etc/ipsec.conf (#4371-4381)
conn %default
        authby=secret
        keyexchange=ikev1
conn seil
        left=10.0.0.2
        leftsubnet=192.168.2.0/24
        right=10.0.0.1
        rightsubnet=192.168.1.0/24
        ike=aes256-sha256-modp1536!
        auto=add

そうするとQuick ModeのIdentifacation Payloadが 192.168.1.0/24、192.168.2.0/24 だった (#985) のが 0.0.0.0/0、0.0.0.0/0 になりました (#4378)。

#985                                                                             #4378
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)  Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
User Datagram Protocol, Src Port: 500, Dst Port: 500                             User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol                        Internet Security Association and Key Management Protocol
    Initiator SPI: 80f5f36ce1766d90                                                  Initiator SPI: d8ad22e1602d929b
    Responder SPI: 8cfaf864c7f83e09                                                  Responder SPI: 352dcafe83de1fa1
    Next payload: Hash (8)                                                           Next payload: Hash (8)
    Version: 1.0                                                                     Version: 1.0
    Exchange type: Quick Mode (32)                                                   Exchange type: Quick Mode (32)
    Flags: 0x01                                                                      Flags: 0x01
    Message ID: 0xb6f469ce                                                           Message ID: 0x26c2e9f3
    Length: 316                                                                      Length: 316
    Encrypted Data (288 bytes)                                                       Encrypted Data (288 bytes)
        Payload: Hash (8)                                                                Payload: Hash (8)
        Payload: Security Association (1)                                                Payload: Security Association (1)
        Payload: Nonce (10)                                                              Payload: Nonce (10)
        Payload: Identification (5)                                                      Payload: Identification (5)
            Next payload: Identification (5)                                                 Next payload: Identification (5)
            Reserved: 00                                                                     Reserved: 00
            Payload length: 16                                                               Payload length: 16
            ID type: IPV4_ADDR_SUBNET (4)                                                    ID type: IPV4_ADDR_SUBNET (4)
            Protocol ID: Unused                                                              Protocol ID: Unused
            Port: Unused                                                                     Port: Unused
            Identification Data:192.168.1.0/255.255.255.0                                    Identification Data:0.0.0.0/0.0.0.0
        Payload: Identification (5)                                                      Payload: Identification (5)
            Next payload: NONE / No Next Payload  (0)                                        Next payload: NONE / No Next Payload  (0)
            Reserved: 00                                                                     Reserved: 00
            Payload length: 16                                                               Payload length: 16
            ID type: IPV4_ADDR_SUBNET (4)                                                    ID type: IPV4_ADDR_SUBNET (4)
            Protocol ID: Unused                                                              Protocol ID: Unused
            Port: Unused                                                                     Port: Unused
            Identification Data:192.168.2.0/255.255.255.0                                    Identification Data:0.0.0.0/0.0.0.0
        Extra data: 1a65a22f6a028b21070c8f013ea0680f                                     Extra data: eccfa8e0644e0ab653ed5087abda370f

このIdentificationはポリシーベースのIPsecでのセキュリティポリシーとして使用するものですが、SEILのルーティングベースIPsecではPhase 2の折衝以外では使わず、デフォルトで 0.0.0.0/0 という値を入れています。一方でstrongSwanはポリシーベースのIPsec(192.168.1.0/0 <–> 192.168.2.0 をIPsecに通すポリシー)として設定しているため、leftsubnet=192.168.2.0/24rightsubnet=192.168.1.0/24 の値を使用しています:

#4379
Frame 4379: 230 bytes on wire (1840 bits), 230 bytes captured (1840 bits) on interface ens4, id 0
Ethernet II, Src: RealtekU_ff:85:01 (52:54:00:ff:85:01), Dst: RealtekU_ff:38:01 (52:54:00:ff:38:01)
Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: d8ad22e1602d929b
    Responder SPI: 352dcafe83de1fa1
    Next payload: Hash (8)
    Version: 1.0
    Exchange type: Quick Mode (32)
    Flags: 0x01
    Message ID: 0x26c2e9f3
    Length: 188
    Encrypted Data (160 bytes)
        Payload: Hash (8)
        Payload: Security Association (1)
        Payload: Nonce (10)
        Payload: Identification (5)
            Next payload: Identification (5)
            Reserved: 00
            Payload length: 16
            ID type: IPV4_ADDR_SUBNET (4)
            Protocol ID: Unused
            Port: Unused
            Identification Data:192.168.1.0/255.255.255.0
        Payload: Identification (5)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 16
            ID type: IPV4_ADDR_SUBNET (4)
            Protocol ID: Unused
            Port: Unused
            Identification Data:192.168.2.0/255.255.255.0
        Extra data: 00000000

そしてstrongSwanは 0.0.0.0/0 を受け取ると無視して折衝を継続します。しかしSEILの方ではIdentificationの不整合により折衝に失敗しています。

458 Dec 17 13:46:58     info    ike racoon[-]: initiate new phase 2 negotiation: 10.0.0.1<=>10.0.0.2 [ISAKMP:d8ad22e1602d929b:352dcafe83de1fa1]
459 Dec 17 13:46:58     info    ike racoon[-]: new phase2 negotiation [ISAKMP:d8ad22e1602d929b:352dcafe83de1fa1:000026c2]
460 Dec 17 13:46:58     info    ike racoon[-]: mismatched ID was returned.
461 Dec 17 13:46:58     info    ike racoon[-]: failed to pre-process packet.
462 Dec 17 13:46:58     info    ike racoon[-]: phase2 negotiation failed.
463 Dec 17 13:47:02     info    ike racoon[-]: respond new phase 2 negotiation: 10.0.0.1<=>10.0.0.2 [ISAKMP:d8ad22e1602d929b:352dcafe83de1fa1:000026c2]
464 Dec 17 13:47:02     info    ike racoon[-]: invalid isakmp packet from 10.0.0.2[500]
465 Dec 17 13:47:02     info    ike racoon[-]: failed to pre-process packet.

これを解消するために、最小設定でも proxy-id の設定を入れていたのです。

ちなみにstrongSwanの方で leftsubnet=0.0.0.0/0rightsubnet=0.0.0.0/0 を設定するとphase 2の折衝は成功しますが、全てのパケットがESPを通るようになりおかしなことになります。例えばsshログイン中だとセッションが切れます(TCPの返りがIPsecを通っていく)。

proxy-id に関してはseil3のマニュアルに解説があります。

ここまででIKE折衝のおおまかな流れを理解することができました!

ISAKMP SA/IPsec SAの削除

SEILから interface.ipsec0.** の設定を削除 (#1008-1009)、あるいはstrongSwanをシャットダウンすると (#4748-4750)、Informational Exchangeが送信され、中にはDelete Payloadが含まれます。

#4748
Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 3e630be8eae722e3
    Responder SPI: 7e702f546e15df42
    Next payload: Hash (8)
    Version: 1.0
    Exchange type: Informational (5)
    Flags: 0x01
    Message ID: 0x2331f18e
    Length: 92
    Encrypted Data (64 bytes)
        Payload: Hash (8)
        Payload: Delete (12)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 16
            Domain of interpretation: IPSEC (1)
            Protocol ID: IPSEC_ESP (3)
            SPI Size: 4
            Number of SPIs: 1
            Delete SPI: cd4b0c11
        Extra data: 000000000000000000000000

#4750
Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 3e630be8eae722e3
    Responder SPI: 7e702f546e15df42
    Next payload: Hash (8)
    Version: 1.0
    Exchange type: Informational (5)
    Flags: 0x01
    Message ID: 0x943fe700
    Length: 108
    Encrypted Data (80 bytes)
        Payload: Hash (8)
        Payload: Delete (12)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 28
            Domain of interpretation: IPSEC (1)
            Protocol ID: ISAKMP (1)
            SPI Size: 16
            Number of SPIs: 1
            Delete SPI: 3e630be8eae722e37e702f546e15df42
        Extra data: 00000000000000000000000000000000

Protocol ID: IPSEC_ESP (3) はIPsec SAを、Protocol ID: ISAKMP (1) はISAKMP SAを削除しています。これによりIPsecが切断され、ESPが観測されなくなります。

Dead Peer Detection (DPD)

RFC 2409 IKEv1IKEv1には対向機器の死活監視機能が含まれませんが、この機能はRFC 3706で定義されています。Phase 2の折衝完了後にSEILが20秒おきに送っているInformational ExchangeがDPDパケットです (#994-1003)。

#994
Frame 994: 150 bytes on wire (1200 bits), 150 bytes captured (1200 bits) on interface ens4, id 0
Ethernet II, Src: RealtekU_ff:38:01 (52:54:00:ff:38:01), Dst: RealtekU_ff:85:01 (52:54:00:ff:85:01)
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 80f5f36ce1766d90
    Responder SPI: 8cfaf864c7f83e09
    Next payload: Hash (8)
    Version: 1.0
    Exchange type: Informational (5)
    Flags: 0x01
    Message ID: 0xc1dced89
    Length: 108
    Encrypted Data (80 bytes)
        Payload: Hash (8)
        Payload: Notification (11)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 32
            Domain of interpretation: IPSEC (1)
            Protocol ID: ISAKMP (1)
            SPI Size: 16
            Notify Message Type: R-U-THERE (36136)
            SPI: 80f5f36ce1766d908cfaf864c7f83e09
            Notification DATA: 0000093f
            DPD ARE-YOU-THERE sequence: 2367
        Extra data: fc591da2ece0b619213c1c0b

#995
Frame 995: 150 bytes on wire (1200 bits), 150 bytes captured (1200 bits) on interface ens4, id 0
Ethernet II, Src: RealtekU_ff:85:01 (52:54:00:ff:85:01), Dst: RealtekU_ff:38:01 (52:54:00:ff:38:01)
Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 80f5f36ce1766d90
    Responder SPI: 8cfaf864c7f83e09
    Next payload: Hash (8)
    Version: 1.0
    Exchange type: Informational (5)
    Flags: 0x01
    Message ID: 0xa7ab07fa
    Length: 108
    Encrypted Data (80 bytes)
        Payload: Hash (8)
        Payload: Notification (11)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 32
            Domain of interpretation: IPSEC (1)
            Protocol ID: ISAKMP (1)
            SPI Size: 16
            Notify Message Type: R-U-THERE-ACK (36137)
            SPI: 80f5f36ce1766d908cfaf864c7f83e09
            Notification DATA: 0000093f
            DPD ARE-YOU-THERE-ACK sequence: 2367
        Extra data: 000000000000000000000000

SEILの Notify Message Type: R-U-THERE (are you there?) に対しstrongSwanが Notify Message Type: R-U-THERE-ACK を返しています。一定時間、または一定回数R-U-THERE-ACKが返ってこないと対向機器は死んだ (dead)とみなされ、ISAKMP SAが削除されInformational Deleteが送信されます。

INITIAL-CONTACT

SEILがinitiatorのときに、Phase 1折衝完了後に送信しているInformational ExchangeはINITIAL-CONTACTメッセージです。

#984
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 80f5f36ce1766d90
    Responder SPI: 8cfaf864c7f83e09
    Next payload: Hash (8)
    Version: 1.0
    Exchange type: Informational (5)
    Flags: 0x01
    Message ID: 0x74763459
    Length: 108
    Encrypted Data (80 bytes)
        Payload: Hash (8)
        Payload: Notification (11)
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 28
            Domain of interpretation: IPSEC (1)
            Protocol ID: ISAKMP (1)
            SPI Size: 16
            Notify Message Type: INITIAL-CONTACT (24578)
            SPI: 80f5f36ce1766d908cfaf864c7f83e09
            Notification DATA: <MISSING>
        Extra data: cf5f3383201a28174d843a128858eb0f

これは「今あなたと1本目のISAKMP SAを張りましたよ(今までISAKMP SAは1本もありませんでしたよ)」というメッセージです (RFC 2407 4.6.3.3)。IPsecを繋いでいた機器の一方がInformational Deleteを送信せずに突然再起動してしまった場合、対向機器の再起動前のISAKMP SAが残り続けます(DPDで削除したりしない限り)。再起動後にISAKMP SAを貼り直した後INITIAL-CONTACTを送ってあげると、対向機器は前のISAKMP SAはもう使われていないと判断でき、削除することができます。

ライフタイム

SEILのコンフィグに interface.ipsec0.ike.proposal.phase1.lifetime : 60 を追加すると、phase 1プロポーザルの Life-Duration に反映されます。

#4860
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
User Datagram Protocol, Src Port: 500, Dst Port: 500
Internet Security Association and Key Management Protocol
    Initiator SPI: 27951c0311583ac7
    Responder SPI: 0000000000000000
    Next payload: Security Association (1)
    Version: 1.0
    Exchange type: Identity Protection (Main Mode) (2)
    Flags: 0x00
    Message ID: 0x00000000
    Length: 336
    Payload: Security Association (1)
        Next payload: Vendor ID (13)
        Reserved: 00
        Payload length: 228
        Domain of interpretation: IPSEC (1)
        Situation: 00000001
        Payload: Proposal (2) # 1
            Next payload: NONE / No Next Payload  (0)
            Reserved: 00
            Payload length: 216
            Proposal number: 1
            Protocol ID: ISAKMP (1)
            SPI Size: 0
            Proposal transforms: 6
            Payload: Transform (3) # 1
                Next payload: Transform (3)
                Reserved: 00
                Payload length: 36
                Transform number: 1
                Transform ID: KEY_IKE (1)
                Reserved: 0000
                IKE Attribute (t=11,l=2): Life-Type: Seconds
                IKE Attribute (t=12,l=2): Life-Duration: 60
                IKE Attribute (t=1,l=2): Encryption-Algorithm: AES-CBC
                IKE Attribute (t=14,l=2): Key-Length: 256
                IKE Attribute (t=3,l=2): Authentication-Method: Pre-shared key
                IKE Attribute (t=2,l=2): Hash-Algorithm: SHA2-256
                IKE Attribute (t=4,l=2): Group-Description: 1536 bit MODP group
            Payload: Transform (3) # 2
            Payload: Transform (3) # 3
            Payload: Transform (3) # 4
            Payload: Transform (3) # 5
            Payload: Transform (3) # 6
    Payload: Vendor ID (13) : KAME/racoon
    Payload: Vendor ID (13) : RFC 3706 DPD (Dead Peer Detection)
    Payload: Vendor ID (13) : RFC 3947 Negotiation of NAT-Traversal in the IKE
    Payload: Vendor ID (13) : draft-ietf-ipsec-nat-t-ike-02\n

そしてPhase 1折衝完了の47秒後に、新たにPhase 1を張り直します (#4890-#4895)。この「60秒」はPhase 1 (ISAKMP SA) の「ライフタイム」と呼ばれ、ISAKMP SAの有効期限になっています。Phase 1完了から60秒が経過するとISAKMP SAが無効になってしまうため、無効になる前に張り直しを行っています。

Phase 2 (IPsec SA) のライフタイムを60秒に設定した場合 (interface.ipsec0.ike.proposal.phase2.lifetime-of-time: 60) も同様です (#4985-4987)。lifetime-of-time という名前になっているのは、IPsec SAのライフタイムは時間的な有効期限の他に通信量 (lifetime of byte) の有効リミットも定義できるためです。

NAT traversal

SEILまたはstrongSwanがNAT配下にいる場合、ESPが通りません。ESPにはポート番号が無いので、NAPTが使えないためです。strongSwanを10.0.0.2のNAT配下に置いて折衝をしてみましょう。

1060	16:09:23.956153746	10.0.0.1	10.0.0.2	500	500	ISAKMP	402	Identity Protection (Main Mode)
1061	16:09:23.962639930	10.0.0.2	10.0.0.1	500	500	ISAKMP	182	Identity Protection (Main Mode)
1062	16:09:23.968209754	10.0.0.1	10.0.0.2	500	500	ISAKMP	398	Identity Protection (Main Mode)
1063	16:09:23.987885148	10.0.0.2	10.0.0.1	500	500	ISAKMP	374	Identity Protection (Main Mode)
1064	16:09:23.992267134	10.0.0.1	10.0.0.2	4500	4500	ISAKMP	138	Identity Protection (Main Mode)
1065	16:09:24.006855664	10.0.0.2	10.0.0.1	4500	4500	ISAKMP	138	Identity Protection (Main Mode)
1066	16:09:24.008269675	10.0.0.1	10.0.0.2	4500	4500	ISAKMP	154	Informational
1067	16:09:34.036988038	10.0.0.1	10.0.0.2	4500	4500	ISAKMP	362	Quick Mode
1068	16:09:34.045319370	10.0.0.2	10.0.0.1	4500	4500	ISAKMP	234	Quick Mode
1069	16:09:34.048725678	10.0.0.1	10.0.0.2	4500	4500	ISAKMP	122	Quick Mode
1070	16:09:36.076988973	192.168.2.1	192.168.1.1	4500	4500	ICMP	178	Echo (ping) request  id=0x0005, seq=482/57857, ttl=64 (reply in 1071)
1071	16:09:36.078320520	192.168.1.1	192.168.2.1	4500	4500	ICMP	178	Echo (ping) reply    id=0x0005, seq=482/57857, ttl=255 (request in 1070)

(検証の簡略化のため、実際にはstrongSwanはNAT配下に置かず、forceencaps=yes を設定してSEILにNAT検知させています。実際にNAT配下にあった場合は、10.0.0.2 のポートは500、4500 でなくエフェメラルポートになり、#1065 のIdentification Payloadは 10.0.0.2 ではなくNAT配下のローカルのIPアドレスになります)

3往復目のIdentity Protectionからポート番号が4500に変わりました。また、ICMPのポート番号が空だったのが4500という番号がついています。NAT配下でない場合/NAT配下の場合のICMPを見比べると、

#988                                                                                         #1070
Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)              Internet Protocol Version 4, Src: 10.0.0.2 (10.0.0.2), Dst: 10.0.0.1 (10.0.0.1)
Encapsulating Security Payload                                                               User Datagram Protocol, Src Port: 4500, Dst Port: 4500
    ESP SPI: 0x0debf9ad (233568685)                                                          UDP Encapsulation of IPsec Packets
    ESP Sequence: 1                                                                          Encapsulating Security Payload
    ESP IV: 8c530e39e82889f4b320e53e289bb128                                                     ESP SPI: 0x073aa3b5 (121283509)
    Pad: 0102030405060708090a                                                                    ESP Sequence: 1
    ESP Pad Length: 10                                                                           ESP IV: 0deb0bd4b0e9d5af7a55ed450f1d056e
    Next header: IPIP (0x04)                                                                     Pad: 0102030405060708090a
    Authentication Data [correct]                                                                ESP Pad Length: 10
Internet Protocol Version 4, Src: 192.168.2.1 (192.168.2.1), Dst: 192.168.1.1 (192.168.1.1)      Next header: IPIP (0x04)
Internet Control Message Protocol                                                                Authentication Data [correct]
                                                                                             Internet Protocol Version 4, Src: 192.168.2.1 (192.168.2.1), Dst: 192.168.1.1 (192.168.1.1)
                                                                                             Internet Control Message Protocol

#988 はIPv4の下に直接ESPがついているのに対し、#1070 では IPv4/UDP/ESP と間にUDPが入っています。これを “UDP-Encapsulated ESP” と呼びます (RFC 3948)。UDPはポート番号を持つので、UDP-Encapsulated ESPはNAT配下からでも通信可能になります。

Main Mode/Aggressive Mode

今まで見てきたphase 1の折衝は、全て “Main Mode”と呼ばれるものでした。Phase 1の折衝で使えるもう1つのモードが、”Aggressive Mode” です (RFC 2409 5.4)。

SEILのコンフィグに interface.ipsec0.ike.exchange-mode : aggressive を追加します。

5172	16:02:32.837735142	10.0.0.1	10.0.0.2	500	500	ISAKMP	610	Aggressive
5173	16:02:32.851361170	10.0.0.2	10.0.0.1	500	500	ISAKMP	98	Informational

SEILがAggressive Modeでphase 1の折衝を始めるようになりましたが、strongSwanはInformationalで “AUTHENTICATION-FAILED” メッセージを返しています。strongSwanのログには、

00022358 000099 L1 07[NET] received packet: from 10.0.0.1[500] to 10.0.0.2[500] (568 bytes)
00022358 000100 L1 07[ENC] parsed AGGRESSIVE request 0 [ SA KE No ID V V V ]
00022358 000102 L1 07[IKE] received DPD vendor ID
00022358 000103 L1 07[IKE] received NAT-T (RFC 3947) vendor ID
00022358 000104 L1 07[IKE] received draft-ietf-ipsec-nat-t-ike-02\n vendor ID
00022358 000105 L0 07[IKE] 10.0.0.1 is initiating a Aggressive Mode IKE_SA
00022358 000106 L1 07[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536
vvvvv
00022358 000107 L1 07[IKE] Aggressive Mode PSK disabled for security reasons
^^^^^
00022358 000108 L1 07[ENC] generating INFORMATIONAL_V1 request 3552424012 [ N(AUTH_FAILED) ]
00022358 000110 L1 07[NET] sending packet: from 10.0.0.2[500] to 10.0.0.1[500] (56 bytes)

Aggressive Mode PSK disabled for security reasons と出力されています。これはseil3のマニュアルにも書いてあります:

IKEのAggressive modeかつ事前共有鍵での認証は、Main modeと比較してセキュリティレベルが低くなるため、NAT配下の装置との接続が必要でないのであれば、アドレス書き換えの検知は無効化してご利用ください。

strongSwanのFAQにも解説があります。

(Aggressive ModeでのPSKを用いた折衝では、2つ(1往復)の折衝パケットが1つ手に入るとPSKのオフライン辞書攻撃が可能になります (VU#857035)。ただしMain Modeにおいても、中間者攻撃によりPSKのオフライン辞書攻撃が可能になる手法が2018年に発見されています (JVNVU#93409761)。)

Linuxの /etc/ipsec.confaggressive=yes を、/etc/strongswan.confcharon { i_dont_care_about_security_and_use_aggressive_mode_psk = yes } を入れて無理やり折衝させます。

5243	16:13:03.240496750	10.0.0.1	10.0.0.2	500	500	ISAKMP	610	Aggressive
5244	16:13:03.280664709	10.0.0.2	10.0.0.1	500	500	ISAKMP	534	Aggressive
5245	16:13:03.287513197	10.0.0.1	10.0.0.2	500	500	ISAKMP	178	Aggressive
5246	16:13:03.289218696	10.0.0.1	10.0.0.2	500	500	ISAKMP	150	Informational
5247	16:13:09.308508474	10.0.0.1	10.0.0.2	500	500	ISAKMP	358	Quick Mode
5248	16:13:09.317028602	10.0.0.2	10.0.0.1	500	500	ISAKMP	230	Quick Mode
5249	16:13:09.319688944	10.0.0.1	10.0.0.2	500	500	ISAKMP	118	Quick Mode
5250	16:13:11.604436072	192.168.2.1	192.168.1.1			ICMP	170	Echo (ping) request  id=0x0007, seq=6787/33562, ttl=64 (reply in 5251)
5251	16:13:11.605820445	192.168.1.1	192.168.2.1			ICMP	170	Echo (ping) reply    id=0x0007, seq=6787/33562, ttl=255 (request in 5250)

折衝できました。Main Modeはphase 1の折衝に6パケット必要なのに対し、Aggressive Modeは3パケットで終わります。アグレッシブです。

まとめ

SEILの設定を変えながらIKEのパケットの変化を見て、それぞれの役割を解説しました。

この記事の内容が理解できれば、IKEのエラーログの多くが理解できるようになると思います。例えば、racoon: mismatched identification returned というログが出たときには何をすれば良いでしょう?…「Identification」で解説した機器の識別子のペアが対向と一致していないですね。interface.ipsec0.ike.{my-identifier,peers-identifier} の設定が間違っていると疑うことができます。

SEILのIKE/IPsecを使っていてエラーログの用語がよく分からなくなったら、この記事に同じ用語が載っていないかチェックしてみてください。

IIJ Engineers blog読者プレゼントキャンペーン
  • Twitterフォロー&条件付きツイートで「IoT米」を抽選で20名にプレゼント!
    応募期間は2020/12/01~2020/12/31まで。詳細はこちらをご覧ください。
    今すぐツイートするならこちら→ フォローもお忘れなく!

芦原 渉

2020年12月22日 火曜日

ルータのファームウェア開発をしています。河原でプログラミングするのが好きです。

Related
関連記事