路由查找失败通常因内核ip转发未启用、iptables nat规则缺失或错配、网桥未激活、veth未正确挂载,以及多网络子网重叠导致路由冲突。

路由查找失败在 Docker 复杂环境中,通常表现为容器能 ping 通宿主机或网关,但无法访问外网、跨网络容器间通信中断、或 DNS 解析卡在“Temporary failure”——这往往不是容器本身问题,而是底层路由路径断裂。核心在于:Linux 内核的路由表、iptables NAT 规则、网桥转发状态、以及自定义网络子网配置四者未协同工作。
确认 IP 转发与内核路由能力是否启用
Docker 容器出向流量必须经宿主机转发,若内核未开启 IPv4 转发,所有跨网段请求都会被静默丢弃。
- 运行
sysctl net.ipv4.ip_forward,输出为 0 即未启用 - 临时启用:
sudo sysctl -w net.ipv4.ip_forward=1 - 永久生效:编辑
/etc/sysctl.conf,确保含net.ipv4.ip_forward=1,再执行sudo sysctl -p - 特别注意:某些云平台(如部分 OpenStack 或私有 VPC)会默认关闭该参数,重启后可能复位
检查 NAT 规则是否完整且匹配子网
bridge 模式下,Docker 依赖 iptables 的 MASQUERADE 规则做源地址转换。若规则缺失、错配子网或被其他防火墙覆盖,路由查找会在 POSTROUTING 链失败。
- 查看当前 NAT 规则:
sudo iptables -t nat -L POSTROUTING -n - 确认存在类似这一行(子网需与你的自定义网络一致):
MASQUERADE all -- 172.20.0.0/16 !docker0 - 若缺失,手动添加(以
172.20.0.0/16为例):sudo iptables -t nat -A POSTROUTING -s 172.20.0.0/16 ! -o docker0 -j MASQUERADE - 若使用 firewalld(CentOS/RHEL),它常清空 Docker 规则,建议停用:
sudo systemctl stop firewalld,或配置 docker zone
验证网桥与容器网络接口连通性
路由查找失败常因 veth 设备未正确挂载到网桥,或网桥自身未激活。
- 列出所有网桥:
ip link show type bridge,确认docker0或自定义网桥(如my-net)状态为 UP - 检查网桥 IP 和子网:
ip addr show docker0,确保其 IP 是对应子网的网关(如172.17.0.1/16) - 查容器 veth 接口是否接入:
ip link | grep veth,再用brctl show docker0(需bridge-utils)看接口是否在列表中 - 若容器启动后无 veth 或网桥无端口,可能是 Docker daemon 启动异常,尝试重启:
sudo systemctl restart docker
排查多网络并存时的路由冲突
当同时存在多个自定义 bridge 网络(如 front-net、back-net)、overlay 网络或 host 模式容器时,内核路由表可能因多条直连路由产生优先级混乱。
- 进入容器,执行
ip route show table all,重点看 default 路由是否指向正确网关(应为所在网络的网桥 IP) - 在宿主机执行
ip rule show和ip route show table local,检查是否存在非标准策略路由干扰 - 避免多个自定义网络使用重叠子网(如都设
172.18.0.0/16),可用docker network create --subnet=172.19.0.0/16 my-net显式指定不冲突网段 - 对关键服务,推荐用
docker network connect将容器接入多个网络,而非混用不同模式











