Linux bridge 是虚拟化网络的基石。很多人知道它能当交换机用,但具体到虚拟机和容器两种场景,配置和流量路径其实差别很大。
本文结合图解和部署经验,把两种场景彻底讲清楚。
虚拟机场景:bridge 就是交换机
虚拟机场景下,Linux bridge 的工作方式最接近物理交换机。
架构
- 每个虚拟机通过 TAP 设备(比如 tap0、tap1)连接到 br0
数据包流向:虚拟机发包 → TAP 设备 → br0 → eth0 → 物理网络。整个过程不需要经过宿主机的协议栈,效率很高。
关键配置
# 创建网桥ip link add br0 type bridgeip link set br0 up# 物理网卡加入网桥(注意:eth0 不需要 IP)ip link set eth0 master br0# 给网桥配 IP(原来 eth0 的 IP 移到 br0)ip addr add 1.2.3.100/24 dev br0ip route add default via 1.2.3.1 dev br0# 创建 TAP 设备给虚拟机ip tuntap add tap0 mode tapip link set tap0 upip link set tap0 master br0
特点
容器场景:bridge 只是第一步
容器场景比虚拟机复杂,因为容器网络需要解决两个问题:
架构差异
- 容器使用 veth pair 而不是 TAP 设备
- veth pair 一端在容器里(eth0),另一端在宿主机(比如 veth0)
- veth0 加入 br0,但宿主机的 eth0 不加入 br0
数据包流向:容器发包 → veth pair → br0 → 宿主机三层 IP 协议栈 → eth0 → 物理网络。

注意这里和虚拟机的区别:容器流量必须经过宿主机三层 IP 协议栈,因为需要做路由和 NAT。
补充:
关键配置
# 创建网桥(容器网段,不是物理网段)ip link add br0 type bridgeip addr add 1.2.3.101/24 dev br0ip link set br0 up# 物理网卡保持独立,有自己的 IPip addr add 10.20.30.100/24 dev eth0# 开启 IP 转发echo 1 > /proc/sys/net/ipv4/ip_forward# 创建 veth pair 连接容器ip link add veth0 type veth peer name eth0ip link set eth0 netns container_nsip link set veth0 master br0ip link set veth0 up
# 在容器里配置 IP ip netns exec container_ns ip addr add 1.2.3.102/24 dev eth0ip netns exec container_ns ip linkset eth0 upip netns exec container_ns ip route add default via 1.2.3.101 dev eth0
NAT 配置
容器网段 1.2.3.0/24 和物理网络 10.20.30.0/24 不同,需要 SNAT:
iptables -t nat -A POSTROUTING -s 1.2.3.0/24 ! -o br0 -j MASQUERADE
这条规则的意思是:来自容器网段的流量,如果不是从 br0 出去(即访问外网),就做源地址转换。加上 ! -o br0 是为了防止一种异常:如果容器访问同网段的其他容器(比如 1.2.3.103),包本来在 br0 内部二层交换就能到达,不需要上三层路由;如果没有 ! -o br0,源 IP 会被错误地伪装成宿主机的 IP,回包时 NAT 记录匹配不上,通信就断了。
补充:
两种场景对比
为什么容器不直接用桥接
你可能会问:容器为什么不像虚拟机那样直接桥接到物理网络?
原因有几个:
- IP 地址紧张:物理网络的 IP 是有限的,容器数量可能很多,直接占用物理 IP 不现实
- 网络隔离:容器需要独立的网络命名空间,桥接会破坏这种隔离
- 灵活性:容器网络需要支持 overlay、CNI 插件等复杂场景,纯桥接不够灵活
所以容器选择了"私有网段 + NAT"的模型,这是权衡后的结果。
一个常见的坑
很多人在配置容器网络时,会犯一个错误:把 eth0 也加入 br0,然后给 br0 配两个网段的 IP。
这样会导致路由混乱。正确的做法是:
- 虚拟机场景:eth0 加入 br0,br0 配物理网段 IP
- 容器场景:eth0 独立,br0 配容器网段 IP,两者通过路由和 NAT 打通
不要混用两种模型。
总结
Linux bridge 在虚拟机和容器场景中都扮演重要角色,但用法完全不同:
- 虚拟机:bridge 就是交换机,流量直通二层,性能最好
- 容器:bridge 是网关,流量需要经过宿主机三层 IP 协议栈做路由和 NAT
理解这个区别,你就能正确配置虚拟化网络,也能快速排查"容器 ping 不通外网"这类问题。