我们有以下情况,在两个子网中有两个NIC的ens8: IP 192.168.100.74/24主机ens8: IP 192.168.100.74/24和ens9: IP 172.20.102.24/25 ,默认网桥docker0 IP 172.17.0.1/16和第二个网桥app_net IP 172.21.0.1/24 。 192.168.100.1是主机(Internet网关)上的默认网关。
docker集装箱有一个使用SNAT的固定传出IP,请参阅四种方式将docker集装箱连接到本地networking – 使用NAT 。 这是通过两个命令完成的,分配目标地址到主机接口ip addr add 192.168.100.234/24 dev ens8并添加iptables规则iptables -t nat -I POSTROUTING -s 172.21.0.4 -j SNAT --to-source 192.168.100.234 。 容器是使用来自桥app_net的IP创build的。
在主机上,我可以在子网192.168.100.x和172.20.102.x以及互联网(例如google.com)中ping / traceroute IP。 在一个容器中,我可以在子网192.168.100.x ping / traceroute IP,我也可以ping通google.com,但是我不能在172.20.102.x ping任何东西,除了172.20.102.24 。 看到下面的输出。
# traceroute -I 192.168.100.10 traceroute to 192.168.100.10 (192.168.100.10), 30 hops max, 46 byte packets 1 172.21.0.1 (172.21.0.1) 0.004 ms 0.003 ms 0.002 ms 2 192.168.100.10 (192.168.100.10) 0.180 ms 0.158 ms 0.028 ms # traceroute -I google.com traceroute to google.com (216.58.214.46), 30 hops max, 46 byte packets 1 172.21.0.1 (172.21.0.1) 0.004 ms 0.013 ms 0.002 ms 2 fritz.box (192.168.100.1) 2.144 ms 3.114 ms 2.697 ms 3 server.provider.net (xx.yy.250.5) 6.947 ms 7.042 ms 4.305 ms 4 etc... # traceroute -I 172.20.102.24 traceroute to 172.20.102.24 (172.20.102.24), 30 hops max, 46 byte packets 1 172.20.102.24 (172.20.102.24) 0.004 ms 0.003 ms 0.002 ms # traceroute -I 172.20.102.9 traceroute to 172.20.102.9 (172.20.102.9), 30 hops max, 46 byte packets 1 172.21.0.1 (172.21.0.1) 0.004 ms 0.003 ms 0.002 ms 2 * * * 3 * * * (etc. no response)
如果我不添加iptables的SNAT规则,容器可以ping / traceroute一切,也是子网172.20.102.x上的机器。
我发现了一篇关于多个NIC和Docker(#)的文章,并在serverFault上提供了一个简化的解决scheme ,但是这也不是深入研究高级Dockernetworking(#)给我一个线索,为什么我无法访问ens9子网中的其他机器,除了在docker集装箱内的网卡本身。
我错过了什么,或者这个networking场景错了吗?
(#)由于声誉,不允许发布两个以上的链接,但serverFault链接与Google“多个networking接口的Docker”应该有助于find链接。