乙太網橋接

簡介

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