什么是 Linux 网桥?
理解网桥是什么至关重要。

- 物理类比:你可以把网桥想象成一个多端口的以太网交换机,它工作在 OSI 模型的数据链路层(第二层)。
- 核心功能:
- 学习 MAC 地址:它会学习连接到其各个端口(物理网卡或虚拟接口)的设备的 MAC 地址,并建立一个 MAC 地址表,记录了哪个 MAC 地址在哪个端口上。
- 数据帧转发:当数据帧到达网桥时,它会检查目标 MAC 地址,如果目标 MAC 地址在同一个端口上(或广播地址),它不会转发数据帧(过滤),如果目标 MAC 地址在其他端口,它会将数据帧精准地转发到那个端口(转发),如果目标 MAC 地址未知,它会将数据帧广播到所有其他端口(泛洪)。
- 主要用途:
- 虚拟化:最经典的用法是在 KVM、Xen、LXD 等虚拟化平台中,创建一个虚拟交换机,让虚拟机通过这个交换机与外部网络通信,或者让虚拟机之间相互通信。
- 网络隔离与连接:可以将多个物理网络接口(如
eth0,eth1)桥接在一起,使它们在二层网络看来就像一个接口。 - 容器网络:Docker 和 Podman 在使用
bridge驱动时,默认会创建一个名为docker0或podman的网桥,用于管理容器网络。
管理网桥的核心命令
在 Linux 上,管理网桥主要有两种工具:
brctl:传统的、功能强大的工具,但已被标记为过时。iproute2套件中的ip link:现代的、功能更全面的工具,是官方推荐的方式。
我们将重点介绍 iproute2 的用法,同时也会提及 brctl 以备兼容性需求。
1 安装工具
-
iproute2:通常预装在大多数现代 Linux 发行版中。- Debian/Ubuntu:
sudo apt-get install iproute2 - CentOS/RHEL/Fedora:
sudo yum install iproute(或dnf install iproute)
- Debian/Ubuntu:
-
brctl:如果系统没有,需要手动安装。
(图片来源网络,侵删)- Debian/Ubuntu:
sudo apt-get install bridge-utils - CentOS/RHEL/Fedora:
sudo yum install bridge-utils
- Debian/Ubuntu:
使用 iproute2 (ip link) 管理网桥
1 查看网桥信息
要查看系统中所有的网桥及其详细信息(包括连接的端口),使用 show 或 ls 命令。
# 查看所有网桥的详细信息 $ ip link show # 或者使用更简洁的命令 $ ip link show type bridge # 查看特定网桥(br0)的详细信息 $ ip link show br0 # 查看网桥的 MAC 地址表(学习到的设备) $ bridge link # 或者更详细的 $ bridge fdb show
示例输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP mode DEFAULT group default qlen 1000
link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP mode DEFAULT group default qlen 1000
link/ether 00:1a:2b:3c:4d:5f brd ff:ff:ff:ff:ff:ff
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
从上面的输出可以看到,eth0 和 eth1 的 master 都是 br0,表示它们是网桥 br0 的端口。
2 创建和删除网桥
-
创建一个名为
br0的网桥
(图片来源网络,侵删)# 创建网桥,并设置为 UP 状态 sudo ip link add name br0 type bridge sudo ip link set dev br0 up
-
删除一个名为
br0的网桥# 删除前需要确保网桥是 DOWN 状态,并且没有端口连接到它 sudo ip link set dev br0 down sudo ip link del dev br0
3 添加和删除端口
假设我们有两个物理网卡 eth0 和 eth1。
-
将
eth0添加到br0# 将 eth0 的 master 设置为 br0 sudo ip link set dev eth0 master br0 # (可选)将 eth0 设置为 UP 状态 sudo ip link set dev eth0 up
-
从
br0中移除eth0# 将 eth0 的 master 清空 sudo ip link set dev eth0 nomaster
4 配置网桥 IP 地址
网桥本身可以像一个普通网络接口一样配置 IP 地址,这个 IP 地址通常是整个桥接网络的网关或管理地址。
-
为
br0分配 IP 地址168.1.100/24sudo ip addr add 192.168.1.100/24 dev br0
-
删除
br0上的 IP 地址sudo ip addr del 192.168.1.100/24 dev br0
使用 brctl 管理网桥(旧版)
如果你在维护旧系统,可能会用到 brctl。
1 查看
# 查看所有网桥 $ brctl show # 查看特定网桥 $ brctl show br0
2 创建和删除
# 创建网桥 br0 $ sudo brctl addbr br0 # 删除网桥 br0 $ sudo brctl delbr br0
3 添加和删除端口
# 将 eth0 添加到 br0 $ sudo brctl addif br0 eth0 # 从 br0 中移除 eth0 $ sudo brctl delif br0 eth0
完整实战示例:创建一个网桥并连接物理网卡
这个场景模拟了将一台服务器的两个物理网卡桥接,形成一个虚拟交换机,可以连接虚拟机或用于网络实验。
目标:创建 br0 网桥,将 eth1 和 eth2 加入其中,并为 br0 分配 IP 地址。
步骤:
-
查看当前网络状态
ip link show # 确认 eth1 和 eth2 的状态
-
创建网桥
br0sudo ip link add name br0 type bridge
-
启用网桥
br0sudo ip link set dev br0 up
-
将物理网卡
eth1和eth2加入网桥# 将网卡设置为 UP 状态(推荐) sudo ip link set dev eth1 up sudo ip link set dev eth2 up # 将它们加入网桥 sudo ip link set dev eth1 master br0 sudo ip link set dev eth2 master br0
-
为网桥
br0配置 IP 地址sudo ip addr add 192.168.100.1/24 dev br0
-
验证配置
# 查看网桥信息,确认 eth1 和 eth2 已加入 ip link show br0 # 查看网桥的 IP 地址 ip addr show br0 # 查看网桥的 MAC 地址表 bridge link
-
(可选)设置 STP (Spanning Tree Protocol) 为了防止网络环路,网桥默认会启用 STP,你可以手动关闭它(在无环路的单一路径环境中)。
# 查看STP状态 bridge link show br0 # 关闭STP sudo ip link set dev br0 type bridge stp_state 0 # 开启STP sudo ip link set dev br0 type bridge stp_state 1
-
(可选)设置网桥的网关
br0的 IP 地址需要作为网关,你需要添加默认路由。# 假设网关是 192.168.100.254 sudo ip route add default via 192.168.100.254 dev br0
-
清理(删除所有配置)
# 删除路由 sudo ip route del default via 192.168.100.254 dev br0 # 删除IP地址 sudo ip addr del 192.168.100.1/24 dev br0 # 将网卡从网桥移除 sudo ip link set dev eth1 nomaster sudo ip link set dev eth2 nomaster # 关闭并删除网桥 sudo ip link set dev br0 down sudo ip link del dev br0
持久化配置
使用 ip 命令做的修改是临时的,重启系统后会丢失,要让配置永久生效,你需要修改网络配置文件。
-
对于使用
systemd-networkd的系统 (如 Ubuntu 18.04+, Debian 10+, CentOS 8+): 你需要创建网桥和端口的.netdev和.network文件,这是一个更现代和推荐的方式。-
/etc/systemd/network/br0.netdev:[NetDev] Name=br0 Kind=bridge
-
/etc/systemd/network/br0.network:[Match] Name=br0 [Network] Address=192.168.100.1/24 Gateway=192.168.100.254 DNS=8.8.8.8
-
/etc/systemd/network/eth1.network(将eth1加入网桥):[Match] Name=eth1 [Network] Bridge=br0
-
-
对于使用
NetworkManager的系统 (如 Fedora, Ubuntu Desktop, CentOS 7): 可以使用nmtui或nm-connection-editor图形化工具,或者使用nmcli命令行工具来创建和管理网桥。 -
对于使用
ifcfg的传统系统 (如 CentOS 7 以下): 你需要创建和修改/etc/sysconfig/network-scripts/目录下的文件,如ifcfg-br0,ifcfg-eth1等。
| 功能 | iproute2 (推荐) |
brctl (旧版) |
|---|---|---|
| 创建网桥 | ip link add name br0 type bridge |
brctl addbr br0 |
| 删除网桥 | ip link del dev br0 |
brctl delbr br0 |
| 添加端口 | ip link set dev eth0 master br0 |
brctl addif br0 eth0 |
| 删除端口 | ip link set dev eth0 nomaster |
brctl delif br0 eth0 |
| 查看网桥 | ip link show type bridge |
brctl show |
| 启用/禁用 | ip link set dev br0 up/down |
(无直接命令,通过 ifconfig) |
对于新的项目和系统管理,请务必优先使用 iproute2 套件中的 ip 命令,它是当前的事实标准,功能更强大且持续维护。
