
我正在嘗試 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
答案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