背景
我想了解 docker 容器网络和 iptables 之间的关系,并大致了解数据包如何从 eth0 接口(在容器中),通过默认网桥 docker0 接口,到达主机上的网络接口。目前,我无法理解默认 docker 容器网络的过滤器 iptables 规则和链。在不运行任何容器的情况下,该命令sudo iptables -t filter -L -v -n
显示
$ sudo iptables -t filter -L -v -n
Chain INPUT (policy ACCEPT 108K packets, 12M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
183K 304M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
183K 304M DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
107K 301M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
76705 3634K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 98618 packets, 14M bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
76705 3634K DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
183K 304M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
76705 3634K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
183K 304M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
根据文档,Docker 添加了两个名为DOCKER-USER
和 的自定义 iptables 链DOCKER
,并确保传入的数据包始终首先由这两个链检查。但它从未提及DOCKER-ISOLATION-STAGE-1
。我无法理解通过这些定义的链和规则的数据包流。
这是我目前的理解。
- 在 中
Chain FORWARD
,第一条规则规定来自任何源和目的地的所有流量都将发送到DOCKER-USER
链。 - 在
DOCKER-USER
链中,只有一个规则,即所有从任何来源到任何目的地的流量都有一个目标RETURN,返回到链中FORWARD
。 - 然后,第二条规则规定
Chain FORWARD
来自任何源和目的地的所有流量都将发送到DOCKER-ISOLATION-STAGE-1
链。 - 该
DOCKER-ISOLATION-STAGE-1
链条有两个规则。- 规则 1:从 docker0 接口到除它本身 (!docker0) 之外的任何接口的所有流量都被发送到 DOCKER-ISOLATION-STAGE-2 链。
- 规则 2:所有其他流量返回到其原始链(例如,FORWARD 或 INPUT)。
- 该
DOCKER-ISOLATION-STAGE-2
链条也有两个规则。- 规则 1:丢弃从任何接口到 docker0 接口的所有流量。
- 规则 2:所有其他流量返回到其原始链。
问题
我无法理解 chain 的第一条规则DOCKER-ISOLATION-STAGE-1
。当我们说“从 docker0 接口到除它本身 (!docker0) 之外的任何接口的所有流量都发送到 DOCKER-ISOLATION-STAGE-2 链”时,这是什么意思?
更准确地说,我想知道,
- “docker0 接口”到底是什么意思?
- 由于第一条规则,它最终会在什么样的数据包流场景中丢弃数据包
DOCKER-ISOLATION-STAGE-2
?
跟进DOCKER-ISOLATION-STAGE-1
根据我对 iptables 的理解,和
的规则DOCKER-ISOLATION-STAGE-2
匹配并因此丢弃来自 docker0 网络上的 Docker 容器的任何传出流量,这些流量不打算用于同一网络上的另一个容器。这包括发往 Docker 主机或外部网络上其他接口的流量。
我对 docker 容器网络和 ip 表的理解是否正确?
PS 但是,在 3000、3001 运行两个开放端口的 docker 容器后,DOCKER 链发生了变化
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:3000
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:3001
两个容器都可以互相 ping 通,也可以 ping 通主机。
编辑也许nat
iptable 也会有帮助
sudo iptables -t nat -L -v -n
Chain PREROUTING (policy ACCEPT 2 packets, 168 bytes)
pkts bytes target prot opt in out source destination
5 340 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 47 packets, 3607 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 49 packets, 3775 bytes)
pkts bytes target prot opt in out source destination
110 6860 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:3000
0 0 MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:3001
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
1 84 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3000 to:172.17.0.2:3000
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3001 to:172.17.0.3:3001
你做对了。
它通过 DOCKER-ISOLATION-STAGE-2 链将每个数据包路由到外部。最有可能用于限制数据包从容器到 Internet 的规则的单独规范。
docker0 是默认的以太网桥,每个容器都连接到它。