我是docker的新手,并且有关于docker容器网络的一些基本问题需要帮助
有一部分介绍如何使用iptables使docker容器与外部通信,实际上我可以理解这部分:
1从容器到外面,在postrouting链上有一个伪装规则,与SNAT相同
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
2从外面访问容器内的服务,在prerouting链中有一个DNAT规则然后主机将它转发到docker0,容器最终会收到数据包
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80
但实际上,当我停止iptables服务时,docker的网络仍然正常,我使用“iptables -L”和“iptables -t nat -L”进行检查,内核中没有规则,这是我的设置(假设10.170.28.0/24是外部网络,172.17.0.0/16是docker容器的内部网络):
首先,关闭iptables服务,fiter和nat表为空,如下所示:
iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
这是主机中的路由表(主机IP为10.170.28.8):
route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.170.28.0 * 255.255.255.192 U 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 br-data
link-local * 255.255.0.0 U 1002 0 0 eth0
link-local * 255.255.0.0 U 1003 0 0 eth1
link-local * 255.255.0.0 U 1040 0 0 br-data
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
default 10.170.28.1 0.0.0.0 UG 0 0 0 eth0
确实上面的表中有规则将目的地为172.17.0.0/16的数据包转发到桥接器docker0,但在此之前,谁做了DNAT将10.170.28.8转换为172.17.0.2(容器IP)?如何从容器(172.17.0.0/16)到外部(10.170.28.0/24)的流量如何在没有SNAT或伪装的情况下工作?
发布于 2019-02-22 11:27:36
首先,'停止'iptables是不可能的,它只是重置规则。正如您的帖子所示,*过滤器 INPUT链的策略是ALLOW。
Docker默认运行TCP转发代理,捕获转发端口的所有流量(验证方式ss -lnp | grep 49153
)。
我的机器上的测试表明,出站连接是不可能的:
省略2.,ping按预期工作。
$ docker --version
Docker version 18.09.2-ce, build 62479626f2
https://stackoverflow.com/questions/-100005158
复制相似问题