linux中配置容器跨宿主机路由的核心是为各宿主机分配独立容器子网(如a用172.20.1.0/24、b用172.20.2.0/24),修改daemon.json并重启docker,再在双方宿主机添加静态路由(如a执行ip route add 172.20.2.0/24 via 192.168.10.11)、启用ip转发及放行forward链。

Linux 中配置容器跨宿主机路由,核心是让不同宿主机上的容器子网能互相识别、可达。这需要在宿主机层面操作路由表、网络接口和转发规则,不依赖额外编排工具也能实现,适合小规模或测试环境。
为每台宿主机分配独立容器子网
避免 IP 冲突是前提。例如:
- 宿主机 A(IP:192.168.10.10)上,配置 Docker 使用 172.20.1.0/24
- 宿主机 B(IP:192.168.10.11)上,配置 Docker 使用 172.20.2.0/24
修改 /etc/docker/daemon.json 并重启 Docker:
{"bip": "172.20.1.1/24"}
重启后,该宿主机上所有新启容器将自动获得 172.20.1.x 地址,docker0 网桥地址为 172.20.1.1。
添加跨主机静态路由
让宿主机知道“对方容器网段该往哪发”:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 在宿主机 A 上执行:
ip route add 172.20.2.0/24 via 192.168.10.11 dev eth0 - 在宿主机 B 上执行:
ip route add 172.20.1.0/24 via 192.168.10.10 dev eth0
这条规则表示:发往对方容器子网的包,下一跳是另一台宿主机的物理 IP,走 eth0 出去。
启用 IP 转发并配置 iptables
宿主机必须充当中间路由器,所以要打开内核转发:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf<br>sysctl -p
同时允许容器流量进出宿主机(防止被 DROP):
- 放行转发链:
iptables -P FORWARD ACCEPT - 启用源地址伪装(可选,仅当容器需访问外网且不希望暴露内网地址时):
iptables -t nat -A POSTROUTING -s 172.20.0.0/16 ! -d 172.20.0.0/16 -j MASQUERADE
验证连通性
启动两个容器后测试:
- 宿主机 A 上容器 ping 宿主机 B 的 docker0 地址(如 172.20.2.1)——应通
- 再 ping 宿主机 B 上某容器 IP(如 172.20.2.5)——也应通
- 用 tcpdump -i eth0 icmp 在宿主机 B 上抓包,确认 ICMP 请求已到达物理网卡
若 ping 不通,优先检查:路由是否生效(ip route show)、转发是否开启(cat /proc/sys/net/ipv4/ip_forward)、iptables FORWARD 链是否拦截。










