桥接接口和 VLAN 标记

桥接接口和 VLAN 标记

我正在尝试建立一个系统,将未标记的以太网连接到 TAP 隧道,并在流量移至隧道时添加 VLAN 标记。

到目前为止我有:

  • eth0- 承载未标记流量的物理以太网接口。
  • tap1- TAP 隧道接口。
  • br0tap1- 包含(和一些其他物理接口)的桥

我知道我可以通过执行以下操作在以太网端添加 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 标记。有没有更简单的?

答案1

是:您可以将网桥设置为支持 VLAN。

然后,网桥将处理附加到通过它的帧的 VLAN ID,包括根据配置对它们进行标记和取消标记,并且仅将属于给定 VLAN 的帧发送到配置为接受该帧的端口。这会将所有设置移至网桥本身,而不必使用 VLAN 子接口(当然,这些子接口仍然可以在某些设置中使用)。

此功能无法通过过时的brctl命令获得,但需要更新的替代命令bridge命令(以及通常的ip link命令)。这是一种更简单的设置(一个桥,没有子接口)。

该方法是将 VLAN ID (VID) 5 配置tap1为标记桥接端口,也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 以防止其进行任何可能的交互)添加韦斯配对,将一端插入桥接器,配置其桥接器虚拟局域网设置与另一端相同eth0并分配IP。

关于这个主题的好博客系列:

在未命名的 Linux 网络命名空间中享受 veth 设备、Linux 网桥和 VLAN 的乐趣
三、 四号 V 六、

相关内容