先看常见的网卡配置文件(没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