Cisco/StrongSwan IKEv2相性問題と解決法、そして少しだけAlibaba Cloud


#現象
StrongSWANでrightsubnetまたはleftsubnetに複数のCIDRを設定し、IKEv2でCisco社の機器（全部確認したわけじゃないけど）と接続しようとした場合、どちらか１つのCIDRとしか通信ができなくなる問題。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/13c39404-fd45-8769-fd70-af2f00075363.png)

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本１ペアで作成されるSA(Security Accosiation）と呼ばれるものですが、以下、図では１本のパイプで表します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/e65a4c13-e56c-1d01-ec80-d374f3c797a8.png)

##StrongSWAN側の設定の意味
全ての"conn"にあるrightsubnetとleftsubnetの組み合わせを通す1組のSA、IPSecトンネルを作成するという意味です。ちなみにIKEv1ではできません。IKEv2の"Traffic Selector"の機能です。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/d78f2f78-9e19-40ae-af96-93bd41f81808.png)

##Cisco側の設定の意味
ACL一行毎に必要なトンネルを作成しようとします。IKEv1の仕組みを踏襲したのでしょうか？とはいえ、IKEv2的にもNGではないという理解です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/49a0689c-92b6-22a3-85f5-804ec8308d68.png)

##何が起きるか
###最初のSA
Cisco側から来たproposalは"A.A.A.0/24-C.C.C.0/24"ですが、これはStrongSWAN側の設定の一部に含まれるため、範囲を狭めた上でStrongSWANは受け入れることができます。(ポリシーの一部のみで合意することを”Traffic Selector Narrowing"と言います。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/ef9d9985-1876-edde-d83e-5d2d0e486399.png)

###2本目のSA
もう１組のSAをCiscoは要求しますが、StrongSWANの設定はあくまで１本のトンネル(2本1組のSA)を作成する設定なので、これを受け入れることができません
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/5788c503-46d5-3a71-6605-b90456a853a3.png)

###結果
Cisco側で1つのACLで定義されたトラフィック用に1本のトンネルが作成され、その範囲で通信はできますが、他の通信はできません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/553d2ec6-1187-5517-41e0-c7dcc4dc0416.png)

#Solution
##1.StrongSWANをCisco側に合わせる 
ipsec.confのConnectionを二つ作成すれば2つSAを作る設定となり、Ciscoの2本目のSAも受け入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/18b70778-d33f-8aa4-db20-121aee71b3bd.png)
下記は本家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である必要があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/e7edd955-6757-8592-62df-291b740bc5d7.png)


##Cisco的な設定
IPSec connection　同じAlibaba CloudのVPN GatewayとCustomer Gatewayを指定して複数のConnectionを作成すればその数だけトンネルが作成されます。これでCiscoのそれぞれのACLに合わせてIPSec connectionを作ることで既述Ciscoとも接続できます。これはIKEv2独自の部分を利用していないので、IKEv1でも接続することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/118b2fff-d6e7-c2dc-7fdb-5fb8dce97ca8.png)

#背景
数年前ハマったトラブルをすっかり忘れて再度ハマったので防備録も兼ねて。StringSWANのwikiでも時々話題になっていますね。
https://wiki.strongswan.org/issues/758
https://wiki.strongswan.org/issues/2529

FragmentationはEncryptionの後？先？問題や、Rekey問題はいっぱい日本語の情報ありますが、このドキュメントあんまりないですね。

なお、以上はエンジニアの完全に個人的な趣味であり、どの組織の見解も反映していません。