当包以 esp 传输模式封装时,SNAT iptables 不起作用

当包以 esp 传输模式封装时,SNAT iptables 不起作用

我有以下设置,涉及一个主机和一个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>docker0log

sudo ip6tables -j LOG -t nat -I POSTROUTING 1  -d <vpnSubnet> -s <dockerip> --log-prefix " [>] Vincent SNAT match"

这个日志在我设置ip xfrmdocker-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

相关内容