zhangguanzhang/simple-container-network-book

新版本docker新增的iptables规则导致仅添加路由还不足以实现容器跨节点通信

Open

#9 opened on Dec 18, 2025

View on GitHub
 (3 comments) (0 reactions) (0 assignees) (98 forks)github user discovery
good first issuequestion

Repository metrics

Stars
 (955 stars)
PR merge metrics
 (PR metrics pending)

Description

馆长,您好 我在练习容器跨节点通信这一章节的时候发现新版本docker在添加了路由之后也无法ping通

我的实验环境 VMware Workstation 17 Pro linux version: Rocky Linux release 8.10 docker version: 28.5.2

┌─────────────────────────────────┐         ┌─────────────────────────────────┐
│          主机A                   │         │          主机B                  │
│    ┌─────────────────────┐      │         │      ┌─────────────────────┐    │
│    │    Network Stack    │──────┼────-────┼──────│    Network Stack    │    │
│    └─────────┬───────────┘      │         │      └─────────┬───────────┘    │
│              │                  │         │                │                │
│    ┌─────────▼──────────┐       │         │       ┌─────────▼──────────┐    │
│    │      ens160        │       │         │       │      ens160        │    │
│    │  192.168.40.101/24 │───────┼─────────┼───────│  192.168.40.102/24 │    │
│    └────────────────────┘       │         │       └────────────────────┘    │
│              │                  │         │                │                │
│    ┌─────────▼──────────┐       │         │       ┌─────────▼──────────┐    │
│    │     docker0        │       │         │       │     docker0        │    │
│    │    172.17.0.1/16   │       │         │       │    10.10.0.1/16    │    │
│    └─────────┬──────────┘       │         │       └─────────┬──────────┘    │
│              │                  │         │                │                │
│              ▼                  │         │                ▼                │
│          +--------+             │         │             +--------+          │
│          | vethA  |─────────────┼───❌────┼─────────────| vethB  |          │
│          +--------+             │         │             +--------+          │
│              │                  │         │                │                │
└──────────────┼──────────────────┘         └────────────────┼────────────────┘
               │                                             │
               │                                             │
               ▼                                             ▼
        ┌────────────┐                                ┌────────────┐
        │ ContainerA │                                │ ContainerB │
        │  eth0:     │                                │  eth0:     │
        │ 172.17.0.2 │                                │ 10.10.0.2  │
        └────────────┘                                └────────────┘

添加路由 主机A

ip route add 10.10.0.0/16 via 192.168.40.102 dev ens160

主机B

ip route add 172.17.0.0/16 via 192.168.40.101 dev ens160

两台主机分别添加了上面的路由之后依然无法通信 经过排查后发现了下面这两条规则,它拒绝了非docker0接口访问容器

$ iptables -nvL PREROUTING  -t raw
Chain PREROUTING (policy ACCEPT 1314 packets, 88268 bytes)
 pkts bytes target     prot opt in     out     source               destination           
  358 30072 DROP       all  --  !docker0 *       0.0.0.0/0            10.10.0.2   
$ iptables -nvL DOCKER 
Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    7   420 DROP       all  --  !docker0 docker0  0.0.0.0/0            0.0.0.0/0

我删掉或者添加下面的放行规则就能通了

iptables -t raw -I PREROUTING -i ens160 -d 10.10.0.2 -j ACCEPT
iptables -I DOCKER -i ens160 -o docker0 -j ACCEPT

我的能力还看不懂docker release notes里面的一些发布说明,就找不到具体是那一条修改项 经过测试发现docker版本在28.3就有了这一条规则,28.2没找到安装包不清楚有没有,28.1测试后是没有这条规则的

第一次提issue,有啥不足的还请指出

Contributor guide