网络桥接
网络桥是一种虚拟网络设备,它在两个或多个网络段之间转发数据包。桥充当虚拟网络交换机,并且工作透明。网络中的其他机器无需了解其存在。物理网络设备(例如 eth1)和虚拟网络设备(例如 tap0)都可以连接到它。
创建桥
创建网络桥有多种方法。本节概述了使用至少一个以太网接口设置桥所需的步骤。这对于 QEMU 的桥接模式、设置基于软件的接入点等非常有用。
使用 iproute2
本节介绍使用 ip 工具管理网络桥。该工具来自 iproute2 包,而该包又是 base 元数据包所必需的。
创建一个新的桥并将其状态设置为 up
# ip link add name bridge_name type bridge # ip link set dev bridge_name up
要将一个接口(例如 eth1)添加到桥中,其状态必须为 up
# ip link set eth1 up
通过将接口的 master 设置为 bridge_name 来将其添加到桥中
# ip link set eth1 master bridge_name
要显示现有的桥及其关联的接口,请使用 bridge 工具(也包含在 iproute2 中)。有关详细信息,请参阅 bridge(8)。
# bridge link
这是从桥中移除接口的方法
# ip link set eth1 nomaster
接口仍将处于 up 状态,因此您可能还想将其禁用
# ip link set eth1 down
要删除桥,请发出以下命令
# ip link delete bridge_name type bridge
这将自动从桥中移除所有接口。但是,从属接口仍将处于 up 状态,因此您可能还想在之后将其禁用。
添加主网络接口
如果您是在远程服务器上进行此操作,并且计划将主网络接口(例如 eth0)添加到桥中,请先记下当前的网络状态
$ ip address show eth0 $ ip route show dev eth0
在此示例中,这是相关信息
- 附加到
eth0的 IP 地址:10.2.3.4/8 - 默认网关:
10.0.0.1 - 桥名称:
br0
桥的初始设置
# ip link add name br0 type bridge # ip link set dev br0 up # ip address add 10.2.3.4/8 dev br0 # ip route append default via 10.0.0.1 dev br0
然后,快速连续执行这些命令。建议将它们放在脚本文件中并执行该脚本
# ip link set eth0 master br0 # ip address del 10.2.3.4/8 dev eth0
说明
- 一旦
eth0被添加到桥中,它将不再用于路由。br0将取而代之,因此它需要一个 IP 地址并附加默认路由。 - 在将接口添加到
br0之前,我们不能删除eth0上的 IP 地址,否则网络连接将丢失。 - 但是,我们需要快速删除
eth0上的 IP 地址,否则网络连接将在短时间内丢失。 - Linux 不允许在同一个路由表中设置两个默认路由。简单的解决方法是附加新的默认路由。
- 一旦删除了
eth0的 IP 地址,附加到它的默认路由也会被自动删除。
使用 bridge-utils
本节介绍使用来自 bridge-utils 包的旧版 brctl 工具管理网络桥。有关选项的完整列表,请参阅 brctl(8)。
创建一个新的桥
# brctl addbr bridge_name
将设备添加到桥中,例如 eth1
# brctl addif bridge_name eth1
显示当前桥及其连接的接口
$ brctl show
将桥设备设置为 up
# ip link set dev bridge_name up
删除桥,您需要先将其设置为 down
# ip link set dev bridge_name down # brctl delbr bridge_name
添加主网络接口
首先,记下当前的网络状态
$ ip address show eth0 $ ip route show dev eth0
在此示例中,这是相关信息
- 附加到
eth0的 IP 地址:10.2.3.4/8 - 默认网关:
10.0.0.1 - 桥名称:
br0
桥的初始设置
# brctl addbr br0 # ip address add 10.2.3.4/8 dev br0 # ip link set dev br0 up
然后,快速连续执行这些命令。建议将它们放在脚本文件中并执行该脚本
# brctl addif br0 eth0 # ip address del 10.2.3.4/8 dev eth0
使用 netctl
请参阅 使用 netctl 创建桥。
使用 systemd-networkd
请参阅 systemd-networkd#桥接口。
使用 NetworkManager
GNOME 的网络设置可以创建桥,但目前不会自动连接到它们或从属/附加接口。打开网络设置,添加一个类型为 Bridge 的新接口,添加一个新的桥接连接,并选择要附加到桥的设备的 MAC 地址。
KDE 的 plasma-nm 可以创建桥。为了查看、创建和修改桥接口,请通过右键单击系统托盘中的网络小程序并选择“配置网络连接...”或通过“系统设置 > 连接”打开“连接”窗口。点击模块左下角的“配置”按钮并启用“显示虚拟连接”。需要重新启动会话才能使用已启用该功能。
nm-connection-editor 可以像 GNOME 的网络设置一样创建桥。 此页面显示了这些步骤以及截图。
来自 networkmanager 的 nmcli 可以创建桥。例如,要创建一个 STP 已禁用(以避免在网络上广播桥)的桥 br0,请运行
$ nmcli connection add type bridge ifname br0 stp no
将您的以太网接口(在此示例中为 enp30s0,有关查找名称的说明,请参阅 网络配置#网络接口)设置为桥的从属
$ nmcli connection add type bridge-slave ifname enp30s0 master br0
禁用当前连接(您可以使用 nmcli connection show --active 获取连接名称)
$ nmcli connection down Connection
启用新的桥
$ nmcli connection up bridge-br0 $ nmcli connection up bridge-slave-enp30s0
如果 NetworkManager 对您添加到桥的设备的默认接口自动连接,您可能希望通过在网络设置中点击其旁边的齿轮图标并取消勾选“身份”下的“自动连接”或使用以下命令来禁用它
$ nmcli connection modify Connection connection.autoconnect no
分配 IP 地址
当桥完全设置好后,它可以分配一个 IP 地址
使用 iproute2
# ip address add dev bridge_name 192.168.66.66/24
使用 NetworkManager
为其分配所需的地址
# nmcli connection modify Connection ipv4.addresses desired_IP
设置 DNS 服务器(这也将避免在应用更改后无法加载任何页面)
# nmcli connection modify Connection ipv4.dns DNS_server
将 IP 地址设置为静态
# nmcli connection modify Connection ipv4.method manual
应用更改
# nmcli connection up Connection
技巧与提示
桥接的无线接口
要将无线接口添加到桥中,您必须首先将无线接口分配给一个接入点,或者使用 hostapd 启动一个接入点。否则,无线接口将不会被添加到桥中。
另请参阅 Debian:BridgeNetworkConnections#Bridging with a wireless NIC。
加速发往桥本身流量
在某些情况下,桥不仅充当桥接盒,还与其他主机通信。发往桥端口并最终发往桥本身的数据包默认会进入 iptables 的 INPUT 链,以逻辑桥端口作为输入设备。这些数据包会由网络代码排队两次,第一次是在网络设备接收到它们之后。第二次是在桥代码检查了目标 MAC 地址并确定它是本地目标数据包,因此决定将其传递给更高级别的协议栈之后。[1]
让本地目标数据包只排队一次的方法是通过在 broute 表的 BROUTING 链中对其进行 brouting。假设 br0 有一个 IP 地址,并且 br0 的桥端口没有 IP 地址。使用以下规则应该会让所有本地定向流量只排队一次
# ebtables -t broute -A BROUTING -d $MAC_OF_BR0 -p ipv4 -j redirect --redirect-target DROP
桥的响应将通过 br0 设备发送出去(假设您的路由表正确并将所有流量通过 br0 发送),因此一切都会正常工作,而不会因为数据包排队两次而造成性能损失。
需要 redirect 目标,因为桥端口的 MAC 地址不一定等于桥设备的 MAC 地址。发往桥盒的数据包将具有等于桥 br0 的 MAC 地址,因此该目标地址必须更改为桥端口的 MAC 地址。
故障排除
桥配置后无网络连接
删除已添加到桥的接口(例如 eth1)上的所有 IP 地址和路由,并改为将这些参数配置给桥可能有助于解决此问题。
首先,确保没有为 eth1 运行 dhcpcd 实例,否则已删除的地址可能会被重新分配。
从 eth1 接口删除地址和路由
# ip addr del address dev eth1 # ip route del address dev eth1
现在必须设置先前配置的桥的 IP 地址和路由。这通常通过为此接口启动 DHCP 客户端来完成。否则,请参阅 网络配置以获取手动配置。
桥配置后托管服务器无网络连接
由于桥的 MAC 地址不一定等于服务器通常使用的网卡的 MAC 地址,服务器提供商可能会丢弃来自桥的传出流量,从而导致桥接服务器以太网接口时连接丢失。因此,对于托管服务器,可能需要配置桥来克隆以太网接口的 MAC 地址。
连接到常规连接后无法连接到桥连接
在 Network Manager 小程序中,如果您有常规以太网/无线连接(非桥接从属连接),并且您首先连接到它,然后尝试连接到桥接连接(无论是否先断开与常规连接的连接),那么您将无法连接到它。出于某种原因,桥接从属连接(它未在网络小程序中列出)未激活,即使自动连接复选框已启用。
解决方法是通过终端手动激活它
nmcli connection up br1\ slave\ 1
然后您的桥连接就可以立即工作了。
桥在网络的一侧似乎无法正常工作
请参阅 QEMU#内部网络。