Linux bridge桥接实现:内核二层转发与STP协议 - 第3节
3.1 什么是 Linux Bridge
Linux Bridge(网桥)是内核实现的一个虚拟二层交换设备,工作在 OSI 模型的第二层(数据链路层)。它在软件层面模拟了物理交换机的行为:根据 MAC 地址表转发以太网帧,支持 VLAN 过滤、STP 协议,并能将多个网络接口(物理或虚拟)“桥接”在一起,使它们处于同一个广播域。
核心本质:Linux Bridge 是一个内核模块(
bridge.ko),通过创建一个虚拟网桥设备(如 br0),将其他网络接口作为“端口”加入该设备,实现二层转发。
3.1.1 与物理交换机的类比
理解 Linux Bridge 最快的方式是与物理交换机进行对比。下表列出了关键概念的对应关系:
| 物理交换机概念 | Linux Bridge 对应实现 | 说明 |
|---|---|---|
| 交换机背板 | 内核桥接模块 + 网桥设备(brX) | 提供数据交换的软件通道 |
| 物理端口(RJ45/SFP) | 加入网桥的网络接口(eth0, tap0, veth0 等) | 可以是物理网卡或虚拟接口 |
| MAC 地址表(CAM 表) | 内核 FDB(Forwarding Database) | 通过 bridge fdb show 查看 |
| STP 协议 | 内核 STP 实现(或用户态 mstpd) |
防止二层环路,默认启用 |
| VLAN 划分 | 内核 VLAN 过滤(802.1Q) | 通过 bridge vlan 配置 |
| 管理 IP 地址 | 网桥设备本身的 IP 地址 | 用于管理访问,不参与转发 |
关键区别:物理交换机通常有专用硬件 ASIC 进行线速转发,而 Linux Bridge 依赖 CPU 和内核协议栈。在纯二层转发场景下,Linux Bridge 性能远低于硬件交换机,但在虚拟化、容器网络场景中,其灵活性和可编程性无可替代。
下面通过一张 SVG 架构图直观展示 Linux Bridge 的内部组件与转发路径:
3.2 网桥管理工具:brctl 与 iproute2
Linux 提供了两套用户态工具来管理网桥:传统的 brctl(来自 bridge-utils 包)和现代的 ip 命令(来自 iproute2 包)。两者功能重叠,但 ip 命令更强大,是当前推荐的管理方式。
3.2.1 brctl 工具(传统方式)
brctl 是 Linux 上最早出现的网桥管理工具,语法简单直观,适合快速操作。常用命令如下:
| 操作 | brctl 命令 | 说明 |
|---|---|---|
| 创建网桥 | brctl addbr br0 |
创建一个名为 br0 的网桥设备 |
| 删除网桥 | brctl delbr br0 |
删除网桥(需先移除所有端口) |
| 添加端口 | brctl addif br0 eth0 |
将 eth0 加入网桥 br0 |
| 移除端口 | brctl delif br0 eth0 |
从网桥中移除 eth0 |
| 显示网桥信息 | brctl show |
列出所有网桥及其端口 |
| 显示 MAC 表 | brctl showmacs br0 |
查看 br0 的 FDB 转发表 |
| 启用/禁用 STP | brctl stp br0 on/off |
控制 STP 协议开关 |
典型操作示例:
# 创建网桥 br0
brctl addbr br0
# 将物理网卡 eth0 和虚拟网卡 tap0 加入网桥
brctl addif br0 eth0
brctl addif br0 tap0
# 启用 STP 防止环路
brctl stp br0 on
# 查看网桥状态
brctl show
bridge name bridge id STP enabled interfaces
br0 8000.001122334455 yes eth0
tap0
# 查看 MAC 地址表
brctl showmacs br0
port no mac addr is local? ageing timer
1 00:11:22:33:44:55 yes 0.00
2 00:aa:bb:cc:dd:ee no 2.34
3.2.2 iproute2 工具(现代方式)
ip 命令是 iproute2 套件的核心,统一管理网络设备、路由、隧道等。网桥相关操作通过 ip link 和 ip bridge 子命令完成。
| 操作 | ip 命令 | 说明 |
|---|---|---|
| 创建网桥 | ip link add name br0 type bridge |
创建类型为 bridge 的虚拟设备 |
| 删除网桥 | ip link delete br0 type bridge |
删除网桥设备 |
| 添加端口 | ip link set eth0 master br0 |
将 eth0 设置为 br0 的从属端口 |
| 移除端口 | ip link set eth0 nomaster |
从所属网桥中移除 eth0 |
| 启用网桥 | ip link set br0 up |
激活网桥设备 |
| 查看网桥信息 | ip link show type bridge |
列出所有网桥设备 |
| 查看端口信息 | bridge link show |
显示所有网桥端口及状态 |
| 查看 FDB 表 | bridge fdb show |
显示转发数据库 |
| 配置 STP | ip link set br0 type bridge stp_state 1 |
1 启用,0 禁用 |
典型操作示例:
# 创建网桥 br0
ip link add name br0 type bridge
# 将 eth0 和 tap0 加入网桥
ip link set eth0 master br0
ip link set tap0 master br0
# 启用 STP
ip link set br0 type bridge stp_state 1
# 激活网桥
ip link set br0 up
# 查看网桥设备
ip link show type bridge
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
# 查看端口信息
bridge link show
3: eth0 state FORWARDING <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
4: tap0 state FORWARDING <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2
# 查看 FDB 表
bridge fdb show br br0
00:11:22:33:44:55 dev eth0 master br0 permanent
00:aa:bb:cc:dd:ee dev tap0 master br0
3.2.3 brctl 与 iproute2 对比
下表从多个维度对比两种工具,帮助你在实际场景中选择合适的方式:
| 对比维度 | brctl | iproute2 (ip/bridge) |
|---|---|---|
| 所属软件包 | bridge-utils | iproute2 |
| 语法风格 | 专用命令,简单直接 | 统一框架,子命令分层 |
| 功能覆盖 | 基础网桥操作 | 完整网桥 + VLAN + 隧道 + 策略 |
| VLAN 过滤 | 不支持 | 支持(bridge vlan) |
| 多路径转发 | 不支持 | 支持(bridge fdb 指定出口) |
| 内核版本依赖 | 所有版本 | 需 3.8+ 内核(完整功能) |
| 推荐场景 | 快速调试、老旧系统 | 生产环境、新部署 |
重要提示:虽然
brctl 仍然可用,但 Linux 内核社区已明确将 iproute2 作为标准管理工具。在 RHEL 9、Ubuntu 22.04+ 等新发行版中,bridge-utils 可能不再预装。建议新项目统一使用 ip 和 bridge 命令。
下面通过一张 SVG 流程图对比两种工具的操作流程:
3.3 网桥的典型应用场景
Linux Bridge 在虚拟化和容器网络中扮演核心角色,以下是三个最常见的应用场景:
- KVM/QEMU 虚拟机网络:虚拟机通过 tap 设备连接到宿主机网桥,实现与宿主机网络互通。每个虚拟机相当于一台连接到同一交换机的物理主机。
- Docker 容器网络(bridge 模式):Docker 默认创建
docker0网桥,容器通过 veth 对连接到该网桥,实现容器间通信和 NAT 访问外网。 - LXC/LXD 容器网络:类似 Docker,通过网桥将容器连接到宿主机网络,支持 VLAN 隔离和复杂网络拓扑。
性能提示:在虚拟化场景中,如果对网络性能要求极高(如 10Gbps+ 流量),建议使用 SR-IOV 或 DPDK 绕过内核网桥。Linux Bridge 适合中小规模部署和灵活管理场景。
3.4 本章小结
- Linux Bridge 是内核实现的虚拟二层交换机,通过 FDB 表进行 MAC 地址学习和转发。
- 与物理交换机在概念上一一对应,但转发依赖 CPU,性能低于硬件交换机。
brctl是传统管理工具,语法简单,适合快速操作。iproute2是现代推荐工具,功能更全面,支持 VLAN 过滤和高级转发策略。- 网桥是 KVM、Docker、LXC 等虚拟化技术的网络基础组件。