Yuhang Zheng

FCU2303配置VLAN和网桥的示例

N 人看过

背景

在FCU2303的开发板上,有八个千兆网,分别是fm1-mac1,fm1-mac2,fm1-mac3,fm1-mac4,fm1-mac5,fm1-mac6,fm1-mac9,fm1-mac10,还有一个5G模块eth0。

客户有一个需求是想在这个板子上划分出两个VLAN(Virtual Local Area Network,中文名为”虚拟局域网”,工作在OSI参考模型的第2层和第3层。),一个是将这八个千兆网口划为一个VLAN,VLANID暂时定为100;另一个是将这八个网口中的任一网口和5G模块划为一个VLAN,VLANID暂时定为200,划分示意图如下图所示:

VLAN

这样的话,VLAN100中的设备就无法直接访问5G模块的流量,只能先将数据转发到fm1-mac1网口上,然后fm1-mac1再将数据转发到5G模块eth0。因为fm1-mac1是既在VLAN100中,又在VLAN200中,所以它充当了连接两个VLAN的桥梁,这时候如果在fm1-mac1中外接一台电脑用于监控流通此网口的流量的话,就实现了监听VLAN100中其他网口通过5G模块上网的数据内容。

客户描述问题

客户前期自己配置了网口,测试反馈的文档内容如下:

加载8021q模块:
sudo modprobe 8021q
sudo  sh -c 'grep -q 8021q /etc/modules || echo 8021q >> /etc/modules'
配置VLAN

vconfig add fm1-mac9 100
vconfig add fm1-mac1 100
ifconfig fm1.mac9.100 up
ifconfig fm1.mac1.100 up

即端口MAC9和MAC1属于同一个VLAN100

从端口fm1-mac9发送不带VLAN报文(SMV/GOOSE),其余端口均能正常收到SMV/GOOSE报文;
从端口从端口fm1-mac9发送带VLAN报文。VLAN为100(SMV/GOOSE),其余端口均能正常收到SMV/GOOSE报文,收到报文VLAN为100;
从端口从端口fm1-mac9发送带VLAN报文。VLAN为80(SMV/GOOSE),其余端口均能正常收到SMV/GOOSE报文,收到报文VLAN为80;

从客户反馈的信息中可以发现问题是,客户想要用两个网口来测试VLAN的功能,他选用了fm1-mac9和fm1-mac1这两个网口,并将其配置成了VLAN100,但是他的测试结果却显示,从端口fm1-mac9发送不带VLAN报文和带VLAN80的报文的时候,都可以在fm1-mac1收到。这是不应该的,因为配置了VLANID的网口只应该能收到其对应VLANID为100的报文才对。

导致这一问题出现的原因就是在FCU2203的开发板上已经默认配置了网桥功能,配置文件在/etc/systemd/network目录下面:

br0.netdev

[NetDev]
Name=br0
Kind=bridge

br0.network

[Match]
Name=br0

[Network]
Address=192.168.3.1/24

fm1-mac1.network

[Match]
Name=fm1-mac1
KernelCommandLine=!root=/dev/nfs

[Network]
Bridge=br0

fm1-mac9.network

[Match]
Name=fm1-mac9
KernelCommandLine=!root=/dev/nfs

[Network]
Bridge=br0

这样的网桥配置将fm1-mac1和fm1-mac9桥接在了一起,与我们想要的功能产生了冲突。

修改验证方法的建议

如果是按照客户的测试意图来实现的话,测试方法应该如下操作:

vconfig add fm1-mac9 100
vconfig add fm1-mac1 100
brctl addbr vlan100
brctl addif vlan100 fm1-mac9.100
brctl addif vlan100 fm1-mac1.100

ifconfig fm1-mac9 up
ifconfig fm1-mac9.100 up

ifconfig fm1-mac1 up
ifconfig fm1-mac1.100 up

ifconfig vlan100 up

首先删除原有的网络配置,rm -r /etc/systemd/network

然后创建一个网桥,将设置VLAN100时产生的VLAN节点加入进去即可。

按照此方法配置完成之后的网络配置符合测试预期。

客户最终需求的解决方法

回归正题,现在我们有了一个简单的创建VLAN的测试示例,也知道如何在VLAN中使用网桥。那么接下来就该解决我们的客户需求问题了。

方法一

命令配置

思路还是按照测试示例中一样,首先是使用命令配置的操作

vconfig add eth0 200
vconfig add fm1-mac1 200
vconfig add fm1-mac1 100
vconfig add fm1-mac2 100
vconfig add fm1-mac3 100
vconfig add fm1-mac4 100
vconfig add fm1-mac5 100
vconfig add fm1-mac9 100
vconfig add fm1-mac10 100

brctl addbr br0
brctl addif br0 fm1-mac1.100
brctl addif br0 fm1-mac2.100
brctl addif br0 fm1-mac3.100
brctl addif br0 fm1-mac4.100
brctl addif br0 fm1-mac5.100
brctl addif br0 fm1-mac9.100
brctl addif br0 fm1-mac10.100

brctl addbr br1
brctl addif br1 eth0.200
brctl addif br1 fm1-mac1.200

ifconfig eth0 up
ifconfig eth0.200 up
ifconfig fm1-mac1 up
ifconfig fm1-mac1.200 up
ifconfig fm1-mac2 up
ifconfig fm1-mac2.100 up
ifconfig fm1-mac3 up
ifconfig fm1-mac3.100 up
ifconfig fm1-mac4 up
ifconfig fm1-mac4.100 up
ifconfig fm1-mac5 up
ifconfig fm1-mac5.100 up
ifconfig fm1-mac9 up
ifconfig fm1-mac9.100 up
ifconfig fm1-mac10 up
ifconfig fm1-mac10.100 up

ifconfig br0 up
ifconfig br1 up

systemd配置

这次我们使用systemd来配置这个网络逻辑。

首先创建两个虚拟网桥

br0.netdev

[NetDev]
Name=br0
Kind=bridge

br1.netdev

[NetDev]
Name=br1
Kind=bridge

然后将这两个网桥启用

br0_up.network

[Match]
Name=br0

br1_up.network

[Match]
Name=br1

然后以fm1-mac1为例,创建其对应VLANID的两个虚拟网卡设备

fm1-mac1.100.netdev

[NetDev]
Name=fm1-mac1.100
Kind=vlan

[VLAN]
Id=100

fm1-mac1.200.netdev

[NetDev]
Name=fm1-mac1.200
Kind=vlan

[VLAN]
Id=200

将其与物理网卡绑定,在物理网卡的配置中定义这两个 vlan 的存在。

fm1-mac1.network

[Match]
Name=fm1-mac1

[Network]
DHCP=v4
VLAN=fm1-mac1.100
VLAN=fm1-mac1.200

对两个vlan虚拟网卡设备进行配置,将其加入到对应的网桥中

fm1-mac1.100.network

[Match]
Name=fm1-mac1.100
KernelCommandLine=!root=/dev/nfs

[Network]
Bridge=br0

fm1-mac1.200.network

[Match]
Name=fm1-mac1.200
KernelCommandLine=!root=/dev/nfs

[Network]
Bridge=br1

这样一个网卡的VLAN配置就配置好了,其他的网卡配置同理,我们这样配完了之后的网桥拓扑图如下:

使用brctl show命令查看

VLAN_br

使用bridge vlan show命令查看

image-20210531183717309

方法二

虽然在方法一中我们实现了想要的功能,但是按照这个方法配置下来,在/etc/systemd/network路径下的配置文件就有多达33个。

image-20210531190503855

这个时候我们就有一个想法,我们可不可以将这八个千兆网设备和5G模块划分到一个网桥里面,然后配置网桥自己去根据VLANID来控制数据的流向呢?

经过查找资料,我发现了以下的文字说明:

可以将网桥设置为 VLAN 感知。

然后网桥将处理流经它的附加了VLANID的数据帧 ,处理的操作包括根据对网桥的配置来tagged和untagged这些数据帧,并将附加了 VLAN 的帧仅发送到配置为接受它的端口。

这会将所有设置操作转移到网桥本身上面,而不必去配置每一个 VLAN 子接口(当然,这些子接口仍然可以在某些设置中使用)。 此功能无法通过过时的命令使用, 就要使用更新的bridge 命令实现这个功能(结合使用 ip link 命令)。

这是一个更简单的设置(一个网桥,没有子接口)。

brctl 的配置方案有如下几种:

一是配置一个tagged网桥接口,并且带有VLAN ID (VID) 5;

二是配置一个带有VLAN ID (VID) 5的网桥端口,但设置为untagged;

三是输出设置为untagged,并将 VID 设置为 PVID(Port VLAN ID):

四是只要是该网桥的端口,输入都设置为tagged,。

注意:每个端口只能有一个 PVID。

具体的方法这篇文章不再说明,接下来会有一个新的文章来说一下这些配置。

这便是方法二的配置了。

命令配置

ip link set eth0 up
ip link set fm1-mac1 up
ip link set fm1-mac2 up
ip link set fm1-mac3 up
ip link set fm1-mac4 up
ip link set fm1-mac5 up
ip link set fm1-mac9 up
ip link set fm1-mac10 up

ip link add name br0 type bridge vlan_filtering 1

ip link set eth0 master br0
ip link set fm1-mac1 master br0
ip link set fm1-mac2 master br0
ip link set fm1-mac3 master br0
ip link set fm1-mac4 master br0
ip link set fm1-mac5 master br0
ip link set fm1-mac9 master br0
ip link set fm1-mac10 master br0

bridge vlan del dev br0 vid 1 self
bridge vlan add dev eth0 vid 200
bridge vlan del dev eth0 vid 1
bridge vlan add dev fm1-mac1 vid 200
bridge vlan add dev fm1-mac1 vid 100
bridge vlan del dev fm1-mac1 vid 1
bridge vlan add dev fm1-mac2 vid 100
bridge vlan del dev fm1-mac2 vid 1
bridge vlan add dev fm1-mac3 vid 100
bridge vlan del dev fm1-mac3 vid 1
bridge vlan add dev fm1-mac4 vid 100
bridge vlan del dev fm1-mac4 vid 1
bridge vlan add dev fm1-mac5 vid 100
bridge vlan del dev fm1-mac5 vid 1
bridge vlan add dev fm1-mac9 vid 100
bridge vlan del dev fm1-mac9 vid 1
bridge vlan add dev fm1-mac10 vid 100
bridge vlan del dev fm1-mac10 vid 1

ip link set br0 up

systemd配置

首先创建一个虚拟网桥,并打开网桥的VLAN功能

br0.netdev

[NetDev]
Name=br0
Kind=bridge
[Bridge]
DefaultPVID=none
VLANFiltering=true
STP=false

这里我们发现,在[Bridge]字段里多了三个变量,重点是前两个:

DefaultPVID:接口缺省VLAN标识,指的是二层接口上的缺省VLAN-ID
VLANFiltering:网桥的VLAN Filtering功能,顾名思义实现对入口与出口数据包依据VLAN信息的过滤。

然后将网桥启用

br0_up.network

[Match]
Name=br0

然后以fm1-mac1为例,我们直接配置物理网卡,在其配置上加上VLANID

fm1-mac1.network

[Match]
Name=fm1-mac1

[Network]
Bridge=br0

[BridgeVLAN]
VLAN=100

[BridgeVLAN]
VLAN=200

这样一个网卡的VLAN配置就配置好了,其他的网卡配置同理,我们这样配完了之后的网桥拓扑图如下:

使用brctl show命令查看

image-20210531190210221

使用bridge vlan show命令查看

image-20210531190233637

这样配置下来在/etc/systemd/network路径下的配置文件仅仅10个

image-20210531190415340

参考链接

VLAN for virtual machines:VLAN for virtual machines – Ingos Wiki (hoeft-online.de)

VLAN Bridging (802.1q):VLAN Bridging and Trunking (802.1q) - docs.bisdn.de

Bridged interfaces and VLAN tags:networking - Bridged interfaces and VLAN tags - Unix & Linux Stack Exchange

VLAN (简体中文):VLAN (简体中文) - ArchWiki (archlinux.org)

VLAN中tagged与untagged的处理:VLAN中tagged与untagged的处理_kepa520的博客-CSDN博客

有关trunk、pvid、untagged、tagged的问题:有关trunk、pvid、untagged、tagged的问题 (huawei.com)

Virtual Network Device configuration:systemd.netdev (www.freedesktop.org)