客户端数据包未通过 strongSwan IPsec 站点到站点隧道转发给同一服务器上的客户端和网关

客户端数据包未通过 strongSwan IPsec 站点到站点隧道转发给同一服务器上的客户端和网关

我在 CentOS 7 虚拟专用服务器(子网 172.25.10.0/24 的公共 IP xxx233)和客户网络(子网 10.9.200.0/24 的公共 IP yyy24)之间使用 strongSwan 设置了站点到站点 IPsec 隧道。隧道似乎连接正常,但我无法让流量通过它路由。我试图在充当网关的同一台主机上设置 172.25.10.0/24 子网,我想我做错了。

VPS 上conn的部分是:ipsec.conf

conn customer
    esp=aes256-sha1-modp1024
    ike=aes256-sha1-modp1024
    keyexchange=ikev1
    authby=psk
    left=%defaultroute
    leftsubnet=172.25.10.0/24
    leftfirewall=yes
    right=y.y.y.24
    rightsubnet=10.9.200.0/24
    auto=start

据我所知,隧道本身运行良好。VPSstrongswan statusall上显示:

Security Associations (1 up, 0 connecting):
      customer[29]: ESTABLISHED 110 minutes ago, x.x.x.233[x.x.x.233]...y.y.y.24[y.y.y.24]
      customer[29]: IKEv1 SPIs: 0123456789abcdef_i* 0123456789abcdef_r, pre-shared key reauthentication in 50 minutes
      customer[29]: IKE proposal: AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
      customer{88}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: 01234567_i 01234567_o
      customer{88}:  AES_CBC_256/HMAC_SHA1_96/MODP_1024, 0 bytes_i, 0 bytes_o, rekeying in 7 minutes
      customer{88}:   172.25.10.0/24 === 10.9.200.0/24

我在拥有公共 IP(xxx233)的同一接口上的 VPS 上设置了一个子网 IP(172.25.10.2),其中包含:

ip addr add 172.25.10.2/32 dev eth0

但是当我从 VPS ping 远程网络上的 IP 时,ping 失败:

# ping -I 172.25.10.2 -c 3 10.9.200.254
PING 10.9.200.254 (10.9.200.254) from 172.25.10.2 : 56(84) bytes of data.

--- 10.9.200.254 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

tcpdump 显示 IPsec 隧道未被使用:

# tcpdump -n host 10.9.200.254 or host y.y.y.24
03:51:07.193494 IP x.x.x.233 > 10.9.200.254: ICMP echo request, id 10193, seq 1, length 64
03:51:08.193449 IP x.x.x.233 > 10.9.200.254: ICMP echo request, id 10193, seq 2, length 64
03:51:09.193452 IP x.x.x.233 > 10.9.200.254: ICMP echo request, id 10193, seq 3, length 64

我猜测仅添加 172.25.10.2 IP 不足以eth0让它知道我的流量应该通过隧道路由,但我不确定正确的方法是什么。

值得一提的是,在打开 strongSwan 之前,我还运行了以下命令:

# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
# sysctl -p
# firewall-cmd --zone=public --permanent --add-service="ipsec"
# firewall-cmd --zone=public --permanent --add-port=4500/udp
# firewall-cmd --zone=public --permanent --add-masquerade
# firewall-cmd --reload

否则,我没有触及机器的配置/路由规则/等。

答案1

IPsec 流量应该被路由,您可能遇到了影响 IPsec 流量的默认 NAT 规则的默认 NAT 问题。补救措施是:

iptables -t nat -I POSTROUTING 1 -m policy --pol ipsec --dir out -j ACCEPT

或者使用 的等效命令firewall-cmd --add-rule

答案2

如果您配置了任何 NAT 规则,例如MASQUERADEvia --add-masquerade,则必须排除与 IPsec 策略匹配的流量,以免被网络地址转换。否则,该流量只会被网络地址转换到公共 IP,不再与 IPsec 策略匹配,也不会通过隧道。如strongSwan 维基您需要插入如下规则(在任何 NAT 规则之前,-I如果 NAT 规则已经存在则尝试执行):

iptables -t nat -I POSTROUTING -m policy --pol ipsec --dir out -j ACCEPT

如果有必要,也可以更具体(例如,仅包含某些源 IP)。我不知道,firewall-cmd所以我不确定你会怎么做。但类似下面的操作(在行前执行--add-masquerade)可能会有效:

firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -m policy --pol ipsec --dir out -j ACCEPT

相关内容