現象
StrongSWANでrightsubnetまたはleftsubnetに複数のCIDRを設定し、IKEv2でCisco社の機器(全部確認したわけじゃないけど)と接続しようとした場合、どちらか1つのCIDRとしか通信ができなくなる問題。
ipsec.confの設定例
config setup
keyexchange=ikev2
# 省略
conn strongswan_to_cisco
# 省略
type=tunnel
leftsubnet=A.A.A.0/24,B.B.B.0/24
# 省略
Cisco側の設定例
# 省略
crypto map cisco_strongswan_vpn 10 ipsec-isakmp
# 省略
match address cisco_strongswan_acl
ip access-list extended cisco_strongswan_acl
permit ip C.C.C.0 0.0.0.255 A.A.A.0 0.0.0.255
permit ip C.C.C.0 0.0.0.255 B.B.B.0 0.0.0.255
# 省略
原因
どちらのバグでもありません。IKEv2の機能の実装の仕方の問題。全部の機種を試した訳ではないけど、同じポリシーで実装されてるので、ASAとかISRとかASRとか全て当てはまるのではないかな?
IKEv2開始
トンネル作成のネゴシエーション。認証後、どのような暗号化や改ざん検知の仕組みを使うのかなどのやりとりを開始しますが、その中でトンネルにどのトラフィックを乗せるかの調整も含まれます。ちなみにIPSecトンネルの実態は最低in/out一つずつ、合計2本1ペアで作成されるSA(Security Accosiation)と呼ばれるものですが、以下、図では1本のパイプで表します。
StrongSWAN側の設定の意味
全ての"conn"にあるrightsubnetとleftsubnetの組み合わせを通す1組のSA、IPSecトンネルを作成するという意味です。ちなみにIKEv1ではできません。IKEv2の"Traffic Selector"の機能です。
Cisco側の設定の意味
ACL一行毎に必要なトンネルを作成しようとします。IKEv1の仕組みを踏襲したのでしょうか?とはいえ、IKEv2的にもNGではないという理解です。
何が起きるか
最初のSA
Cisco側から来たproposalは"A.A.A.0/24-C.C.C.0/24"ですが、これはStrongSWAN側の設定の一部に含まれるため、範囲を狭めた上でStrongSWANは受け入れることができます。(ポリシーの一部のみで合意することを”Traffic Selector Narrowing"と言います。)
2本目のSA
もう1組のSAをCiscoは要求しますが、StrongSWANの設定はあくまで1本のトンネル(2本1組のSA)を作成する設定なので、これを受け入れることができません
結果
Cisco側で1つのACLで定義されたトラフィック用に1本のトンネルが作成され、その範囲で通信はできますが、他の通信はできません。
Solution
1.StrongSWANをCisco側に合わせる
ipsec.confのConnectionを二つ作成すれば2つSAを作る設定となり、Ciscoの2本目のSAも受け入れます。
下記は本家StrongSWANのサイトの設定例です。
https://wiki.strongswan.org/issues/758
conn strongswan_to_cisco
dpdaction=restart
type=tunnel
# no auto here
leftauth=psk
leftid=54.XXX.XX.XX ## our strongSwan public IP.
leftsubnet=172.xx.x.250/32 ## The IP assigned to our Gateway on the Cisco VPN
lefthostaccess=yes
right=65.XXX.XX.XX ## Public IP of the Cisco VPN device
# no rightsubnet here
rightauth=psk
ike=3des-sha1-modp1024
esp=3des-sha1-modp1024
conn strongswan_to_cisco_1
also=strongswan_to_cisco
leftsubnet=10.zzz.zz.70/32
auto=start
conn strongswan_to_cisco_2
also=strongswan_to_cisco
leftsubnet=10.zzz.zz.11/32
auto=start
2.CiscoをStrongSWAN側に合わせる
すみません、私にはできませんでした。方法はあるのかな?
3.両方の設定を変える
やりようは色々あるかと思います。
以上はPolicy BasedなIPSecを前提として書きましたが、Routing Basedで設定するとか、GREなどの別の仕組みでトンネルを作成し、IPSecはtransport modeでhost to hostでの暗号化だけ担うとか。
そして少しだけAlibaba Cloud
StrongSWA的な設定
1つの"IPSec connection"を作成し、その中でローカルネットワークまたはリモートネットワークを複数設定することで、複数のポリシーのトラフィックを運ぶ一本トンネルを作成することができ、既述StrongSWANの設定で接続できます。もちろんIKEv2である必要があります。
Cisco的な設定
IPSec connection 同じAlibaba CloudのVPN GatewayとCustomer Gatewayを指定して複数のConnectionを作成すればその数だけトンネルが作成されます。これでCiscoのそれぞれのACLに合わせてIPSec connectionを作ることで既述Ciscoとも接続できます。これはIKEv2独自の部分を利用していないので、IKEv1でも接続することができます。
背景
数年前ハマったトラブルをすっかり忘れて再度ハマったので防備録も兼ねて。StringSWANのwikiでも時々話題になっていますね。
https://wiki.strongswan.org/issues/758
https://wiki.strongswan.org/issues/2529
FragmentationはEncryptionの後?先?問題や、Rekey問題はいっぱい日本語の情報ありますが、このドキュメントあんまりないですね。
なお、以上はエンジニアの完全に個人的な趣味であり、どの組織の見解も反映していません。