去年写的一篇文章前两天被网友留言了一个问题,我发现我也解答不了...
这个问题是,在使用 docker 添加端口映射规则时,iptables 表中会多出这么一条类似的 MASQUERADE 规则,求问它的功能是啥:
-t nat -A POSTROUTING -s 172.18.0.2/32 -d 172.18.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
源地址与目标地址都是 172.18.0.2/32,说明是容器在请求它自己,为什么自己请求自己还要做 NAT(MASQUERADE) 呢???
只要容器内的协议栈实现没毛病,请求它自己的 ip 地址根本不会走网桥,直接就走本地了,我抓包验证了请求容器自身 ip 时网桥上确实是没流量的。
查了下找到这里有遇到同样的问题 Docker Implementation of Published Ports, 这个老外表示: Please don't ask me under what scenario one might hit those rules...
虽然是个很边缘的情况,不过也可以拿出来讨论下,有兴趣的朋友可以看看哈哈,测试用的 docker-compose.yml 与现象参见如下链接:
https://thiscute.world/posts/iptables-and-container-networks/#docker-publish-ports
相关讨论参见文章评论:
https://github.com/ryan4yin/thiscute.world/issues/14