当我closuresiptables时,为什么docker容器仍然可以与外部进行通信

我是新来的docker工人,并有一些关于docker集装箱networking的基本问题的帮助,我读了有关docker的networkingconfiguration的文章: https : //docs.docker.com/articles/networking/

有一部分介绍如何使用iptables使docker容器与外部进行通信,实际上我可以理解这个部分:

1从集装箱到外部,在跟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的networking仍然正常工作,我使用“iptables -L”和“iptables -t nat -L”来检查和内核没有规则,这里是我的设置我们假设10.170.28.0/24是外部networking,172.17.0.0/16是Docker容器的内部networking):

首先,iptables服务被closures,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)的stream量如何在没有SNAT或伪装的情况下运行?