容器bridge网络子网与宿主机物理网段重叠是网络冲突的根源,会导致内核路由混淆、流量误导向docker0、丢包或不可达;需通过ip route get和docker network inspect对比确认重叠,优先删除冲突网络并重建为非重叠子网(如192.168.200.0/24)来根本解决。

容器 bridge 网络子网是否和宿主机物理网段重叠
直接冲突的根源往往就在这里:Docker 默认创建的 docker0 网桥(如 172.17.0.1/16)如果和宿主机 eth0 所在网段(如 192.168.1.0/24)不重叠,通常不会出问题;但一旦你手动配置了自定义 bridge 网络,比如 docker network create --subnet=192.168.1.0/24 mynet,而宿主机本身就在这个网段里,就会触发路由混淆——宿主机发往 192.168.1.100 的包,内核可能优先走 docker0 而不是 eth0,导致丢包或不可达。
检查方法:
- 查看宿主机主网卡网段:ip -o -f inet addr show eth0 | awk '{print $4}'
- 查看所有 Docker 网络子网:docker network inspect bridge | grep Subnet,再对每个自定义网络重复执行(如 docker network inspect mynet)
- 对比输出:若出现相同前缀(如都是 192.168.1.0/24),即确认重叠
- 不要只看默认
bridge,重点查你主动create的网络 - 某些云环境宿主机用的是
10.0.0.0/8或172.16.0.0/12,也要注意和 Docker 自动分配的172.17.x.x是否有部分重合(如/16vs/24) - 重叠不等于立刻断网,但会显著增加
ip route get查路由时的不确定性
宿主机路由表里是否有指向 docker0 的异常直连路由
Docker 启动后会在宿主机添加类似 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 的路由。但如果子网配置不当,你可能会看到一条更“宽”的路由,比如 192.168.1.0/24 dev docker0 —— 这说明内核把本该走 eth0 的流量强行导给了 docker0,容器甚至可能收不到包。
验证命令:ip route get 192.168.1.100(把目标 IP 换成你实际业务地址)
- 正常应返回 192.168.1.100 via ... dev eth0 ...
- 若返回 dev docker0 或 dev vethxxx,就是路由污染了
- 临时修复:
sudo ip route del 192.168.1.0/24 dev docker0(仅限测试,重启 Docker 会恢复) - 根本解决:删掉冲突的自定义网络,重建时避开宿主机网段,例如改用
--subnet=192.168.200.0/24 - 别依赖
route -n,它不显示 scope 和 proto,ip route show更准
容器内能否正确解析宿主机 IP,且不被 iptables DROP
即使网段没重叠、路由也正常,容器仍可能 ping 不通宿主机,常见原因是宿主机的 iptables 规则拦截了来自 docker0 子网的入向流量(尤其是 INPUT 链默认 DROP 时)。
快速验证:
- 在容器里执行:ping -c 3
- 在宿主机上同时抓包:sudo tcpdump -i eth0 icmp and host
- 如果抓到请求但无响应,大概率是 INPUT 链挡住了
- 检查规则:
sudo iptables -L INPUT -v -n | grep(如172.17.0.0/16) - 临时放行:
sudo iptables -I INPUT 1 -s 172.17.0.0/16 -j ACCEPT - 注意:firewalld 用户应改用
firewall-cmd --permanent --add-source=172.17.0.0/16,否则重启失效 - 别忘了检查
FORWARD链——虽然 bridge 模式下容器访问外网靠 NAT,但宿主机访问容器走的是 INPUT,不是 FORWARD
多个网卡+自定义 bridge 时的 arp_ignore 干扰
宿主机若有多张网卡(如 eth0 和 ens33)都连在同一物理交换机,又启用了自定义 bridge 网络,Linux 内核可能对同一 IP 的 ARP 请求从多个接口应答,造成 MAC 地址跳变。这看起来像“冲突”,实则是内核行为。
现象:ip neigh show 中同一 IP 对应不同 MAC,且随时间变化;arping 从不同机器探测结果不一致
- 确认是否多网卡同网段:
ip -br a | grep -E 'UP.*192\.168\.1' - 临时关闭干扰:
echo 1 | sudo tee /proc/sys/net/ipv4/conf/ens33/arp_ignore(对非主用网卡设为 1) - 永久生效需写进
/etc/sysctl.conf,加net.ipv4.conf.ens33.arp_ignore = 1 - 注意:此设置会影响高可用 VIP 场景,排查时先临时改,确认后再决定是否保留
真正容易被跳过的,是检查容器启动时是否用了 --network=host 却误以为它走 bridge —— 这种模式下根本不存在网段冲突,但所有网络行为都等同于宿主机进程,排查方向完全不同。











