跳转至内容

网络桥接

来自 ArchWiki
(从 Bridge 重定向而来)

网络桥是一种虚拟网络设备,它在两个或多个网络段之间转发数据包。桥充当虚拟网络交换机,并且工作透明。网络中的其他机器无需了解其存在。物理网络设备(例如 eth1)和虚拟网络设备(例如 tap0)都可以连接到它。

创建桥

创建网络桥有多种方法。本节概述了使用至少一个以太网接口设置桥所需的步骤。这对于 QEMU 的桥接模式、设置基于软件的接入点等非常有用。

警告 如果您正在远程服务器上创建桥,并且计划将主网络接口添加到桥中,请确保首先将主网络接口的 IP 地址添加到桥上,设置好桥,并设置一个备用默认路由,**然后**再将接口添加到桥中。否则,服务器将失去网络连接,您将无法通过 SSH 重新连接到它。

使用 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 的使用已弃用,并被视为过时。有关详细信息,请参阅 brctl(8) § NOTES 中的“Notes”部分。

创建一个新的桥

# brctl addbr bridge_name

将设备添加到桥中,例如 eth1

注意 将接口添加到桥中将导致接口丢失其现有的 IP 地址。如果您通过您打算添加到桥的接口远程连接,您将失去连接。可以通过在系统启动时脚本化桥的创建来解决此问题。
# 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
注意 要启用 bridge-netfilter 功能,您需要手动加载 br_netfilter 模块
# modprobe br_netfilter

您也可以 在启动时加载模块

添加主网络接口

首先,记下当前的网络状态

$ 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 地址。

KDEplasma-nm 可以创建桥。为了查看、创建和修改桥接口,请通过右键单击系统托盘中的网络小程序并选择“配置网络连接...”或通过“系统设置 > 连接”打开“连接”窗口。点击模块左下角的“配置”按钮并启用“显示虚拟连接”。需要重新启动会话才能使用已启用该功能。

nm-connection-editor 可以像 GNOME 的网络设置一样创建桥。 此页面显示了这些步骤以及截图。

来自 networkmanagernmcli 可以创建桥。例如,要创建一个 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 地址

本文章或章节需要扩充。

原因:本节需要与 QEMU#QEMU 的 Tap 网络中描述的链路层部分连接。目前,请参阅那里提供的说明。(在 Talk:Network bridge 中讨论)

当桥完全设置好后,它可以分配一个 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 地址。

故障排除

桥配置后无网络连接

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因:此问题在 #使用 bridge-utils 中已作为注意事项指出。应在所有其他章节中明确这一点,并在 #分配 IP 地址 中添加运行 DHCP 客户端的说明。(在 Talk:Network bridge 中讨论)

删除已添加到桥的接口(例如 eth1)上的所有 IP 地址和路由,并改为将这些参数配置给桥可能有助于解决此问题。

首先,确保没有为 eth1 运行 dhcpcd 实例,否则已删除的地址可能会被重新分配。

eth1 接口删除地址和路由

# ip addr del address dev eth1
# ip route del address dev eth1

现在必须设置先前配置的桥的 IP 地址和路由。这通常通过为此接口启动 DHCP 客户端来完成。否则,请参阅 网络配置以获取手动配置。

桥配置后托管服务器无网络连接

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因:“托管服务器”不是一个普遍易懂的术语。(在 Talk:Network bridge 中讨论)

由于桥的 MAC 地址不一定等于服务器通常使用的网卡的 MAC 地址,服务器提供商可能会丢弃来自桥的传出流量,从而导致桥接服务器以太网接口时连接丢失。因此,对于托管服务器,可能需要配置桥来克隆以太网接口的 MAC 地址。

连接到常规连接后无法连接到桥连接

在 Network Manager 小程序中,如果您有常规以太网/无线连接(非桥接从属连接),并且您首先连接到它,然后尝试连接到桥接连接(无论是否先断开与常规连接的连接),那么您将无法连接到它。出于某种原因,桥接从属连接(它未在网络小程序中列出)未激活,即使自动连接复选框已启用。

解决方法是通过终端手动激活它

nmcli connection up br1\ slave\ 1

然后您的桥连接就可以立即工作了。

本文章或章节需要扩充。

原因:是否有关于此的 bug 报告?(在 Talk:Network bridge 中讨论)

桥在网络的一侧似乎无法正常工作

请参阅 QEMU#内部网络

参见