通过 iptables 规则了解 docker 容器桥接网络的数据包流?

通过 iptables 规则了解 docker 容器桥接网络的数据包流?

背景 我想了解 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。我无法理解通过这些定义的链和规则的数据包流。

这是我到目前为止的理解。

  1. 在 中Chain FORWARD,第一条规则规定来自任何源和目的地的所有流量都发送到链DOCKER-USER
  2. DOCKER-USER链中,只有一条规则,即从任何源到任何目的地的所有流量都有一个目标RETURN,返回到FORWARD链中。
  3. 然后,第二条规则指出Chain FORWARD来自任何源和目的地的所有流量都发送到DOCKER-ISOLATION-STAGE-1链。
  4. DOCKER-ISOLATION-STAGE-1链有两条规则。
    1. 规则 1:从 docker0 接口到除自身之外的任何接口 (!docker0) 的所有流量都将发送到 DOCKER-ISOLATION-STAGE-2 链。
    2. 规则 2:所有其他流量都返回到其原始链(例如,FORWARD 或 INPUT)。
  5. DOCKER-ISOLATION-STAGE-2链也有两条规则。
    1. 规则 1:从任何接口到 docker0 接口的所有流量都会被丢弃。
    2. 规则 2:所有其他流量都返回到其原始链。

问题 我无法理解链的第一条规则DOCKER-ISOLATION-STAGE-1。当我们说“从 docker0 接口到除自身之外的任何接口 (!docker0) 的所有流量都发送到 DOCKER-ISOLATION-STAGE-2 链”时,这是什么意思?

更准确地说,我想知道,

  1. “docker0接口”到底是什么意思?
  2. 由于第一个规则,在什么样的数据包流场景中最终会丢弃数据包DOCKER-ISOLATION-STAGE-2

跟进 根据我对 iptables 的理解,DOCKER-ISOLATION-STAGE-1和的规则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 通主机。

编辑也许natiptable 也会有帮助

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

答案1

问题 我无法理解链 DOCKER-ISOLATION-STAGE-1 的第一条规则。当我们说“从 docker0 接口到除自身之外的任何接口 (!docker0) 的所有流量都发送到 DOCKER-ISOLATION-STAGE-2 链”时,这是什么意思?

你做对了。

它通过 DOCKER-ISOLATION-STAGE-2 链路由每个向外发送的数据包。最有可能的是用于限制数据包从容器到互联网的单独规则规范。

docker0 是每个容器连接到的默认以太网桥。

相关内容