两个IPSec子连接共用XFRM虚拟接口

以下根据strongswan代码中的testing/tests/route-based/net2net-xfrmi-ike/中的测试环境,来看一下两个IPSec子连接共用一个XFRM虚拟接口的情况。拓扑结构如下:

在这里插入图片描述

拓扑图中使用到的设备包括:虚拟网关moon和sun。

sun网关配置

sun的配置文件:/etc/swanctl/swanctl.conf,内容如下。注意其中的net-net子连接配置,if_id_in和if_id_out,都指定了特殊值%unique-dir。

connections {

   gw-gw {
      local_addrs  = PH_IP_SUN
      remote_addrs = PH_IP_MOON

      if_id_in = %unique-dir
      if_id_out = %unique-dir

      children {
         net-net {
            local_ts  = 10.2.0.0/16
            remote_ts = 10.1.0.0/16

            esp_proposals = aes128gcm128-x25519
         }

updown脚本的指定放到了sun网关的/etc/strongswan.conf文件中,如下所示,使用start-scripts开头的段,updown脚本指定为python文件:/etc/updown.py。

# /etc/strongswan.conf - strongSwan configuration file

swanctl {
  load = pem pkcs1 x509 revocation constraints pubkey openssl random
}

charon-systemd {
  load = random nonce aes sha1 sha2 pem pkcs1 curve25519 gmp x509 curl revocation hmac vici kernel-netlink socket-default
  start-scripts {
    updown = /usr/bin/python /etc/updown.py
  }
}

由于在swanctl.conf文件中,XFRM接口ID指定为特殊值%unique-dir,将使用脚本文件:/etc/updown.py,创建两个xfrm虚拟接口(每个方向单独一个接口),和添加路由信息。

moon网关配置

moon网关的配置文件:/etc/swanctl/swanctl.conf,内容如下。注意其中的gw-gw连接配置,if_id_out和if_id_in分别指定了值1337和42。与以上sun网关的特殊值(%unique)配置不同,故moon网关也无需特殊的updown脚本文件,以下将为其手动创建XFRM虚拟接口。

这里为主机alice和venus分别配置了不同的子连接alice-net和venus-net,二者的区别在于流量选择器的本地地址不同,alice的local_ts值为其eth0接口的地址10.1.0.10/32;而venus的local_ts值为其eth0接口的地址10.1.0.20。对比以上的sun网关的配置,其流量选择器的远端地址指定的为网段10.1.0.0/16,包括了alice和venus主机。

connections {

   gw-gw {
      local_addrs  = PH_IP_MOON
      remote_addrs = PH_IP_SUN

      if_id_out = 1337
      if_id_in = 42

      children {
         alice-net {
            local_ts  = 10.1.0.10/32
            remote_ts = 0.0.0.0/0

            esp_proposals = aes128gcm128-x25519
         }
         venus-net : connections.gw-gw.children.alice-net {
            local_ts  = 10.1.0.20/32
         }
      }

连接建立流程

操作流程如下,由于在moon网关上明确配置了if_id_in和if_id_out值,此处为其创建相应ID值的xfrm虚拟接口,这里创建两个XFRM接口,见如下的xfrmi命令。对于sun主机由于指定的为特殊值(%unique-dir),交由strongswan进程调用updown脚本去创建xfrm接口。

随后,在moon网关上配置到sun网关背后网络(10.2.0.0/16)的路由,经由刚创建的xfrm-moon-out设备。以及配置iptables允许转发规则。

moon::/usr/local/libexec/ipsec/xfrmi -n xfrm-moon-out -d eth0 -i 1337
moon::/usr/local/libexec/ipsec/xfrmi -n xfrm-moon-in  -d eth0 -i 42
moon::ip link set xfrm-moon-out up
moon::ip link set xfrm-moon-in up
moon::ip route add 10.2.0.0/16 dev xfrm-moon-out
moon::iptables -A FORWARD -o xfrm-moon-out -j ACCEPT
moon::iptables -A FORWARD -i xfrm-moon-in -j ACCEPT

最后在两个虚拟网关sun和moon上启动strongswan进程,以及在moon网关上启动名称为alice-net和venus-net的两个子连接。

moon::systemctl start strongswan
sun::systemctl start strongswan
moon::expect-connection gw-gw
sun::expect-connection gw-gw
moon::swanctl --initiate --child alice-net
moon::swanctl --initiate --child venus-net

以上的xfrmi命令在moon网关上创建虚拟的XFRM接口:xfrm-moon,指定ID值(xfrm_id)为42,其底层物理接口为eth0。可使用xfrmi -list命令进行查看。

moon:~# /usr/local/libexec/ipsec/xfrmi -list
19: xfrm-moon-out    dev eth0     if_id 0x00000539 [1337]
20: xfrm-moon-in     dev eth0     if_id 0x0000002a [42]
No leaks detected, 2 suppressed by whitelist
moon:~# 

使用ip route命令查看为xfrm-moon虚拟接口添加的路由信息,目的网段10.2.0.0/16(bob主机所在网段)的流量路由到xfrm-moon-out接口。alice和venus到bob的流量都经由此条路由转发。

moon:~# ip route
default via 192.168.0.254 dev eth0 onlink 
10.1.0.0/16 dev eth1 proto kernel scope link src 10.1.0.1 
10.2.0.0/16 dev xfrm-moon-out scope link 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1 

以下配置的iptables规则,允许转发出接口为xfrm-moon-out虚拟接口的所有流量,并且允许入接口为xfrm-moon-in接口的所有流量。

moon:~# iptables -L -n -v

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 ACCEPT     all  --  *      xfrm-moon-out  0.0.0.0/0            0.0.0.0/0           
    2   168 ACCEPT     all  --  xfrm-moon-in *       0.0.0.0/0            0.0.0.0/0   

以下为moon网关发起两个子连接alice-net和venus-net时,sun网关上strongswan的与xfrm有关的日志信息。其创建了XFRM虚拟接口xfrm-1-in和xfrm-2-out,并且在CHILD_SA net-net{1}子连接,即alice-net建立之后,添加了目的地址为alice的路由信息,经由xfrm接口xfrm-2-out(10.1.0.10/32 via xfrm-2-out)。

同样的,在子连接net-net{2},即venus-net建立之后,添加了目的地址为venus的路由信息,经由相同的xfrm接口xfrm-2-out(10.1.0.20/32 via xfrm-2-out)。

sun charon-systemd: 16[IKE] IKE_SA gw-gw[1] established between 192.168.0.2[sun.strongswan.org]...192.168.0.1[moon.strongswan.org]
sun charon-systemd: 16[IKE] scheduling rekeying in 14194s
sun charon-systemd: 16[IKE] maximum IKE_SA lifetime 15634s
sun charon-updown: add XFRM interfaces xfrm-1-in and xfrm-2-out

sun charon-systemd: 16[IKE] CHILD_SA net-net{1} established with SPIs c876589b_i c0c3035e_o and TS 10.2.0.0/16 === 10.1.0.10/32
sun charon-systemd: 16[ENC] generating IKE_AUTH response 1 [ IDr CERT AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) N(ADD_6_ADDR) N(ADD_6_ADDR) ]

sun charon-systemd: 10[KNL] interface xfrm-2-out activated
sun charon-systemd: 14[KNL] fe80::ac8:4988:e268:8df1 appeared on xfrm-2-out
sun charon-systemd: 06[KNL] interface xfrm-1-in activated
sun charon-systemd: 11[KNL] fe80::42cd:911c:6523:525c appeared on xfrm-1-in
sun charon-updown: add route to 10.1.0.10/32 via xfrm-2-out

sun charon-systemd: 12[NET] received packet: from 192.168.0.1[4500] to 192.168.0.2[4500] (240 bytes)
sun charon-systemd: 12[ENC] parsed CREATE_CHILD_SA request 2 [ SA No KE TSi TSr ]
sun charon-systemd: 12[IKE] CHILD_SA net-net{2} established with SPIs c8c88069_i cee80954_o and TS 10.2.0.0/16 === 10.1.0.20/32
sun charon-updown: add route to 10.1.0.20/32 via xfrm-2-out

sun charon-systemd: 12[ENC] generating CREATE_CHILD_SA response 2 [ SA No KE TSi TSr ]

是由ip route命令可在sun网关上查看以上添加的路由信息:

sun:~# ip route
default via 192.168.0.254 dev eth0 onlink 
10.1.0.10 dev xfrm-2-out scope link 
10.1.0.20 dev xfrm-2-out scope link 
10.2.0.0/16 dev eth1 proto kernel scope link src 10.2.0.1 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2 
sun:~# 

安全策略和关联

在moon网关上使用swanctl工具查看安全关联信息,可见不论是gw-gw连接,还是子连接alice-net-1或者venus-net-2其if-id-in和if-id-out的值都是相同的,钳制为0x2a(42),后者为0x539(1337)。

moon:~# swanctl --list-sas --raw
list-sa event {gw-gw {uniqueid=1 version=2 state=ESTABLISHED local-host=192.168.0.1 local-port=4500 local-id=moon.strongswan.org remote-host=192.168.0.2 remote-port=4500 remote-id=sun.strongswan.org initiator=yes initiator-spi=e32403acf2945801 responder-spi=d3b6279619fecac3 
if-id-in=0000002a if-id-out=00000539 encr-alg=AES_CBC encr-keysize=128 integ-alg=HMAC_SHA2_256_128 prf-alg=PRF_HMAC_SHA2_256 dh-group=CURVE_25519 established=1692 rekey-time=12375 child-sas 
{alice-net-1 {name=alice-net uniqueid=1 reqid=1 state=INSTALLED mode=TUNNEL protocol=ESP spi-in=c9d78e33 spi-out=ccd9eb0c 
if-id-in=0000002a if-id-out=00000539 encr-alg=AES_GCM_16 encr-keysize=128 bytes-in=84 packets-in=1 use-in=1692 bytes-out=84 packets-out=1 use-out=1692 rekey-time=1736 life-time=2268 install-time=1692 local-ts=[10.1.0.10/32] remote-ts=[10.2.0.0/16]} 
venus-net-2 {name=venus-net uniqueid=2 reqid=2 state=INSTALLED mode=TUNNEL protocol=ESP spi-in=c5a4e4fe spi-out=ca6b4887 
if-id-in=0000002a if-id-out=00000539 encr-alg=AES_GCM_16 encr-keysize=128 dh-group=CURVE_25519 bytes-in=84 packets-in=1 use-in=1692 bytes-out=84 packets-out=1 use-out=1692 rekey-time=1587 life-time=2268 install-time=1692 local-ts=[10.1.0.20/32] remote-ts=[10.2.0.0/16]}}}}
list-sas reply {}
No leaks detected, 1442 suppressed by whitelist
moon:~# 

strongswan版本: 5.8.1
内核版本: 5.0

END

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页