【问题标题】:Can't understand docker iptables rule无法理解 docker iptables 规则
【发布时间】:2018-03-29 20:24:22
【问题描述】:

在使用 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

【问题讨论】:

标签: docker


【解决方案1】:

这在“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”中研究这些相同的选项。

【讨论】:

  • 有问题的规则有点不同,出站连接的标准 MASQUERADE 是上面操作输出中的规则。此规则专门针对在端口映射的目标端口上连接到自身的容器。我不确定为什么在那里使用 MASQ 规则,除非它想更改这些连接的源 IP。显然它只在you turn the userland proxy off 时被击中
  • @Matt 感谢您引用moby issue 33726。我也不确定。
  • @Matt 好的,我去看看有没有新的答案。
  • 我实际上认为该规则是无用的,即使它受到打击。相信MASQ会选择出接口IP作为新的源地址,已经是源地址了。
【解决方案2】:

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

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

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

【讨论】:

  • 似乎比我的回答更准确。 +1
猜你喜欢
  • 2023-01-26
  • 2018-10-09
  • 1970-01-01
  • 2015-05-22
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多