以太网桥接¶
简介¶
IEEE 802.1Q-2022(桥接和桥接网络)标准定义了计算机网络中桥接器的操作。在此标准上下文中,桥接器是一种连接两个或多个网段的设备,并在 OSI(开放系统互连)模型的 数据链路层(第 2 层)上运行。桥接器的目的是根据目标 MAC(媒体访问控制)地址在不同网段之间过滤和转发帧。
桥接 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 条目之间共享。应根据设置的条目标志解释联合条目。
桥接 uAPI¶
现代 Linux 桥接 uAPI 通过 Netlink 接口访问。您可以在以下文件中找到定义桥接和桥接端口 Netlink 属性的文件。
桥接 Netlink 属性¶
请注意,以下部分中的计时器值应采用 clock_t 格式,即秒数乘以 USER_HZ(通常定义为 100)。
- IFLA_BR_FORWARD_DELAY
桥接转发延迟是在 LISTENING 状态(在移动到 LEARNING 之前)和 LEARNING 状态(在移动到 FORWARDING 之前)花费的时间。仅在启用 STP 时相关。
有效值介于 (2 * USER_HZ) 和 (30 * USER_HZ) 之间。默认值为 (15 * USER_HZ)。
- IFLA_BR_HELLO_TIME
当桥接器是根桥接器或指定桥接器时,桥接器发送 hello 数据包之间的时间。仅在启用 STP 时相关。
有效值介于 (1 * USER_HZ) 和 (10 * USER_HZ) 之间。默认值为 (2 * USER_HZ)。
- IFLA_BR_MAX_AGE
hello 数据包超时是指在接收到上一个 hello 消息后,假设生成树中的另一个桥接器已死亡的时间。仅在启用 STP 时相关。
有效值介于 (6 * USER_HZ) 和 (40 * USER_HZ) 之间。默认值为 (20 * USER_HZ)。
- IFLA_BR_AGEING_TIME
配置桥接器的 FDB 条目的老化时间。它是从该地址接收到数据包后,MAC 地址在 FDB 中保留的时间。在此时间过去后,会清除条目。允许超出 802.1 标准规范的值,用于特殊情况
0 - 条目永不老化(全部永久)
1 - 条目消失(没有持久性)
默认值为 (300 * USER_HZ)。
- IFLA_BR_STP_STATE
为此桥接器打开 (IFLA_BR_STP_STATE > 0) 或关闭 (IFLA_BR_STP_STATE == 0) 生成树协议。
默认值为 0(禁用)。
- IFLA_BR_PRIORITY
设置此桥接器的生成树优先级,用于 STP 根桥接器选举期间。
有效值介于 0 和 65535 之间。
- IFLA_BR_VLAN_FILTERING
打开 (IFLA_BR_VLAN_FILTERING > 0) 或关闭 (IFLA_BR_VLAN_FILTERING == 0) VLAN 过滤。禁用后,桥接器在处理数据包时不会考虑 VLAN 标记。
默认值为 0(禁用)。
- IFLA_BR_VLAN_PROTOCOL
设置用于 VLAN 过滤的协议。
有效值为 0x8100(802.1Q) 或 0x88A8(802.1AD)。默认值为 0x8100(802.1Q)。
- IFLA_BR_GROUP_FWD_MASK
组转发掩码。这是一个位掩码,用于决定是否转发发往链路本地地址(格式为 01:80:C2:00:00:0X)的传入帧。
默认值为 0,表示桥接器不转发此端口上的任何链路本地帧。
- IFLA_BR_ROOT_ID
桥接根 ID,只读。
- IFLA_BR_BRIDGE_ID
桥接 ID,只读。
- IFLA_BR_ROOT_PORT
桥接根端口,只读。
- IFLA_BR_ROOT_PATH_COST
桥接根路径成本,只读。
- IFLA_BR_TOPOLOGY_CHANGE
桥接拓扑更改,只读。
- IFLA_BR_TOPOLOGY_CHANGE_DETECTED
桥接拓扑更改已检测到,只读。
- IFLA_BR_HELLO_TIMER
桥接 hello 计时器,只读。
- IFLA_BR_TCN_TIMER
桥接 TCN 计时器,只读。
- IFLA_BR_TOPOLOGY_CHANGE_TIMER
桥接拓扑更改计时器,只读。
- IFLA_BR_GC_TIMER
桥接 GC 计时器,只读。
- IFLA_BR_GROUP_ADDR
设置此桥接器用于 STP 的多播组的 MAC 地址。该地址必须是标准以太网 MAC 地址格式的链路本地地址。它是格式为 01:80:C2:00:00:0X 的地址,其中 X 在 [0, 4..f] 中。
默认值为 0。
- IFLA_BR_FDB_FLUSH
刷新桥接器的 FDB 动态条目。
- IFLA_BR_MCAST_ROUTER
如果启用了 IGMP 侦听,则设置桥接器的多播路由器。有效值为
0 - 禁用。
1 - 自动(查询)。
2 - 永久启用。
默认值为 1。
- IFLA_BR_MCAST_SNOOPING
打开 (IFLA_BR_MCAST_SNOOPING > 0) 或关闭 (IFLA_BR_MCAST_SNOOPING == 0) 多播侦听。
默认值为 1。
- IFLA_BR_MCAST_QUERY_USE_IFADDR
如果启用,则使用桥接器自己的 IP 地址作为 IGMP 查询的源地址 (IFLA_BR_MCAST_QUERY_USE_IFADDR > 0),否则使用默认值 0.0.0.0 (IFLA_BR_MCAST_QUERY_USE_IFADDR == 0)。
默认值为 0(禁用)。
- IFLA_BR_MCAST_QUERIER
启用 (IFLA_BR_MULTICAST_QUERIER > 0) 或禁用 (IFLA_BR_MULTICAST_QUERIER == 0) IGMP 查询器,即桥接器发送多播查询。
默认值为 0(禁用)。
- IFLA_BR_MCAST_HASH_ELASTICITY
设置多播数据库哈希弹性,它是多播哈希表中的最大链长。此属性已弃用,该值始终为 16。
- IFLA_BR_MCAST_HASH_MAX
设置多播哈希表的最大大小
默认值为 4096,该值必须为 2 的幂。
- IFLA_BR_MCAST_LAST_MEMBER_CNT
上次成员查询计数是指路由器在假设没有本地成员之前发送的特定于组的查询的数量。上次成员查询计数也是指路由器在假设没有特定来源的侦听器之前发送的特定于组和来源的查询的数量。
默认值为 2。
- IFLA_BR_MCAST_STARTUP_QUERY_CNT
启动查询计数是指在启动时发送的查询数量,这些查询之间以启动查询间隔分隔。
默认值为 2。
- IFLA_BR_MCAST_LAST_MEMBER_INTVL
上次成员查询间隔是指插入到响应离开组消息而发送的特定于组的查询中的最大响应时间,并且也是特定于组的查询消息之间的时间量。
默认值为 (1 * USER_HZ)。
- IFLA_BR_MCAST_MEMBERSHIP_INTVL
如果未收到此组的成员资格报告,则桥接器将离开该组的间隔。
默认值为 (260 * USER_HZ)。
- IFLA_BR_MCAST_QUERIER_INTVL
其他路由器发送查询之间的间隔。如果在此延迟过去后未看到任何查询,则桥接器将开始发送自己的查询(就像启用了 IFLA_BR_MCAST_QUERIER_INTVL 一样)。
默认值为 (255 * USER_HZ)。
- IFLA_BR_MCAST_QUERY_INTVL
查询间隔是查询器发送的常规查询之间的间隔。
默认值为 (125 * USER_HZ)。最小值是 (1 * USER_HZ)。
- IFLA_BR_MCAST_QUERY_RESPONSE_INTVL
用于计算插入到周期性常规查询中的最大响应代码的最大响应时间。
默认值为 (10 * USER_HZ)。
- IFLA_BR_MCAST_STARTUP_QUERY_INTVL
启动阶段的查询之间的间隔。
默认值为 (125 * USER_HZ) / 4。最小值是 (1 * USER_HZ)。
- IFLA_BR_NF_CALL_IPTABLES
启用 (NF_CALL_IPTABLES > 0) 或禁用 (NF_CALL_IPTABLES == 0) 桥接器上的 iptables 挂钩。
默认值为 0(禁用)。
- IFLA_BR_NF_CALL_IP6TABLES
启用 (NF_CALL_IP6TABLES > 0) 或禁用 (NF_CALL_IP6TABLES == 0) 桥接器上的 ip6tables 挂钩。
默认值为 0(禁用)。
- IFLA_BR_NF_CALL_ARPTABLES
启用 (NF_CALL_ARPTABLES > 0) 或禁用 (NF_CALL_ARPTABLES == 0) 桥接器上的 arptables 挂钩。
默认值为 0(禁用)。
- IFLA_BR_VLAN_DEFAULT_PVID
应用于未标记和优先级标记的传入数据包的 VLAN ID。
默认值为 1。设置为特殊值 0 会使此桥接器的所有端口默认情况下没有 PVID,这意味着它们将不接受 VLAN 未标记流量。
- IFLA_BR_PAD
用于 Netlink 消息的桥接属性填充类型。
- IFLA_BR_VLAN_STATS_ENABLED
启用 (IFLA_BR_VLAN_STATS_ENABLED == 1) 或禁用 (IFLA_BR_VLAN_STATS_ENABLED == 0) 每个 VLAN 的统计信息计数。
默认值为 0(禁用)。
- IFLA_BR_MCAST_STATS_ENABLED
启用 (IFLA_BR_MCAST_STATS_ENABLED > 0) 或禁用 (IFLA_BR_MCAST_STATS_ENABLED == 0) 多播 (IGMP/MLD) 统计信息计数。
默认值为 0(禁用)。
- IFLA_BR_MCAST_IGMP_VERSION
设置 IGMP 版本。
有效值为 2 和 3。默认值为 2。
- IFLA_BR_MCAST_MLD_VERSION
设置 MLD 版本。
有效值为 1 和 2。默认值为 1。
- IFLA_BR_VLAN_STATS_PER_PORT
启用 (IFLA_BR_VLAN_STATS_PER_PORT == 1) 或禁用 (IFLA_BR_VLAN_STATS_PER_PORT == 0) 每个 VLAN 每个端口的统计信息计数。仅在未配置端口 VLAN 时才能更改。
默认值为 0(禁用)。
- IFLA_BR_MULTI_BOOLOPT
multi_boolopt 用于控制新的布尔选项,以避免添加新的 Netlink 属性。您可以查看
enum br_boolopt_id
了解这些选项。- IFLA_BR_MCAST_QUERIER_STATE
桥接 mcast 查询器状态,只读。
- IFLA_BR_FDB_N_LEARNED
当前网桥动态学习的 FDB 条目数量,只读。
- IFLA_BR_FDB_MAX_LEARNED
设置当前网桥动态学习的最大 FDB 条目数量。
网桥端口 Netlink 属性¶
- IFLA_BRPORT_STATE
端口的操作状态。以下是有效值。
0 - 端口处于 STP DISABLED 状态。使此端口完全不参与 STP。这也称为 BPDU 过滤器,可用于禁用不受信任端口(如叶虚拟设备)上的 STP。此端口上的流量转发也会停止。
1 - 端口处于 STP LISTENING 状态。仅当在网桥上启用 STP 时有效。在此状态下,端口会监听 STP BPDU,并丢弃所有其他流量帧。
2 - 端口处于 STP LEARNING 状态。仅当在网桥上启用 STP 时有效。在此状态下,端口仅接受用于更新 MAC 地址表的流量。
3 - 端口处于 STP FORWARDING 状态。端口完全激活。
4 - 端口处于 STP BLOCKING 状态。仅当在网桥上启用 STP 时有效。此状态在 STP 选举过程中使用。在此状态下,端口仅处理 STP BPDU。
- IFLA_BRPORT_PRIORITY
STP 端口优先级。有效值介于 0 和 255 之间。
- IFLA_BRPORT_COST
端口的 STP 路径成本。有效值介于 1 和 65535 之间。
- IFLA_BRPORT_MODE
设置网桥端口模式。有关更多详细信息,请参阅 BRIDGE_MODE_HAIRPIN。
- IFLA_BRPORT_GUARD
控制网桥端口是否处理 STP BPDU。默认情况下,此标志处于关闭状态,以允许 BPDU 处理。启用此标志后,如果收到 STP BPDU 数据包,则会禁用网桥端口。
如果网桥启用了生成树,则网络上的恶意设备可能会在端口上发送 BPDU 并导致网络故障。启用guard on将通过禁用端口来检测并阻止这种情况。如果链路断开,或移除并重新连接,则端口将重新启动。
- IFLA_BRPORT_PROTECT
控制是否允许给定端口成为根端口。仅当在网桥上启用 STP 时使用。默认情况下,此标志处于关闭状态。
此功能也称为根端口保护。如果从叶(边缘)端口接收到 BPDU,则不应将其选为根端口。如果在网桥上使用 STP,并且下游网桥并非完全可信,则可以使用此功能;这可以防止恶意访客重新路由流量。
- IFLA_BRPORT_FAST_LEAVE
此标志允许网桥立即停止在接收到 IGMP Leave 消息的端口上转发组播流量。仅当在网桥上启用 IGMP 侦听时使用。默认情况下,此标志处于关闭状态。
- IFLA_BRPORT_LEARNING
控制给定端口是否从接收到的流量中学习源 MAC 地址。还控制动态 FDB 条目(也可以由软件添加)是否会通过传入的流量刷新。默认情况下,此标志处于开启状态。
- IFLA_BRPORT_UNICAST_FLOOD
控制对于没有 FDB 条目的单播流量是否会泛洪到此端口。默认情况下,此标志处于开启状态。
- IFLA_BRPORT_PROXYARP
在此端口上启用代理 ARP。
- IFLA_BRPORT_LEARNING_SYNC
控制给定端口是否将设备端口上学习的 MAC 地址同步到网桥 FDB。
- IFLA_BRPORT_PROXYARP_WIFI
在此端口上启用代理 ARP,该代理 ARP 符合 IEEE 802.11 和 Hotspot 2.0 规范的扩展要求。
IFLA_BRPORT_ROOT_ID
IFLA_BRPORT_BRIDGE_ID
IFLA_BRPORT_DESIGNATED_PORT
IFLA_BRPORT_DESIGNATED_COST
IFLA_BRPORT_ID
IFLA_BRPORT_NO
IFLA_BRPORT_TOPOLOGY_CHANGE_ACK
IFLA_BRPORT_CONFIG_PENDING
IFLA_BRPORT_MESSAGE_AGE_TIMER
IFLA_BRPORT_FORWARD_DELAY_TIMER
IFLA_BRPORT_HOLD_TIMER
- IFLA_BRPORT_FLUSH
刷新网桥端口的 FDB 动态条目。
- IFLA_BRPORT_MULTICAST_ROUTER
配置端口的组播路由器存在。具有组播路由器的端口将接收所有组播流量。有效值为
0 在此端口上禁用组播路由器
1 让系统检测路由器的存在(默认)
2 在此端口上永久启用组播流量转发
- 3 在此端口上临时启用组播路由器,不依赖于
传入的查询。
IFLA_BRPORT_PAD
- IFLA_BRPORT_MCAST_FLOOD
控制给定端口是否会泛洪没有 MDB 条目的组播流量。默认情况下,此标志处于开启状态。
- IFLA_BRPORT_MCAST_TO_UCAST
控制给定端口是否会使用单播而不是组播来复制数据包。默认情况下,此标志处于关闭状态。
这是通过复制每个主机的数据包并将组播目标 MAC 相应地更改为单播 MAC 来完成的。
mcast_to_unicast 在网桥的组播侦听功能之上工作。这意味着单播副本仅传递给对单播感兴趣并通过 IGMP/MLD 报告事先发出信号的主机。
此功能适用于具有比广播更可靠和/或更有效的单播数据包传递方式的接口类型(例如,WiFi)。
但是,它仅应在不进行 IGMPv2/MLDv1 报告抑制的接口上启用。IGMP/MLD 报告抑制问题通常通过网络守护进程(请求者)启用 AP 隔离并通过分离所有 STA 来克服。
通过启用和利用网桥发夹模式,可以再次实现 STA 到 STA IP 组播的传递,该模式也将传入端口视为潜在的传出端口(请参阅 BRIDGE_MODE_HAIRPIN 选项)。发夹模式在组播侦听之后执行,因此只会将报告传递给运行组播路由器的 STA。
- IFLA_BRPORT_VLAN_TUNNEL
控制是否在端口上启用 VLAN 到隧道映射。默认情况下,此标志处于关闭状态。
- IFLA_BRPORT_BCAST_FLOOD
控制给定端口上广播流量的泛洪。默认情况下,此标志处于开启状态。
- IFLA_BRPORT_GROUP_FWD_MASK
设置组转发掩码。这是一个位掩码,用于决定是否转发目标为链路本地地址的传入帧。地址的形式为 01:80:C2:00:00:0X(默认为 0,这意味着网桥不转发此端口上的任何链路本地帧)。
- IFLA_BRPORT_NEIGH_SUPPRESS
控制是否在端口上启用邻居发现(arp 和 nd)代理和抑制。默认情况下,此标志处于关闭状态。
- IFLA_BRPORT_ISOLATED
控制给定端口是否将被隔离,这意味着它只能与非隔离端口通信。默认情况下,此标志处于关闭状态。
- IFLA_BRPORT_BACKUP_PORT
设置备份端口。如果端口失去载波,所有流量将被重定向到配置的备份端口。将该值设置为 0 可禁用此功能。
IFLA_BRPORT_MRP_RING_OPEN
IFLA_BRPORT_MRP_IN_OPEN
- IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT
每个端口的 EHT 主机限制数。默认值为 512。不允许设置为 0。
- IFLA_BRPORT_MCAST_EHT_HOSTS_CNT
当前跟踪的主机数,只读。
- IFLA_BRPORT_LOCKED
控制是否会锁定端口,这意味着除非 FDB 中存在具有该单元 MAC 地址的 FDB 条目,否则端口后面的主机将无法通过该端口通信。常见的用例是允许主机通过 IEEE 802.1X 协议进行身份验证或基于白名单进行访问。默认情况下,此标志处于关闭状态。
请注意,安全的 802.1X 部署应始终使用 BR_BOOLOPT_NO_LL_LEARN 标志,以不允许网桥基于端口上接收到的链路本地 (EAPOL) 流量来填充其 FDB。
- IFLA_BRPORT_MAB
控制端口是否将使用 MAC 身份验证绕过 (MAB),这是一种允许在锁定端口上选择 MAC 地址的技术,而无需使用 802.1X 身份验证。具有未知源 MAC 地址的数据包会在传入网桥端口上生成“锁定”FDB 条目。常见的用例是用户空间对这些网桥 FDB 通知做出反应,并选择性地将锁定的 FDB 条目替换为正常的 FDB 条目,从而允许白名单上的 MAC 地址通过流量。
设置此标志还需要 IFLA_BRPORT_LOCKED 和 IFLA_BRPORT_LEARNING。IFLA_BRPORT_LOCKED 可确保丢弃未经授权的数据包,而 IFLA_BRPORT_LEARNING 允许用户空间安装的动态 FDB 条目(作为锁定 FDB 条目的替换)刷新和/或老化。
IFLA_BRPORT_MCAST_N_GROUPS
- IFLA_BRPORT_MCAST_MAX_GROUPS
设置可以为给定端口注册的最大 MDB 条目数。如果尝试在端口注册的 MDB 条目数超过此限制,则将被拒绝,无论它们是通过 netlink(例如,桥接工具)还是 IGMP 或 MLD 成员资格报告完成的。将限制设置为 0 将禁用限制。默认值为 0。
- IFLA_BRPORT_NEIGH_VLAN_SUPPRESS
控制是否为给定端口启用邻居发现(arp 和 nd)代理和抑制。默认情况下,此标志处于关闭状态。
请注意,仅当为给定端口启用 IFLA_BRPORT_NEIGH_SUPPRESS 时,此选项才生效。
- IFLA_BRPORT_BACKUP_NHID
要附加到被重定向到启用了 VLAN 隧道映射的备份端口的数据包的 FDB 下一跳对象 ID(通过 IFLA_BRPORT_VLAN_TUNNEL 选项)。将值设置为 0(默认值)的效果是不附加任何 ID。
网桥 sysfs¶
sysfs 接口已弃用,如果添加新选项,则不应扩展。
STP¶
Linux 网桥驱动程序中的 STP(生成树协议)实现是一项关键功能,可通过识别和禁用冗余链路来帮助防止以太网中的环路和广播风暴。在 Linux 网桥环境中,STP 对于网络稳定性和可用性至关重要。
STP 是在 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 的工作方式和根网桥的选取方式
网桥优先级:每个运行生成树协议的网桥都有一个可配置的“网桥优先级”值。值越低,优先级越高。默认情况下,“网桥优先级”设置为标准值(例如,32768)。
网桥 ID:“网桥 ID”由两个组件组成:“网桥优先级”和网桥的 MAC 地址。它可以唯一标识网络中的每个网桥。“网桥 ID”用于比较不同网桥的优先级。
网桥选举:当网络启动时,所有网桥最初都假设自己是根网桥。它们开始向邻居广播“网桥协议数据单元 (BPDU)”,其中包含其“网桥 ID”和其他信息。
BPDU 比较:网桥交换 BPDU 以确定根网桥。每个网桥检查收到的 BPDU,包括网桥优先级和网桥 ID,以确定是否应调整自身的优先级。网桥 ID 最低的网桥将成为根网桥。
根网桥通告:一旦确定根网桥,它会将包含根网桥信息的 BPDU 发送到网络中的所有其他网桥。其他网桥使用此信息计算到根网桥的最短路径,从而创建无环拓扑。
转发端口:选择根网桥并建立生成树拓扑后,每个网桥确定其哪些端口应处于转发状态(用于数据流量),哪些端口应处于阻塞状态(用于防止环路)。根网桥的所有端口都处于转发状态。而其他网桥的一些端口则处于阻塞状态,以避免环路。
根端口:选择根网桥并建立生成树拓扑后,每个非根网桥都会处理传入的 BPDU,并根据收到的 BPDU 中的信息确定其哪个端口提供了到根网桥的最短路径。此端口被指定为根端口。它处于转发状态,允许其主动转发网络流量。
指定端口:指定端口是指非根网桥将流量转发到指定网段所通过的端口。指定端口处于转发状态。非根网桥上未指定用于特定网段的所有其他端口都处于阻塞状态,以防止网络环路。
STP 通过计算最短路径并禁用冗余链路来确保网络收敛。当发生网络拓扑更改时(例如,链路故障),STP 会重新计算网络拓扑以恢复连接,同时避免环路。
正确配置 STP 参数(如网桥优先级)会影响网络性能、路径选择以及哪个网桥成为根网桥。
用户空间 STP 助手¶
用户空间 STP 助手 bridge-stp 是一个程序,用于控制是否使用用户模式生成树。当在网桥上启用/禁用 STP 时(通过 brctl stp <bridge> <on|off>
或 ip link set <bridge> type bridge stp_state <0|1>
),内核会调用 /sbin/bridge-stp <bridge> <start|stop>
。如果该命令返回 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 网桥支持 IEEE 802.1Q 和 802.1AD 协议进行 VLAN 标记。
网桥上的 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 网桥 Switchdev 是 Linux 内核中的一项功能,它扩展了传统 Linux 网桥的功能,使其能够更有效地与支持 switchdev 的硬件交换机配合使用。通过 Linux 网桥 Switchdev,可以将某些网络功能(如以太网帧的转发、过滤和学习)卸载到硬件交换机。此卸载减轻了 Linux 内核和 CPU 的负担,从而提高了网络性能并降低了延迟。
要使用 Linux 网桥 Switchdev,您需要支持 switchdev 接口的硬件交换机。这意味着交换机硬件需要具有必要的驱动程序和功能才能与 Linux 内核协同工作。
有关更多详细信息,请参阅 以太网交换机设备驱动程序模型 (switchdev) 文档。
Netfilter¶
网桥 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.org 和 bridge@lists.linux.dev 中进行。
该列表对任何有兴趣的人开放:http://vger.kernel.org/vger-lists.html#netdev
外部链接¶
Linux 桥接的旧文档位于:https://wiki.linuxfoundation.org/networking/bridge