奇怪的行为与Docker伪装规则

我们正在经历间歇性的阶段,来自一个特定的Docker容器的stream量不正确的NAT,并到达我们的互联网网关与docker的内部地址。 以下是显示火星包的网关dmesg的摘录:

[Fri Sep 1 11:18:21 2017] martian source 108.177.119.138 from 172.17.0.7, on dev vlan10 [Fri Sep 1 11:18:21 2017] ll header: xx:xx:xx:02:98:41:xx:xx:xx:6b:d5:e3:08:00 [Fri Sep 1 11:18:21 2017] martian source 108.177.119.138 from 172.17.0.7, on dev vlan10 [Fri Sep 1 11:18:21 2017] ll header: xx:xx:xx:02:98:41:xx:xx:xx:6b:d5:e3:08:00 [Fri Sep 1 11:18:37 2017] net_ratelimit: 118 callbacks suppressed 

Docker主机上的相关规则如下所示:

 ansible@moby:~$ sudo iptables -t nat -vL POSTROUTING Chain POSTROUTING (policy ACCEPT 428K packets, 27M bytes) pkts bytes target prot opt in out source destination 431K 27M MASQUERADE all -- any !docker0 172.17.0.0/16 anywhere 0 0 MASQUERADE all -- any !br-a38f93d5281a 172.21.0.0/16 anywhere 24 1508 MASQUERADE all -- any !br-8306136cf704 172.22.0.0/16 anywhere 0 0 MASQUERADE all -- any !br-79b184ad9924 172.19.0.0/16 anywhere 0 0 MASQUERADE all -- any !br-3d701d8cb6cf 172.20.0.0/16 anywhere 202 12780 MASQUERADE all -- any !br-3bf44ccb986f 172.18.0.0/16 anywhere 0 0 MASQUERADE tcp -- any any 172.22.0.4 172.22.0.4 tcp dpt:5000 0 0 MASQUERADE tcp -- any any 172.21.0.4 172.21.0.4 tcp dpt:5000 0 0 MASQUERADE udp -- any any 172.17.0.2 172.17.0.2 udp dpt:domain 0 0 MASQUERADE tcp -- any any 172.17.0.4 172.17.0.4 tcp dpt:http 0 0 MASQUERADE tcp -- any any 172.19.0.3 172.19.0.3 tcp dpt:5000 0 0 MASQUERADE tcp -- any any 172.17.0.3 172.17.0.3 tcp dpt:9090 0 0 MASQUERADE tcp -- any any 172.18.0.3 172.18.0.3 tcp dpt:5555 0 0 MASQUERADE tcp -- any any 172.17.0.7 172.17.0.7 tcp dpt:5000 0 0 MASQUERADE tcp -- any any 172.17.0.5 172.17.0.5 tcp dpt:5000 

据我所知,源地址为172.17.0.0/16 所有stream量从eth0 (它是Docker主机的物理接口)出发应由第一条规则处理,并被伪装。

所描述的行为似乎发生一两个小时一两次。 还值得注意的是,对于地址为172.17.0.7的Docker容器没有明显的影响,它们的数据包正在“转义”主机,运行在其上的任务似乎没有受到影响。

这个问题看起来与这里所描述的相似,但是他们的根本原因是docker bridge设备有一个改变的conntrackstream动的MAC地址,我认为这不是这样的情况:

 ansible@moby:~$ cat /sys/class/net/docker0/addr_assign_type 3 

有没有人有任何想法可能造成这种情况? 提示更好地诊断问题也将不胜感激!