復号パケットで学ぶSEIL IKE/IPsec
2020年12月22日 火曜日
CONTENTS
【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
また、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
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 です。
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を送信した際のものです。
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” と表示され中身が分からなくなります。
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=add
を auto=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.conf
の ike=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.2、RFC 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.conf
に esp=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/24
、rightsubnet=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/0
、rightsubnet=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.conf
に aggressive=yes
を、/etc/strongswan.conf
に charon { 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を使っていてエラーログの用語がよく分からなくなったら、この記事に同じ用語が載っていないかチェックしてみてください。