跳转至内容

网络桥接

来自 ArchWiki

网络桥接是一种虚拟网络设备,用于在两个或多个网络段之间转发数据包。桥接的行为类似于虚拟网络交换机,并且透明工作。网络中的其他机器不需要知道它的存在。物理网络设备(例如 eth1)和虚拟网络设备(例如 tap0)都可以连接到它。

创建桥接

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

警告 如果您在远程服务器上创建桥接,并且计划将主网络接口添加到桥接中,请确保在将接口添加到桥接之前,先在桥接上添加主网络接口的 IP 地址,启动桥接,并设置一个备份默认路由。否则,服务器将失去网络连接,您将无法通过 SSH 重新登录。

使用 iproute2

本节描述如何使用 iproute2 软件包中的 ip 工具来管理网络桥接,该软件包是 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 状态,因此您可能还希望将其 down 掉

# ip link set eth1 down

要删除桥接,请执行以下命令

# ip link delete bridge_name type bridge

这将自动从桥接中删除所有接口。不过,从属接口仍将处于 up 状态,因此您可能在之后还需要将它们 down 掉。

添加主网络接口

如果您在远程服务器上操作,并计划将主网络接口(例如 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-utilsAUR 软件包中的旧版 brctl 工具来管理网络桥接。完整选项列表请参阅 brctl(8)

注意 brctl 的使用已被弃用并被认为已过时。详情请参阅 brctl(8) § NOTES 部分。

创建新桥接

# brctl addbr bridge_name

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

注意 将接口添加到桥接会导致该接口丢失其现有的 IP 地址。如果您是通过打算添加到桥接的接口进行远程连接的,您将丢失连接。这个问题可以通过编写脚本在系统启动时创建桥接来解决。
# brctl addif bridge_name eth1

显示当前桥接及其连接的接口

$ brctl show

启动桥接设备

# 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 的网络设置可以创建桥接,但目前不会自动连接到桥接或其从属/附加接口。打开网络设置,添加一个类型为“桥接”的新接口,添加一个新的桥接连接,并选择要附加到桥接的设备的 MAC 地址。

KDEplasma-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 地址

本文章或章节需要扩充。

原因: 本节需要与 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#使用无线网卡桥接

加速发往桥接设备本身的流量

在某些情况下,桥接不仅充当桥接盒,还与其他主机通信。到达桥接端口且目的地为桥接盒本身的数据包,默认将进入 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 地址,因此必须将该目的地址更改为桥接端口的地址。

故障排除

桥接配置后无法联网

本文或本节需要在语言、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#内部网络

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.