橋接介面和 VLAN 標籤
我正在嘗試建立一個系統,將未標記的乙太網網路連接到 TAP 隧道,並在流量移動到隧道時添加 VLAN 標記。
到目前為止,我有:
eth0
- 承載未標記流量的物理乙太網介面。tap1
- TAP 隧道介面。br0
- 包含tap1
(和其他一些物理介面)的網橋我知道我可以通過這樣做在乙太網端添加一個 VLAN 標記:
$ ip link add link eth0 name eth0.5 type vlan id 5 $ brctl addif br0 eth0.5
但是我怎麼能反過來呢?
編輯我發現我可以做到這一點:
$ ip link add veth0 type veth peer name veth1 $ ip link add link veth0 name veth0.5 type vlan id 5 $ brctl addif br0 veth0.5 $ brctl addbr br1 $ brctl addif br1 eth0 $ brctl addif br1 veth1
我認為這是我想要的——它創建了兩個網橋,一個虛擬乙太網設備連接它們,並在流量在網橋之間傳遞時添加/刪除 VLAN 標記。有沒有更簡單的?
是:您可以將網橋設置為支持 VLAN。
然後,網橋將處理附加到通過它的幀的 VLAN ID,包括根據配置標記和取消標記它們,並將屬於給定 VLAN 的幀僅發送到配置為接受它的埠。這會將所有設置移動到網橋本身,而不必使用 VLAN 子介面(當然,這些子介面仍然可以在某些設置中使用)。
此功能無法通過過時的
brctl
命令使用,但需要更新的替換bridge
命令(以及通常的ip link
命令)。這是一個更簡單的設置(一個網橋,沒有子介面)。方法是配置
tap1
為帶有 VLAN ID (VID) 5 和eth0
VID 5 的標記網橋埠,但設置為未標記:輸出未標記,並將此 VID 設置為 PVID(埠 VLAN ID):輸入標記為橋內。每個埠只能有一個 PVID。同時可選地刪除預設分配給每個埠的 VLAN ID 1(除非更複雜的設置當然需要多個 VLAN)以保持乾淨的配置。
到目前為止,您的設置僅使用較新的命令應如下所示:
ip link set eth0 up ip link set tap1 up # the following line could have directly included at bridge creation the additional parameter `vlan_filtering 1` ip link add name br0 type bridge ip link set tap1 master br0 ip link set eth0 master br0
特定的 VLAN 感知網橋設置,從啟動功能開始:
ip link set dev br0 type bridge vlan_filtering 1 bridge vlan del dev tap1 vid 1 bridge vlan del dev eth0 vid 1 bridge vlan add dev tap1 vid 5 bridge vlan add dev eth0 vid 5 pvid untagged ip link set br0 up
請注意,網橋的自隱式埠仍在使用 VID 1,因此在某些設置上直接在網橋上分配 IP 現在將無法正常通信。如果確實需要這樣的配置,您也可以在 VLAN 5 中設置網橋的自埠,語法稍有不同 (
self
),因為它是網橋本身:bridge vlan del dev br0 vid 1 self bridge vlan add dev br0 vid 5 pvid untagged self
它通常更乾淨(仍然刪除橋的預設 VID 1 以防止它發生任何可能的互動)添加一個veth對,將一端插入橋,配置其橋VLAN設置相同
eth0
並在另一端分配 IP結尾。關於這個主題的好部落格系列:
在未命名的 Linux 網路命名空間中使用 veth 設備、Linux 網橋和 VLAN