swanctl 一个 localts 使用多个网段

中文解释: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,都可以通即可

相关推荐
无名之逆25 分钟前
轻量级、高性能的 Rust HTTP 服务器库 —— Hyperlane
服务器·开发语言·前端·后端·http·rust
无名之逆1 小时前
探索Hyperlane:用Rust打造轻量级、高性能的Web后端框架
服务器·开发语言·前端·后端·算法·rust
穆骊瑶1 小时前
Java语言的WebSocket
开发语言·后端·golang
追逐时光者1 小时前
精选 5 款基于 .NET 开源、功能强大的编辑器
后端·.net
uhakadotcom2 小时前
阿里云 MaxCompute SQLML:轻松实现机器学习
后端·面试·github
Asthenia04122 小时前
[4-Consumer]消费者端实现心跳功能
后端
Asthenia04122 小时前
[3-Consumer]回答面试官关于 MQ 项目中 Topic+Tag 二级消息过滤的思路整理
后端
Asthenia04122 小时前
[2-Consumer]如何回答面试官关于 MQ 轮子项目中 Push 和 Pull 混合消费的实现思路
后端
Asthenia04122 小时前
在面试中我被问到RocketMQ的延时队列是如何实现的。谈谈回答的思路
后端
Asthenia04122 小时前
[1]如何设计一个优雅的消息重试机制:我在自研 MQ 项目中的实践
后端