Networking

橋接介面和 VLAN 標籤

  • October 10, 2019

我正在嘗試建立一個系統,將未標記的乙太網網路連接到 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 和eth0VID 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

I II III IV V VI VII VIII

引用自:https://unix.stackexchange.com/questions/546136