乙太網橋接¶
簡介¶
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;
};
成員
vnoderhashtable 成員
tnoderhashtable 成員
vidVLAN ID
flags橋接 VLAN 標誌
priv_flags私有(核心)橋接 VLAN 標誌
stateSTP 狀態(例如,阻塞、學習、轉發)
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 例項
vlistVLAN 條目的排序列表
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