使用 docker 时,我们从一个图像开始。我用 docker 创建了一个容器。

docker run --name register -d -p 1180:5000 registry

iptables 规则可以通过运行 iptables-save 列出:
# Generated by iptables-save v1.4.21 on Mon Oct 16 14:01:03 2017
*nat
:PREROUTING ACCEPT [129:14002]
:INPUT ACCEPT [129:14002]
:OUTPUT ACCEPT [25:1792]
:POSTROUTING ACCEPT [25:1792]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 1180 -j DNAT --to-destination 172.17.0.2:5000
COMMIT
# Completed on Mon Oct 16 14:01:03 2017
# Generated by iptables-save v1.4.21 on Mon Oct 16 14:01:03 2017
*filter
:INPUT ACCEPT [2721358:1990060388]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2726902:1992988803]
:DOCKER - [0:0]
:DOCKER-ISOLATION - [0:0]
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT
-A DOCKER-ISOLATION -j RETURN
COMMIT
# Completed on Mon Oct 16 14:01:03 2017

我不明白这个规则。
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE

最佳答案

最好的猜测是,当您的 iptables POSTROUTING 表默认拒绝任何与规则不匹配的数据包时,该规则是修复边缘情况,这允许从容器到映射端口上的自身连接。在正常操作中,规则没有任何功能。

我认为这是添加了 MASQ 规则的 pull request (#7003),但没有关于为什么添加它的文档。提交被标记为 "Create tests for pkg/iptables" 。这项工作通常围绕在具有默认 DENY 表的发行版上修复 Docker。

issue #12632 中有一个建议,除非关闭用户态端口映射代理,否则不会触及规则。

关于docker - 无法理解 docker iptables 规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46802089/

10-16 18:06