网桥转发失败通常表现为静默丢包而非接口down,需检查docker0状态、stp设置、br_netfilter模块、iptables桥接调用、veth挂载及fdb mac学习是否正常。

网桥转发数据包失败,通常不是接口“down”这种显性故障,而是二层转发静默中断——容器间 ping 不通、同网段通信失效,但 ip addr 和 brctl show 看起来一切正常。关键要聚焦在 bridge 设备的内核行为是否真正启用、veth 是否挂载到位、MAC 学习是否生效、以及 netfilter 是否意外拦截。
确认网桥设备已启用且具备转发能力
Linux 网桥 up ≠ 能转发。它依赖多个内核开关协同工作:
- 运行
ip link show docker0,确保状态为 UP(不是 NO-CARRIER 或 DOWN) - 检查 STP 是否阻塞端口:
cat /sys/class/net/docker0/bridge/stp_state,生产环境建议设为 0(echo 0 | sudo tee /sys/class/net/docker0/bridge/stp_state) - 确认桥接流量能触达 iptables:
cat /proc/sys/net/bridge/bridge-nf-call-iptables必须为 1;若为 0,需加载模块:sudo modprobe br_netfilter,并写入/etc/modules
验证 veth pair 是否正确绑定到网桥
每个容器对应一对 veth 设备,只有宿主机侧接口被挂载到 bridge,才能参与二层学习与转发:
- 列出所有接入 docker0 的端口:
brctl show docker0或ip link show master docker0 - 找到形如
vethabcd的接口,确认其 master 字段指向 docker0;若缺失,说明桥接未建立 - 可临时手动挂载测试:
sudo ip link set vethabcd master docker0(仅调试,不持久)
检查桥接表(FDB)是否学习到容器 MAC 地址
网桥靠 FDB 做 MAC 学习和单播转发决策。若表项为空或老化,会导致单向/双向不通:
- 查看当前学习记录:
sudo bridge fdb show | grep -v "self" - 正常应看到类似
00:11:22:33:44:55 dev vethabcd master docker0 self permanent的条目 - 若某容器 MAC 缺失,可能是该容器尚未发出任何二层帧(如刚启动未发 ARP),或网桥根本没收到响应帧
抓包定位转发卡点位置
在关键路径上分别抓包,比对流量是否被截断:
- 在网桥入口抓包:
sudo tcpdump -i docker0 -nn icmp,看容器发出的 ping 请求是否到达网桥 - 在对应 veth 宿主机端抓包:
sudo tcpdump -i vethabcd -nn icmp,确认请求是否被转发进容器 - 若
docker0有包但vethabcd没有 → 桥接转发被阻断(查 bridge 设置或 netfilter) - 若
vethabcd有包但容器内收不到 → 可能是网络命名空间路由异常或容器内防火墙拦截











