无法理解docker iptables规则

时间:2017-10-18 02:53:42

标签: docker

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

OpenAsync

可以通过运行iptables-save:

列出iptables规则
docker run --name register -d -p 1180:5000 registry

我不明白这条规则。

# 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

2 个答案:

答案 0 :(得分:2)

最好的猜测是,当iptables POSTROUTING表默认为DENY任何不匹配规则的数据包时,规则是修复边缘情况,这允许从容器到自身的连接映射端口通过。在正常操作中,规则不起作用。

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

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

答案 1 :(得分:0)

这在" Bind container ports to the host"

中有说明
  

默认情况下,Docker容器可以与外界建立连接,但外部世界无法连接到容器。由于Docker服务器启动时主机上的iptables伪装规则,每个传出连接似乎都来自主机的一个IP地址:

$ sudo iptables -t nat -L -n

...
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16       0.0.0.0/0
...
  

Docker服务器创建一个伪装规则,允许容器连接到外部世界的IP地址。

您可以看到in this thread当这些规则生成时会发生什么。 (他们need to be restored

您可以在" Build your own bridge"。

中学习相同的选项