我有以下设置,涉及一个主机和一个docker容器。
- 在主机上,我正在建立到远程网关的 ipsec 隧道连接。
- 在主机上运行的 docker 容器中,我设置了一个传输模式 ipsec 连接到另一个地址,该地址只能通过之前设置的 ipsec 隧道访问。
为了确保来自 docker-container 的每个包都通过 ipsec 隧道路由,我使用了 iptables 如下:
sudo ip6tables -j SNAT -t nat -I POSTROUTING 1 -d <vpnSubnet> -s <dockerip> --to-source <virtualip>
sudo ip6tables -j DNAT -t nat -I PREROUTING 1 -d <virtualip> -s <vpnsubnet> --to-destination <dockerip>
xfrm transport mode
在我在 docker 中设置连接之前,SNAT 规则有效。之后,我在接口上看到一个从<dockerip>
地址到地址的包,但在我的无线接口上不再看到。如果我添加一条iptables 规则,如下所示:<vpnsubnet>
docker0
log
sudo ip6tables -j LOG -t nat -I POSTROUTING 1 -d <vpnSubnet> -s <dockerip> --log-prefix " [>] Vincent SNAT match"
这个日志在我设置ip xfrm
docker-container 中的隧道之前触发,但之后没有触发。如何确保即使在 docker-container 中设置了 ipsec 传输模式,SNAT 规则也会触发?
输出ip xfrm
(来自 docker 容器内部,设置传输模式隧道后)如下所示(为简洁起见已缩短):
ip xfrm 状态
src <tunnel-ip> dst <docker-container>
proto esp spi 0x0000385c reqid 101 mode transport
replay-window 4
auth-trunc hmac(md5) <auth-key> 96
enc cbc(aes) <enc-key>
anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000
sel src ::/0 dst ::/0
src <docker-container> dst <tunnel-ip>
proto esp spi 0x8bc04e63 reqid 100 mode transport
replay-window 4
auth-trunc hmac(md5) <auth-key> 96
enc cbc(aes) <enc-key>
anti-replay context: seq 0x0, oseq 0xb, bitmap 0x00000000
sel src ::/0 dst ::/0
ip xfrm 策略
src <tunnel-ip> dst <docker-container>
dir in priority 0 ptype main flag localok
mark 0/0xffffffff
tmpl src :: dst ::
proto esp spi 0x0000385c reqid 101 mode transport
src <docker-container> dst <tunnel-ip>
dir out priority 0 ptype main flag localok
mark 0/0xffffffff
tmpl src :: dst ::
proto esp spi 0x8bc04e63 reqid 100 mode transport