使用这作为参考这上一篇文章,我尝试创建一个考虑桥接网络上的 docker 容器的 iptable 数据包处理流程图。流程图如下所示
我省略了一些表格以使流程图更简洁。例如,我知道在第一次路由决策之前,数据包在技术上也会经过mangle
和nat
。
但是我不确定我的理解是否正确。我的流程图是否正确,或者我是否遗漏了重要的 IP 表?
我仍然不清楚的一件事是如何整合数据包从一个容器发送到同一网络上的另一个容器的场景。这被认为是最正确的决定吗?我的部分困惑源于这样一个事实:在测试中,我从一个 docker 容器 ping 另一个 docker 容器。
$ watch -n 2 -d iptables -nvL
Chain INPUT (policy ACCEPT 120 packets, 7060 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
16 1344 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
16 1344 DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
15 1260 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
1 84 DOCKER all -- * 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
1 84 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 151 packets, 23212 bytes)
pkts bytes target prot opt in out source destination
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
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
0 0 DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
16 1344 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
0 0 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
16 1344 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
我发送了 8 个数据包(或 16 个 ping/ping-响应对)。但根据这个结果。这里链只接收了 1 个数据包DOCKER
,而链上的第 3 条规则接受了 15 个数据包FORWARD
。为什么会这样?
感谢您提供任何有助于理解数据包如何通过涉及 docker 容器的 iptables 的提示。