zhangguanzhang/simple-container-network-book
View on GitHub新版本docker新增的iptables规则导致仅添加路由还不足以实现容器跨节点通信
Open
#9 opened on Dec 18, 2025
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,有啥不足的还请指出