Linux Bridge工作在数据链路层,仅依据MAC地址转发数据帧,不直接处理子网间路由;跨子网通信需显式启用IP转发、配置netfilter集成及协同路由规则。

Bridge 网络本身工作在二层(数据链路层),不直接处理子网间路由转发;所谓“子网转发规则”,实际是指在启用 IP 转发的前提下,配合 Linux 内核路由表、iptables/NFTables 规则及网桥过滤机制,实现跨子网容器或宿主机与容器间的三层通信优化。关键不在 bridge 本身配转发,而在打通 bridge、路由与 netfilter 的协同路径。
明确 bridge 不等于路由器,需显式启用 IP 转发
默认情况下,Linux 网桥只做 MAC 层交换,不会转发不同子网的 IP 包。要让容器访问其他子网(如宿主机外网、另一自定义 bridge 子网),必须:
- 开启内核 IP 转发:
sysctl -w net.ipv4.ip_forward=1,并写入/etc/sysctl.conf持久化 - 确认网桥已启用 netfilter 集成(关键!):
sysctl -w net.bridge.bridge-nf-call-iptables=1(及 ip6tables、arptables),否则 iptables 规则对经 bridge 的包无效 - 检查内核编译选项
CONFIG_BRIDGE_NETFILTER=y,CentOS/RHEL 可通过grep CONFIG_BRIDGE_NETFILTER /boot/config-$(uname -r)验证
为自定义 bridge 分配固定子网并配置合理网关
避免使用默认 docker0(172.17.0.0/16),它缺乏控制且易冲突。创建带明确子网和网关的自定义网络,是后续转发策略的基础:
- 命令示例:
docker network create --driver bridge --subnet=192.168.100.0/24 --gateway=192.168.100.1 --opt com.docker.network.bridge.enable_icc=false app-net - 其中
--gateway设定的 IP(如 192.168.100.1)会绑定到宿主机上对应的网桥接口(如br-xxxx),成为该子网的三层出口 - 关闭
icc可减少广播、提升安全性,但需用 DNS 或服务发现替代容器直连
精简 iptables 规则,绕过无谓 NAT
bridge 模式下,默认会对出向流量做 SNAT(MASQUERADE),增加开销。若目标是同局域网内其他子网(非公网),应跳过 NAT:
- 查清 Docker 自动添加的规则:
iptables -t nat -L POSTROUTING -n --line-numbers - 删除针对本机 bridge 子网的 MASQUERADE(例如匹配
192.168.100.0/24的那条):iptables -t nat -D POSTROUTING 3(行号按实际) - 添加直通路由规则(可选):
ip rule add to 10.0.0.0/8 lookup main,确保返回包走正确路由表 - 用
iptables -t filter -A FORWARD -i br-xxxx -o eth0 -j ACCEPT显式放行,比依赖默认策略更可控
监控与验证转发路径是否生效
规则配置后必须验证三层可达性,而非仅 ping 通 docker0:
- 从容器内执行:
ip route get 10.10.10.10,看下一跳是否指向网桥网关(如 192.168.100.1) - 在宿主机上抓包:
tcpdump -i br-xxxx icmp和tcpdump -i eth0 icmp,确认包是否真正流出 - 检查 conntrack:
conntrack -L | grep 192.168.100,观察是否有异常 NAT 连接残留 - 禁用防火墙临时测试:
systemctl stop firewalld或ufw disable,排除策略干扰


















