Linux下实现网络桥接bridge

在 Linux 下实现网络桥接(Network Bridging)可以将多个网络接口连接在一起,使它们像一个单一的广播域那样工作。这在虚拟化(如 KVM、QEMU)、容器网络或物理网络扩展中非常常见。以下是使用传统工具 brctl 和现代工具 ip 实现网络桥接的详细步骤和例子。


方法 1:使用 brctl 实现网络桥接

brctlbridge-utils 包中的工具,虽然逐渐被取代,但在许多系统中仍然可用。

步骤

  1. 安装 bridge-utils(如果未安装)

    1
    2
    sudo apt install bridge-utils  # Debian/Ubuntu
    sudo yum install bridge-utils # CentOS/RHEL
  2. 创建网桥

    1
    sudo brctl addbr br0
    • br0 是网桥的名称,可以自定义。
  3. 将接口添加到网桥

    1
    2
    sudo brctl addif br0 eth0
    sudo brctl addif br0 eth1
    • 这里将 eth0eth1 添加到 br0,它们会共享同一个网络。
    • eth0 和 eth1 现在都连接到 br0,它们之间的流量可以通过网桥通信。
    • 接口冲突:一个接口只能属于一个网桥。如果接口已属于其他网桥,需先移除(用 brctl delif)
  4. 启用网桥

    1
    sudo ip link set br0 up
  5. (可选)为网桥配置 IP
    如果需要网桥本身有 IP 地址:

    1
    2
    sudo ip addr add 192.168.1.10/24 dev br0
    sudo ip route add default via 192.168.1.1 dev br0

接口状态:添加接口(eth0/eth1)到网桥后,接口的 IP 地址会失效,因为网桥接管了流量。如果需要 IP,建议为网桥本身配置 IP

  1. 检查桥接状态
    1
    brctl show
    输出示例:
    bridge name bridge id STP enabled interfaces
    br0 8000.00163e123456 no eth0
    eth1

注意

  • 添加到网桥的接口(如 eth0)会失去独立性,其原有 IP 配置会失效。
  • 如果需要启用 STP(生成树协议)防止环路:
    1
    sudo brctl stp br0 on

方法 2:使用 ip 命令实现网络桥接

ip 命令是现代 Linux 推荐的方式,功能更强大,集成在 iproute2 工具集中。

步骤

  1. 创建网桥

    1
    sudo ip link add name br0 type bridge
  2. 将接口绑定到网桥

    1
    2
    sudo ip link set eth0 master br0
    sudo ip link set eth1 master br0
  3. 启用网桥和接口

    1
    2
    3
    sudo ip link set eth0 up
    sudo ip link set eth1 up
    sudo ip link set br0 up
  4. (可选)为网桥配置 IP

    1
    2
    sudo ip addr add 192.168.1.10/24 dev br0
    sudo ip route add default via 192.168.1.1 dev br0
  5. 检查桥接状态

    1
    2
    ip link show type bridge
    bridge link show

    输出示例:
    3: br0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff


应用场景示例:桥接物理接口和虚拟接口

假设你想桥接物理接口 eth0 和虚拟接口 tap0(常用于虚拟机):

使用 ip 命令

  1. 创建 TAP 接口(需要 tunctl 或手动创建):

    1
    sudo ip tuntap add mode tap name tap0
  2. 创建并配置网桥:

    1
    2
    3
    4
    5
    6
    sudo ip link add name br0 type bridge
    sudo ip link set eth0 master br0
    sudo ip link set tap0 master br0
    sudo ip link set eth0 up
    sudo ip link set tap0 up
    sudo ip link set br0 up
  3. 配置 IP(可选):

    1
    2
    3
    4
    5
    6
    7
    sudo ip addr add 192.168.1.10/24 dev br0


    sudo ip addr add 192.168.100.100/24 dev eth0
    sudo ip addr add 192.168.100.200/24 dev eth0

    ip link set eth0 up/down

结果

  • eth0(物理网络)和 tap0(虚拟机)通过 br0 桥接,虚拟机可以直接访问外部网络。

永久配置网络桥接

临时配置在重启后会丢失,需写入配置文件。以下以 Ubuntu(Netplan)为例:

编辑 /etc/netplan/01-netcfg.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
network:
version: 2
ethernets:
eth0:
dhcp4: no
eth1:
dhcp4: no
bridges:
br0:
interfaces: [eth0, eth1]
addresses: [192.168.1.10/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8]

应用配置

1
sudo netplan apply

常见问题

  1. 桥接后无法访问网络?

    • 确保网桥和接口都启用(up 状态)。
    • 检查是否存在默认路由(ip route)。
    • 如果使用 DHCP,需为网桥启用 DHCP:
      1
      sudo dhclient br0
  2. 无线接口(如 wlan0)桥接失败?

    • 无线接口桥接通常需要额外配置(例如主机模式或 4addr 模式),建议使用 hostapd