我正在尝试建立一个系统,将未标记的以太网连接到 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 标记。有没有更简单的?
答案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 六、 七 八