中文解释:swanctl 中关于多子网的使用
问:我可以在一个 CHILD_SA 中隧道多个子网吗?
答:
-
使用 IKEv2: 如果你使用 IKEv2 协议,并且对端(peer)支持此功能,那么是可以在一个 CHILD_SA 中隧道多个子网的。然而,并非所有设备都支持此功能。例如,Checkpoint、Cisco 和 Fortinet 的设备可能不支持,因此你需要查阅互操作性部分以获取相关细节。
-
使用 IKEv1: 如果你使用 IKEv1 协议,你需要处于"道路战士"(road warrior)模式,并且使用 UNITY 扩展。在 strongSwan 中,可以通过 unity 插件来实现这一点。
-
其他情况: 在其他情况下,如果不满足上述条件,你需要为每对子网定义一个单独的 CHILD_SA。
总结
总之,利用 IKEv2 协议,在对端支持的情况下,可以在同一个 CHILD_SA 中配置多个子网。而在 IKEv1 中,若希望实现相同功能,需借助 UNITY 扩展,并且通常适用在特定模式下。如果都不符合,则需要为每个子网对单独设置一个 CHILD_SA。
而我自己测试下来发现没有得到预期结果,虽然我定义了两个网段,但是只有一条路由
bash
children {
net-net {
local_ts = 10.251.138.0/24,10.251.137.0/24
remote_ts = 2.2.168.0/24
# ip route show table 220
2.2.168.0/24 via 10.251.174.254 dev bond0.2286 proto static src 10.251.138.32
/etc/swanctl# swanctl --initiate --child net-net mars-moon
[IKE] establishing CHILD_SA net-net{5}
[ENC] generating CREATE_CHILD_SA request 4 [ SA No KE TSi TSr ]
[NET] sending packet: from 10.251.174.200[4500] to 10.22.255.89[4500] (432 bytes)
[NET] received packet: from 10.22.255.89[4500] to 10.251.174.200[4500] (432 bytes)
[ENC] parsed CREATE_CHILD_SA response 4 [ N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA No KE TSi TSr ]
[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
[CFG] selected proposal: ESP:AES_CBC_256/HMAC_SHA2_256_128/MODP_1536/NO_EXT_SEQ
[IKE] CHILD_SA net-net{5} established with SPIs cce1c71f_i 3062316c_o and TS 10.251.137.0/24 === 2.2.168.0/24
initiate completed successfully
# 在 SA init 阶段可以看到,只有一个 TS,但是路由又是另外一个
# ip route show table 220
2.2.168.0/24 via 10.251.174.254 dev bond0.2286 proto static src 10.251.138.32
创建多个 CHILD_SA
可以看到目前我有 2 个sa,但是依然只有一条路由
bash
+ /usr/sbin/swanctl --list-sas
mars-moon2: #1, ESTABLISHED, IKEv2, 56839a77707bb663_i* 3db3e48a2ece5386_r
local '10.251.174.200' @ 10.251.174.200[4500]
remote '10.22.255.89' @ 10.22.255.89[4500]
AES_CBC-256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536
established 196s ago, rekeying in 83957s
net-net: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-256/HMAC_SHA2_256_128
installed 196s ago, rekeying in 84632s, expires in 86204s
in ca40d2fd, 0 bytes, 0 packets
out 5e199c1c, 0 bytes, 0 packets
local 10.251.138.0/24 # 1
remote 2.2.168.0/24
net-net: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-256/HMAC_SHA2_256_128/MODP_1536
installed 196s ago, rekeying in 84746s, expires in 86204s
in c2aad78a, 788 bytes, 3 packets, 6s ago
out 8247bfb9, 252 bytes, 3 packets, 6s ago
local 10.251.137.0/24 # 2
remote 2.2.168.0/24
bash
# ip route show table 220
2.2.168.0/24 via 10.251.174.254 dev bond0.2286 proto static src 10.251.137.32
bash
connections {
mars-moon2 {
version = 2
local_addrs = 10.251.174.200
remote_addrs = 10.22.255.89
dpd_delay = 60
rekey_time = 84600
over_time = 1800
encap = yes
mobike = yes
local {
auth = psk
id = 10.251.174.200
}
remote {
auth = psk
id = 10.22.255.89
}
children {
net-net {
local_ts = 10.251.138.0/24
remote_ts = 2.2.168.0/24
}
}
}
mars-moon1 {
version = 2
local_addrs = 10.251.174.200
remote_addrs = 10.22.255.89
dpd_delay = 60
rekey_time = 84600
over_time = 1800
encap = yes
mobike = yes
local {
auth = psk
id = 10.251.174.200
}
remote {
auth = psk
id = 10.22.255.89
}
children {
net-net {
local_ts = 10.251.137.0/24 # 10.251.137.32 按照配置的先后顺序
remote_ts = 2.2.168.0/24
}
}
}
}
某种意义上来说,即使 local ts 有多个,但本地 node 都有这两个网段的 ip 的情况下, 只有一条路由,应该也是不合理的,因为只要有一条路由可以回即可。
只要从对面,确认这两个段的 ip,都可以通即可