首页 > 解决方案 > iptables 中的 DOCKER 链如何工作?

问题描述

我是码头工人的新手。

最近我经历了一些奇怪的情况。
我在 OCI(Oracle 云基础设施)中创建了 ubuntu 实例。
当我在这个 ubuntu 实例中启动 nginx 进程时,从外部网络访问失败。
当我使用 docker 容器启动 nginx 时,从外部网络访问成功。

经过一番搜索,我发现 iptables 中的 INPUT 链不允许 tcp 80。
此外,docker 将更新我的 iptables 以在 PREROUTING 链中添加规则。
这是命令的结果sudo iptables -nL -t nat

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80

但是正如您在 DOCKER 链中看到的那样,我认为 RETURN 规则总是比 DNAT 规则更早应用。
这意味着,DOCKER 链不做任何事情!

任何人都可以对此作出任何解释吗?
一种可能的假设是,无论规则的顺序如何,最后都会应用 RETURN 规则。(但我不确定这是不是真的)。

谢谢!

标签: dockernginxiptables

解决方案


RETURN 规则实际上会首先应用,但并不意味着忽略其他规则。还有另外两个变量 IN 和 OUT 描述规则的输入和输出。

您可以添加-v到命令中以显示它。

$ iptables -nL -v -t nat

......
Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
   12   720 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0
 1691  107K DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8601 to:172.17.0.2:8601
......

推荐阅读