以太网桥接¶
简介¶
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 属性的定义。
桥接 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 离开消息的端口上转发多播流量。仅在桥接上启用 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 和热点 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 条目替换为普通条目,从而允许白名单 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
FDB 下一跳对象 ID,用于附加到重定向到启用了 VLAN 隧道映射的备份端口(通过 IFLA_BRPORT_VLAN_TUNNEL 选项)的数据包。将值设置为 0(默认)的效果是不附加任何 ID。
桥接 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 的工作方式以及根桥的选择方式
桥接优先级:运行生成树协议的每个桥接都具有可配置的桥接优先级值。值越低,优先级越高。默认情况下,桥接优先级设置为标准值(例如,32768)。
桥接 ID:桥接 ID 由两个组件组成:桥接优先级和桥接的 MAC 地址。它唯一地标识网络中的每个桥接。桥接 ID 用于比较不同桥接的优先级。
桥接选举:当网络启动时,所有桥接最初都假定它们是根桥。它们开始向其邻居广播桥协议数据单元 (BPDU),其中包含其桥接 ID 和其他信息。
BPDU 比较:桥接交换 BPDU 以确定根桥。每个桥接检查收到的 BPDU,包括桥接优先级和桥接 ID,以确定是否应调整自己的优先级。桥接 ID 最低的桥接将成为根桥。
根桥公告:一旦确定了根桥,它就会将有关根桥的信息的 BPDU 发送到网络中的所有其他桥接。其他桥接使用此信息来计算到根桥的最短路径,从而创建无环路拓扑。
转发端口:选择根桥并建立生成树拓扑后,每个桥接都确定其哪些端口应处于转发状态(用于数据流量),哪些端口应处于阻塞状态(用于防止环路)。根桥的端口都处于转发状态。而其他桥接的一些端口处于阻塞状态以避免环路。
根端口:选择根桥并建立生成树拓扑后,每个非根桥都会处理传入 BPDU,并根据收到的 BPDU 中的信息确定其哪个端口提供到根桥的最短路径。此端口被指定为根端口。并且它处于转发状态,允许它主动转发网络流量。
指定端口:指定端口是非根桥将通过其转发流量到指定网段的端口。指定端口放置在转发状态。非根桥上未指定用于特定网段的所有其他端口都放置在阻塞状态以防止网络环路。
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.org 和 bridge@lists.linux.dev 上讨论。
该列表对任何感兴趣的人开放:http://vger.kernel.org/vger-lists.html#netdev
外部链接¶
Linux 桥接的旧文档位于:https://wiki.linuxfoundation.org/networking/bridge