如何在 Linux 橋接器中取得 VLAN 介面?

如何在 Linux 橋接器中取得 VLAN 介面?

我正在嘗試 Linux 橋接器和 VLAN 過濾,但遇到了一些問題。

我擁有的是一個帶有主幹(標記幀)的虛擬機,該主幹到達 ens19。我想要做的是將這個端口連接到一個linux橋,並且在這個橋上有“虛擬”接口,這些接口被標記在我需要的vlan上,後面有一個完整的TCP/IP堆棧(主機的) 。

對於我的實驗,我將自己限制在 vlan 3 和 5,但我的想法是它應該很容易擴展。用途看起來不會很大,因為它可以被 ens19 的子介面取代。但後來出於興趣,我將把 ens19 連接埠與 gretap 介面連接起來,以便在隧道上循環多個 VLAN。

我已經用虛擬和分接介面進行了測試,但在我看來,考慮到這些介面的性質,它不起作用。我使用 br0.3 子介面進行測試,但在這裡我的客戶端收到 ARP 回复,但 PING 從未收到 ICMP 回复...

ip link add name br0 type bridge vlan_filtering 1
ip link set dev br0 up
ip link add link br0 name br0.3 type vlan id 3
ip link set dev ens19 master br0
ip link set ens19 up
ip link set dev br0 up
ip link set dev br0.3 up
ip addr add 10.3.0.106/22 dev br0.3

客戶端 PING > br0.3 啟動時不可能逾時

客戶端 ARP:好的

客戶端 ICMP:NOK

br0 轉儲

答案1

啞橋

在目前設定下,沒有流量通過:所有內容均由支援 VLAN 的網橋過濾,因為預設情況下它在所有連接埠及其網橋自身介面上使用 VLAN 1。當 VLAN ID 3 的訊框到達或發出時,由於它與過濾器不匹配,因此會被丟棄。

要使當前實驗正常工作,只需將橋設置為“啞”橋即可:

ip link set dev br0 type bridge vlan_filtering 0

現在標記的流量ens19將到達(標記)br0(如果未轉送到其他地方),將取消標記br0.3並到達路由堆疊(例如:作為 IPv4、ARP 或 IPv6 類型)。非標記流量(如果有)也將到達路由堆疊通過br0.任何其他帶有 VLAN 標記的流量都將被丟棄,因為沒有任何東西會聲明它:路由堆疊本身不理解 VLAN。

橋接器將轉送帶有 VLAN 標記的幀,而不考慮 VLAN ID 的含義,如果在多個 VLAN 上使用相同的 MAC 位址,這可能會導致問題。這可能會混淆網橋上轉送資料庫的處理,或導致其他裝置上出現重複或循環等。

因此,確實首選支援 VLAN 的網橋。


VLAN 感知網橋

如果網橋必須扮演中立角色,並且目標是輕鬆創建新的每 VLAN 連接埠甚至更多,改變連接埠上的 VLAN 無需刪除並重新建立介面(VLAN 子介面需要),那麼 VLAN 感知網橋確實很有用。在此配置中,雖然仍然可以在 之上使用 VLAN 子接口br0,但可以避免這種情況。人們可以使用韋斯每個此類 VLAN 成對:一個作為橋接端口,一個作為與路由堆疊通信的接口(這是韋斯根本不涉及網路名稱空間)。

br0本身不必用於路由,除非如果沒有其他實體介面(除了ens19)可用,則可以將其用作管理。下面的設定首先透過br0設定完全鎖定新增的任何連接埠(包括其本身)vlan_default_pvid 0(而不是為所有內容取得預設連接埠 VLAN ID 1)。這也允許立即將橋接連接埠設為 UP,而不會在配置過程中冒洩漏的風險,因為預設沒有任何內容可以通過。

在支援 VLAN 的網橋上設定 VLAN 使用bridge vlan使用較新的指令rtnetlink(7)核心API。過時的brctl命令無法執行此操作,因為較舊的內核 API( 或/sys) 不提供此功能。

OP的情況分為連續步驟:

  • 創建和主幹鏈接

    網橋應分配有自己的(且唯一的)MAC 位址,以免它預設繼承橋接連接埠上可用的最低 MAC 位址,可能會隨著時間的推移而改變:韋斯下面的方法可能會使網橋在新增 VLAN 時隨著時間的推移而變更 MAC 位址,這對於此方法來說不是真正的問題,但如果聯合使用,可能會影響 VLAN 子介面方法,或影響br0具有IP 時的使用位址本身。在最近基於 systemd 的系統上,這是已經完成了系統無論網路管理員涉及什麼,即使這種行為是不需要的,只要它檢測到創建了一個新的類似虛擬乙太網路的接口,而沒有說明其 MAC 位址。

    ip link add name br0 address 12:34:56:78:9a:bc up type bridge vlan_filtering 1 vlan_default_pvid 0
    ip link set dev ens19 up master br0
    
  • 選用:br0仍使用 VLAN 1(未標記)傳輸ens19(標記),例如用於管理:

    bridge vlan add vid 1 dev ens19
    bridge vlan del vid 1 dev br0 self pvid untagged
    

    橋接介面本身self在配置時需要附加關鍵字。

  • 新增 VLAN ens19(此處的 VLAN ID 3 和 5):

    bridge vlan add vid 3 dev ens19
    bridge vlan add vid 5 dev ens19
    

    或如果要考慮ens19上行鏈路中繼端口,只需在其上添加所有其他 VLAN:

    bridge vlan add vid 2-4094 dev ens19
    

    用於-compressvlans顯示回其上的內容,否則將顯示 4093 行單一項目。

    bridge -compressvlans vlan show dev ens19
    

現在可以透過以下方式實現相同的整體結果:

  • 其上的 VLAN 子介面br0(此處使用 VLAN ID 3)

    如果橋接介面(此處)或橋接連接埠(下一個項目符號)未新增 VLAN ID,則當橋接器設定為 VLAN 感知橋接器時,不會有此類流量通過。

    必須將 VLAN ID 新增至br0

    bridge vlan add vid 3 dev br0 self
    

    如上所述,所有內容都可以提前添加一次:

    bridge vlan add vid 2-4094 dev br0 self
    

    然後在其上加入常用的 VLAN 子介面:

    ip link add link br0 name br0.3 up type vlan id 3
    ip addr add 10.3.0.106/22 dev br0.3
    

    變更與介面關聯的 VLAN ID(以及在 IP LAN 10.3.0.0/22 的常見設定中)需要刪除子介面並使用不同的 VLAN ID 重新建立新介面:type vlan無法重新配置該介面。

  • 或一對韋斯介面(此處使用 VLAN ID 5)

    pvid untagged與使用 VLAN 子介面的作用相同:從網橋到連接埠取消標記,從連接埠到網橋標記。只有一個 VLAN ID 可以作為 PVID(這裡是使用的單一 VLAN ID)。

    ip link add name vlan5 up type veth peer name br0vlan5
    ip link set br0vlan5 up master br0
    bridge vlan add vid 5 dev br0vlan5 pvid untagged
    ip addr add 10.3.4.106/22 dev vlan5
    

    除了範例中選擇的名稱反映了 VLAN ID,因此這會導致人們混淆之外,關聯的 VLAN ID 可以(幾乎)動態變更(此處從 5 變更為 6):

    bridge vlan del vid 5 dev br0vlan5
    bridge vlan add vid 6 dev br0vlan5 pvid untagged
    

    如果尚未在 上設定所有 VLAN ens19,也請在那裡進行變更:

    bridge vlan del vid 5 dev ens19
    bridge vlan add vid 6 dev ens19
    

相關內容