使用 docker 链进行 Iptable 遍历

使用 docker 链进行 Iptable 遍历

使用作为参考上一篇文章,我尝试创建一个考虑桥接网络上的 docker 容器的 iptable 数据包处理流程图。流程图如下所示

流程图

我省略了一些表格以使流程图更简洁。例如,我知道在第一次路由决策之前,数据包在技术上也会经过manglenat

但是我不确定我的理解是否正确。我的流程图是否正确,或者我是否遗漏了重要的 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 的提示。

相关内容