赞
踩
以下根据strongswan代码中的testing/tests/route-based/net2net-xfrmi-ike/中的测试环境,来看一下两个IPSec子连接共用一个XFRM虚拟接口的情况。拓扑结构如下:
拓扑图中使用到的设备包括:虚拟网关moon和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网关的配置文件:/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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。