IPsec隧道外部节点#1容器无法访问172.16.0.0/24网络求助
Docker Swarm + IPsec 隧道通信异常问题
环境说明
- Swarm集群含7个节点,部署在vCloud Director实例中,均处于
172.16.0.0/24网段 - 另有2个外部节点部署在专用服务器上,均带有VLAN 4000接口,网段为
192.168.99.0/24 - 外部节点#1与vCloud Director建立IPsec隧道,配置如下:
leftsubnet=172.16.0.0/24
rightsubnet=192.168.99.0/24
- 集群内所有节点可通过私有IP互相通信
异常现象
- 外部节点#2上的容器可正常访问
172.16.0.0/24网段IP - 建立IPsec隧道的外部节点#1上的容器无法与
172.16.0.0/24网段通信
MTR测试结果
外部节点#2到172.16.0.0/24的MTR
Host Loss% Snt Last Avg Best Wrst StDev 1. 172.18.0.1 0.0% 5 0.0 0.0 0.0 0.1 0.0 2. 192.168.99.1 0.0% 5 0.3 0.3 0.3 0.4 0.0 3. (waiting for reply) 4. 172.16.0.30 0.0% 5 14.7 15.4 14.7 16.1 0.6
外部节点#1到172.16.0.0/24的MTR
Host Loss% Snt Last Avg Best Wrst StDev 1. 172.18.0.1 0.0% 3 0.1 0.1 0.0 0.1 0.0 2. static.X.X.X.X.clients.your-server.de 0.0% 3 0.2 0.3 0.2 0.4 0.1 3. XXX.fsn1.hetzner.com 0.0% 3 0.3 0.5 0.3 0.8 0.3 4. XXX.nbg1.hetzner.com 0.0% 3 2.7 3.8 2.7 6.0 1.9 5. (waiting for reply)
外部节点#1的iptables规则(位于Docker规则之前)
-A FORWARD -s 172.16.0.0/24 -d 192.168.99.0/24 -i enp35s0 -m policy --dir in --pol ipsec --reqid 1 --proto esp -j ACCEPT -A FORWARD -s 192.168.99.0/24 -d 172.16.0.0/24 -o enp35s0 -m policy --dir out --pol ipsec --reqid 1 --proto esp -j ACCEPT -A FORWARD -s 172.16.0.0/24 -d 192.168.99.0/24 -i enp35s0 -m policy --dir in --pol ipsec --reqid 1 --proto esp -j ACCEPT -A FORWARD -s 192.168.99.0/24 -d 172.16.0.0/24 -o enp35s0 -m policy --dir out --pol ipsec --reqid 1 --proto esp -j ACCEPT -A FORWARD -j DOCKER-USER -A FORWARD -j DOCKER-INGRESS -A FORWARD -j DOCKER-ISOLATION-STAGE-1
可能的原因及解决思路
1. 路由配置错误
从MTR结果看,节点#1的流量未走VLAN 4000接口,而是直接走公网。检查路由表,确认172.16.0.0/24网段的下一跳是192.168.99.1(与节点#2一致):
ip route show 172.16.0.0/24
若路由指向错误,添加静态路由:
ip route add 172.16.0.0/24 via 192.168.99.1 dev <VLAN4000接口名>
2. iptables规则未覆盖容器网段
当前规则仅针对192.168.99.0/24,但Docker容器使用独立网段(如172.18.0.0/16),需将容器网段加入IPsec转发规则:
-A FORWARD -s 172.16.0.0/24 -d 172.18.0.0/16 -i enp35s0 -m policy --dir in --pol ipsec --reqid 1 --proto esp -j ACCEPT -A FORWARD -s 172.18.0.0/16 -d 172.16.0.0/24 -o enp35s0 -m policy --dir out --pol ipsec --reqid 1 --proto esp -j ACCEPT
确保规则放在Docker规则之前。
3. IPsec策略未包含容器网段
IPsec配置的rightsubnet仅包含192.168.99.0/24,容器流量不在保护范围内,导致走公网或被丢弃。修改IPsec配置:
rightsubnet=192.168.99.0/24,172.18.0.0/16
重启IPsec服务生效。
4. Docker SNAT规则干扰
检查Docker是否对容器访问172.16.0.0/24的流量做了SNAT,导致源IP变为节点公网IP,不匹配IPsec策略。添加SNAT例外规则:
-A POSTROUTING -s 172.18.0.0/16 -d 172.16.0.0/24 -j ACCEPT
规则需放在Docker的SNAT规则之前。
内容的提问来源于stack exchange,提问作者Denden
相关产品推荐
相关产品推荐

