linux网卡配置后发出带vlan标签的报文

先看常见的网卡配置文件(没vlan)

# cat /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet

BOOTPROTO=none

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

NAME=eth0

UUID=04cb4fa6-f820-45c0-b847-df94e9628bc5

DEVICE=eth0

ONBOOT=yes

GATEWAY=192.168.1.254

IPADDR=192.168.1.100

NETMASK=255.255.255.0

这样的主机网卡将连接到一个交换机的Access网口上 ,主机网卡上的配置不需要考虑底层的网络,即主机网卡配置不考虑vlan,交换机上将给这个网卡发出报文打上标签。

KVM场景下带有vlan的网卡

下面组网图中一个部署KVM hypervisor的主机网卡连接到交换机上带有3个vlan的trunk网口上,第一个vlan是trunk native vlan 100,第2个和第3个 vlan200和300,通过这两个网口会携带802.1Q tag,因此需要在主机上配置并识别vlan。

首先要保证802.1Q内核模块加载成功。如果配置vlan子接口,实际上该模块是自动加载的。

# lsmod | grep 8021q

# modprobe 8021q

# lsmod | grep 8021q

8021q          33208      0

garp              14384      1  8021q

mrp              18542      1  8021q

像大多数网络配置一样,需要在/etc/sysconfig/network-scripts下相应的网卡配置文件中设置vlan。不同于其他网卡配置,网卡名字是父网卡名称+vlanID,比如eth0.200,这一设置将vlan和对应父网卡相关联,另外网卡配置文件中VLAN=yes指令将配置出一个vlan子接口。

基于上文的eth0网卡,针对vlan200和vlan300,配置相应子接口。

# cat /etc/sysconfig/network-scripts/ifcfg-eth0.200

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=none

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

NAME=eth0.200

UUID=04cb4fa6-f820-45c0-b847-df94e9628bc5

DEVICE=eth0.200

ONBOOT=yes

IPADDR=192.168.2.100

NETMASK=255.255.255.0

VLAN=yes

# cat /etc/sysconfig/network-scripts/ifcfg-eth0.300

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=none

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

NAME=eth0.300

UUID=04cb4fa6-f820-45c0-b847-df94e9628bc5

DEVICE=eth0.300

ONBOOT=yes

IPADDR=192.168.3.100

NETMASK=255.255.255.0

VLAN=yes

vlan配置后,需要重启网络服务以激活子接口

# systemctl restart network

# ip --br link show

lo          UNKNOWN    00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>

eth0        UP        52:54:00:82:d6:6e <BROADCAST,MULTICAST,UP,LOWER_UP>

eth0.200@eth0 UP        52:54:00:82:d6:6e <BROADCAST,MULTICAST,UP,LOWER_UP>

eth0.300@eth0 UP        52:54:00:82:d6:6e <BROADCAST,MULTICAST,UP,LOWER_UP>

# ip --br addr sh

lo          UNKNOWN    127.0.0.1/8 ::1/128

eth0        UP        192.168.1.100/24 fe80::5054:ff:fe82:d66e/64

eth0.200@eth0 UP        192.168.2.100/24 fe80::5054:ff:fe82:d66e/64

eth0.300@eth0 UP        192.168.3.100/24 fe80::5054:ff:fe82:d66e/64

以上两个子接口eth0.200 and eth0.300,任何从这些子接口上发出的包packets将会打上相应的vlan。

抓个包可以看到报文中802.1Q field,就是子接口中相应的vlan 200配置:

总结

1. 网卡都不配置vlan,怎么上通过交换机通信,至少连接到配置Access vlan的交换机的网口上。报文到交换机上打上Access vlan的标签。

2. 打了vlan标签的网卡,连接到交换机上配置trunk vlan的网口,报文在交换机trunk vlan范围内则通过。

3. 打了vlan标签的网卡,要注意连接到交换机上的网口不能配置trunk native vlan和网卡上vlan的一模一样,这样报文从主机到交换机没问题,在trunk vlan范围内可以进入交换机,但报文从交换机出去要返回到主机上时会被剥离vlan id而导致单通。

4. 如果一张网卡即做多个vlan又有子接口不做vlan的,不打vlan标签的子接口所连接的交换机要配置trunk native vlan,还要配置trunk vlan。

参考

How to configure a VLAN in Linux

https://www.redhat.com/sysadmin/vlans-configuration

推荐阅读更多精彩内容