以太网桥接

简介

IEEE 802.1Q-2022(桥接和桥接网络)标准定义了计算机网络中桥接的操作。在此标准中,桥接是一种连接两个或多个网段并在 OSI(开放系统互连)模型的数据链路层(第 2 层)运行的设备。桥接的目的是根据目标 MAC(媒体访问控制)地址在不同网段之间过滤和转发帧。

Bridge kAPI

以下是桥接代码的一些核心结构。请注意,kAPI 是不稳定的,并且可能随时更改。

struct net_bridge_vlan

每个 VLAN 条目

定义:

struct net_bridge_vlan {
    struct rhash_head               vnode;
    struct rhash_head               tnode;
    u16 vid;
    u16 flags;
    u16 priv_flags;
    u8 state;
    struct pcpu_sw_netstats __percpu *stats;
    union {
        struct net_bridge       *br;
        struct net_bridge_port  *port;
    };
    union {
        refcount_t refcnt;
        struct net_bridge_vlan  *brvlan;
    };
    struct br_tunnel_info           tinfo;
    union {
        struct net_bridge_mcast         br_mcast_ctx;
        struct net_bridge_mcast_port    port_mcast_ctx;
    };
    u16 msti;
    struct list_head                vlist;
    struct rcu_head                 rcu;
};

成员

vnode

rhashtable 成员

tnode

rhashtable 成员

vid

VLAN ID

flags

桥接 VLAN 标志

priv_flags

私有(内核)桥接 VLAN 标志

state

STP 状态(例如,阻塞、学习、转发)

stats

每个 CPU 的 VLAN 统计信息

{unnamed_union}

匿名

br

如果设置了 MASTER 标志,则指向桥接结构

port

如果未设置 MASTER 标志,则指向端口结构

{unnamed_union}

匿名

refcnt

如果设置了 MASTER 标志,则每个引用它的端口都会增加

brvlan

如果未设置 MASTER 标志,则指向此 VLAN 条目的全局每个 VLAN 上下文

tinfo

桥接隧道信息

{unnamed_union}

匿名

br_mcast_ctx

如果设置了 MASTER 标志,则是全局 VLAN 多播上下文

port_mcast_ctx

如果未设置 MASTER 标志,则是每个端口/VLAN 多播上下文

msti

如果设置了 MASTER 标志,则保存 VLAN 的 MST 实例

vlist

VLAN 条目的排序列表

rcu

用于条目销毁

描述

此结构在桥接 rhashtable 中包含的全局每个 VLAN 条目和端口 rhashtable 中包含的本地每个端口每个 VLAN 条目之间共享。应根据设置的条目标志解释联合条目。

Bridge uAPI

现代 Linux 桥接 uAPI 通过 Netlink 接口访问。您可以在下面的文件中找到桥接和桥接端口 Netlink 属性的定义。

桥接 sysfs

sysfs 接口已弃用,如果在添加新选项时不应扩展。

STP

Linux 桥接驱动程序中的 STP(生成树协议)实现是一项关键功能,它通过识别和禁用冗余链路来帮助防止以太网网络中的环路和广播风暴。在 Linux 桥接上下文中,STP 对于网络稳定性和可用性至关重要。

STP 是一种第 2 层协议,在 OSI 模型的数据链路层运行。它最初开发为 IEEE 802.1D,并且已经演变为多个版本,包括快速生成树协议 (RSTP) 和 多生成树协议 (MSTP)

802.1D-2004 删除了原始生成树协议,而是合并了快速生成树协议 (RSTP)。到 2014 年,IEEE 802.1D 定义的所有功能都已合并到 IEEE 802.1Q(桥接和桥接网络)或 IEEE 802.1AC(MAC 服务定义)中。802.1D 已于 2022 年正式撤回。

桥接端口和 STP 状态

在 STP 的上下文中,桥接端口可以处于以下状态之一
  • 阻塞:端口已禁用数据流量,并且仅侦听来自其他设备的 BPDU(桥协议数据单元)以确定网络拓扑。

  • 侦听:端口开始参与 STP 过程并侦听 BPDU。

  • 学习:端口继续侦听 BPDU 并开始从传入帧中学习 MAC 地址,但不转发数据帧。

  • 转发:端口完全运行并转发 BPDU 和数据帧。

  • 已禁用:端口已在管理上禁用,并且不参与 STP 过程。数据帧转发也被禁用。

根桥和收敛

在 Linux 中的网络和以太网桥接的上下文中,根桥是桥接网络中的指定交换机,它用作生成树算法创建无环路拓扑的参考点。

以下是 STP 的工作方式以及根桥的选择方式
  1. 桥接优先级:运行生成树协议的每个桥接都具有可配置的桥接优先级值。值越低,优先级越高。默认情况下,桥接优先级设置为标准值(例如,32768)。

  2. 桥接 ID:桥接 ID 由两个组件组成:桥接优先级和桥接的 MAC 地址。它唯一地标识网络中的每个桥接。桥接 ID 用于比较不同桥接的优先级。

  3. 桥接选举:当网络启动时,所有桥接最初都假定它们是根桥。它们开始向其邻居广播桥协议数据单元 (BPDU),其中包含其桥接 ID 和其他信息。

  4. BPDU 比较:桥接交换 BPDU 以确定根桥。每个桥接检查收到的 BPDU,包括桥接优先级和桥接 ID,以确定是否应调整自己的优先级。桥接 ID 最低的桥接将成为根桥。

  5. 根桥公告:一旦确定了根桥,它就会将有关根桥的信息的 BPDU 发送到网络中的所有其他桥接。其他桥接使用此信息来计算到根桥的最短路径,从而创建无环路拓扑。

  6. 转发端口:选择根桥并建立生成树拓扑后,每个桥接都确定其哪些端口应处于转发状态(用于数据流量),哪些端口应处于阻塞状态(用于防止环路)。根桥的端口都处于转发状态。而其他桥接的一些端口处于阻塞状态以避免环路。

  7. 根端口:选择根桥并建立生成树拓扑后,每个非根桥都会处理传入 BPDU,并根据收到的 BPDU 中的信息确定其哪个端口提供到根桥的最短路径。此端口被指定为根端口。并且它处于转发状态,允许它主动转发网络流量。

  8. 指定端口:指定端口是非根桥将通过其转发流量到指定网段的端口。指定端口放置在转发状态。非根桥上未指定用于特定网段的所有其他端口都放置在阻塞状态以防止网络环路。

STP 通过计算最短路径和禁用冗余链路来确保网络收敛。当发生网络拓扑更改(例如,链路故障)时,STP 会重新计算网络拓扑以恢复连接,同时避免环路。

正确配置 STP 参数(例如,桥接优先级)可能会影响网络性能、路径选择以及哪个桥接成为根桥。

用户空间 STP 助手

用户空间 STP 助手 bridge-stp 是一个程序,用于控制是否使用用户模式生成树。/sbin/bridge-stp <bridge> <start|stop> 由内核在桥接上启用/禁用 STP 时调用(通过 brctl stp <bridge> <on|off>ip link set <bridge> type bridge stp_state <0|1>)。如果该命令返回 0,则内核启用 user_stp 模式,如果该命令返回任何其他值,则启用 kernel_stp 模式。

VLAN

LAN(局域网)是一个覆盖小地理区域的网络,通常在单个建筑物或园区内。LAN 用于连接计算机、服务器、打印机以及本地区域内的其他联网设备。LAN 可以是有线的(使用以太网电缆)或无线的(使用 Wi-Fi)。

VLAN(虚拟局域网)是将物理网络逻辑分段为多个隔离广播域。VLAN 用于将单个物理 LAN 划分为多个虚拟 LAN,从而允许不同的设备组进行通信,就像它们位于单独的物理网络上一样。

通常有两种 VLAN 实现,IEEE 802.1Q 和 IEEE 802.1ad(也称为 QinQ)。IEEE 802.1Q 是以太网网络中 VLAN 标记的标准。它允许网络管理员在物理网络上创建逻辑 VLAN 并使用 VLAN 信息标记以太网帧,这称为VLAN 标记帧。IEEE 802.1ad,通常称为 QinQ 或双 VLAN,是 IEEE 802.1Q 标准的扩展。QinQ 允许在单个以太网帧内堆叠多个 VLAN 标记。Linux 桥接支持 VLAN 标记的 IEEE 802.1Q 和 802.1AD 协议。

桥接上的 VLAN 过滤默认处于禁用状态。在桥接上启用 VLAN 过滤后,它将开始根据数据包的目标 MAC 地址和 VLAN 标记(两者必须匹配)将帧转发到适当的目标。

多播

Linux 桥接驱动程序具有多播支持,允许它处理 Internet 组管理协议 (IGMP) 或多播侦听器发现 (MLD) 消息,并有效地转发多播数据包。桥接驱动程序支持 IGMPv2/IGMPv3 和 MLDv1/MLDv2。

多播侦听

多播侦听是一种网络技术,允许网络交换机智能地管理局域网 (LAN) 中的多播流量。

交换机维护多播组表,该表记录多播组地址与主机已加入这些组的端口之间的关联。组表根据收到的 IGMP/MLD 消息动态更新。通过侦听收集的多播组信息,交换机优化了多播流量的转发。它不会盲目地将多播流量广播到所有端口,而是仅将多播流量根据目标 MAC 地址发送到已订阅相应目标多播组的端口。

创建后,Linux 桥接设备默认启用多播侦听。它维护一个多播转发数据库 (MDB),该数据库跟踪端口和组关系。

IGMPv3/MLDv2 EHT 支持

Linux 桥接支持 IGMPv3/MLDv2 EHT(显式主机跟踪),由 474ddb37fa3a (“net: bridge: multicast: add EHT allow/block handling”) 添加

显式主机跟踪使设备能够跟踪已加入特定组或频道的每个单独主机。IGMP 中显式主机跟踪的主要好处是允许在主机离开多播组或频道时实现最小的离开延迟。

主机想要离开到设备停止流量转发之间的时间长度称为 IGMP 离开延迟。如果最后请求从设备接收流量的主机指示它不再想要接收流量,则配置了 IGMPv3 或 MLDv2 和显式跟踪的设备可以立即停止转发流量。因此,离开延迟仅受多路访问网络中的数据包传输延迟和设备中的处理时间的限制。

其他多播功能

Linux 桥接还支持 每个 VLAN 多播侦听,该功能默认处于禁用状态,但可以启用。以及 多播路由器发现,这有助于识别多播路由器的位置。

Switchdev

Linux Bridge Switchdev 是 Linux 内核中的一项功能,它扩展了传统 Linux 桥接的功能,使其可以更有效地与支持 switchdev 的硬件交换机配合使用。通过 Linux Bridge Switchdev,以太网帧的某些网络功能(如转发、过滤和学习)可以卸载到硬件交换机。此卸载减少了 Linux 内核和 CPU 的负担,从而提高了网络性能并降低了延迟。

要使用 Linux Bridge Switchdev,你需要支持 switchdev 接口的硬件交换机。这意味着交换机硬件需要有必要的驱动程序和功能才能与 Linux 内核协同工作。

请参阅以太网交换机设备驱动模型 (switchdev)文档以获取更多详细信息。

Netfilter

bridge netfilter 模块是一个遗留功能,允许使用 iptables 和 ip6tables 过滤桥接数据包。不鼓励使用它。用户应考虑使用 nftables 进行数据包过滤。

旧的 ebtables 工具与 nftables 相比功能更有限,但就像 nftables 一样,它也不需要此模块才能运行。

br_netfilter 模块拦截进入网桥的数据包,对 IPv4 和 IPv6 数据包执行最小的健全性检查,然后假装这些数据包正在被路由而不是桥接。然后 br_netfilter 从网桥层调用 ip 和 ipv6 netfilter 钩子,即 ip(6)tables 规则集也会看到这些数据包。

br_netfilter 也是 iptables *physdev* 匹配的原因:此匹配是可靠地区分 iptables 规则集中路由和桥接数据包的唯一方法。

请注意,ebtables 和 nftables 在没有 br_netfilter 模块的情况下也能正常工作。iptables/ip6tables/arptables 不适用于桥接流量,因为它们插入路由堆栈。ip/ip6/inet/arp 系列中的 nftables 规则也不会看到由网桥转发的流量,但这正是它应该工作的方式。

从历史上看,ebtables 的功能集非常有限(现在仍然如此),添加此模块是为了假装数据包被路由并从网桥调用 IPv4/IPv6 netfilter 钩子,以便用户可以访问功能更丰富的 iptables 匹配功能(包括 conntrack)。 nftables 没有此限制,几乎所有功能都可以工作,而不管协议系列如何。

因此,只有在用户出于某种原因需要使用 ip(6)tables 过滤由网桥转发的数据包或 NAT 桥接流量时才需要 br_netfilter。对于纯链路层过滤,不需要此模块。

其他功能

Linux 网桥还支持IEEE 802.11 代理 ARP媒体冗余协议 (MRP)媒体冗余协议 (MRP) LC 模式IEEE 802.1X 端口身份验证MAC 身份验证绕过 (MAB)

常见问题解答

网桥是做什么的?

网桥透明地转发多个网络接口之间的流量。用通俗的话来说,这意味着网桥连接两个或多个物理以太网,形成一个更大的(逻辑)以太网。

它是 L3 协议独立的吗?

是的。网桥可以看到所有帧,但它只使用 L2 标头/信息。因此,桥接功能是协议独立的,并且应该可以毫无问题地转发 IPX、NetBEUI、IP、IPv6 等。

联系方式

此代码目前由 Roopa Prabhu <roopa@nvidia.com> 和 Nikolay Aleksandrov <razor@blackwall.org> 维护。关于网桥的错误和增强功能将在 linux-netdev 邮件列表netdev@vger.kernel.orgbridge@lists.linux.dev 上讨论。

该列表对任何感兴趣的人开放:http://vger.kernel.org/vger-lists.html#netdev