Docker 为每个具有暴露端口的容器创建一个 MASQUERADE iptables 规则(在此示例中,我有 5 个具有暴露端口 3500 的容器):
sudo iptables -t nat -L -v -n
<snip>
Chain POSTROUTING (policy ACCEPT 42 packets, 2650 bytes)
pkts bytes target prot opt in out source destination
<snip>
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:3500
0 0 MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:3500
0 0 MASQUERADE tcp -- * * 172.17.0.4 172.17.0.4 tcp dpt:3500
0 0 MASQUERADE tcp -- * * 172.17.0.5 172.17.0.5 tcp dpt:3500
0 0 MASQUERADE tcp -- * * 172.17.0.7 172.17.0.7 tcp dpt:3500
<snip>
如果我理解正确的话,这意味着当我们有一个源和目标相等且发往 docker 容器的数据包时,MASQUERADE 目标应该适用。但这什么时候会发生?
答案1
尽管这个帖子比较老了,但是这个问题现在已经得到解答:
https://stackoverflow.com/questions/46802089/cant-understand-docker-iptables-rule
简而言之 - 这应该是一个边缘情况,在大多数情况下,您感兴趣的是这条规则:
-A POSTROUTING -s <Docker subnet> ! -o <Docker interface> -j MASQUERADE
例如:
-A POSTROUTING -s 172.17.0.0/24 ! -o br-a9173b54dfbd -j MASQUERADE