学网络的人,VLAN这个词大家都不陌生,但这么些年来,在几十个读者群所提的问题中,如果要统计的话,关于VLAN方面的问题可能将近占了三分之一,特别是涉及到对VLAN通信原理理解方面的配置问题。
1. VLAN的引入背景
VLAN技术的引入主是为了解决传统二层交换网络存在的以下问题。
传统的二层交换网络是以IP网段(IP网络或IP子网)进行划分的。在同一IP网段的所有设备都在同一广播域中,这样每个设备发送的广播报文都将在整个IP网段进行传播。如果广播域过大(设备较多),过多的广播报文会严重影响网络性能。有了VLAN后,可以根据需要把同一IP网段中的任意位置的设用户加入同一VLAN中(参见图1),随意缩小广播域,减小广播报文对网络性能的影响。
如果没有VLAN,则安全策略和QoS策略只能以IP网段或个别IP地址进行流过滤,这样很难做到对随机的小范围用户精准部署、实施这些策略。有了VLAN后,就只需把需要实施相同策略的用户加入同一VLAN即可。
在传统的同一IP网段二层交换网络中,各设备间可以直接进行二层互访,这样有时不能满足用户的安全需求。同时,同一二层交换网络中的任意一台设备发生了故障都有可能影响整个交换网络中的用户通信。划分了VLAN后,不同VLAN中的用户直接二层隔离,不能直接进行二层互访,提高了网络安全性。同时一个VLAN中的网络故障,也不会影响另一个VLAN中的用户通信,提高了网络健壮性。
2. VLAN通信原则
VLAN的配置看似很简单,但要真正进行正确的配置却不是件容易的事,必须先懂得VLAN的通信原理。VLAN通信主要涉及到VLAN的注册、交换机端口的VLAN加入、交换机端口的PVID(端口VLAN ID)、交换机端口的VLAN标签添加和剥离操作等方面。要确保同一VLAN内用户的二层通信成功,首先要满足以下原则:
在华为交换机中,加入的方式可以是Access、Trunk或Hybrid方式,这三种加入方式的VLAN帧收发原理将在本课程后面介绍。
3. 交换端口类型及VLAN标签操作
在华为交换机中,二层端口分为Access、Trunk和Hybrid三种类型。其实这三种交换端口都存在一个PVID,Acess端口的PVID就是该端口所加入的缺省VLAN,Trunk和Hybrid类型端口因为可以加入多个VLAN,所以它们的PVID是可配置的。在VLAN帧的发送和接收中,这三种类型的交换端口对VLAN标签的操作方式各有不同,具体如下表所示。
接口类型 | 对接收不带标签的报文处理 | 对接收带标签的报文处理 | 发送帧处理过程 |
Access接口 | 接收该报文,并打上缺省的VLAN ID(即PVID)。 | 当VLAN ID与缺省VLAN ID相同时,接收该报文;当VLAN ID与缺省VLAN ID不同时,丢弃该报文。 | 先剥离帧的PVID标签,然后再发送。 |
发送的帧总是不带VLAN标签 | |||
Trunk接口 | 打上缺省的VLAN ID,当缺省VLAN ID在允许通过的VLAN ID列表里时,接收该报文,否则丢弃该报文。 | 当VLAN标签对应的VLAN在接口允许通过的VLAN ID列表里时,接收该报文,否则丢弃该报文。 | 当VLAN标签对应的VLAN与PVID相同,且是该接口允许通过的VLAN ID时,剥离VLAN标签,发送该报文,否则保持原有VLAN标签不变,发送该报文。 |
l PVID仅当收到不带VLAN标签的帧,或者帧中VLAN标签对应的VLAN ID与PVID相同的帧时起作用,其它情况均不用考虑端口PVID l Trunk端口缺省情况下仅允许了VLAN 1的帧不带标签通过 | |||
Hybrid接口 | 打上PVID标签,当缺省PVID在允许通过的VLAN ID列表里时,接收该报文,否则丢弃该报文。 | 当VLAN标签对应的VLAN ID在接口允许通过的VLAN ID列表里时,接收该报文,丢弃该报文。 | 当VLAN标签对应的VLAN ID是该接口允许通过的VLAN ID时,发送该报文。可以通过命令设置发送时是否携带VLAN标签。 |
l PVID仅当收到不带VLAN标签的帧时起作用,其它情况均不用考虑端口PVID。数据帧是否会剥离VLAN标签发送与PVID无关,需手工指定 l Hybird端口缺省情况下仅以不带VLAN标签方式允许VLAN 1的帧通过 |
4. VLAN内通信规则及示例
同一IP网段、同一VLAN内的用户间通信依然是依据MAC地址表进行转发的,但此时的MAC地址表中与非VLAN场景下的MAC地址表相比,增加了一个“VLAN ID”字段。帧转发的规则如下:
【说明】三层交换机为VLAN创建了VLANIF接口(作为对应VLAN的网关)中,并配置了IP后,会在交换芯片的MAC地址表中添加该VLANIF三层接口的“MAC地址”+“VLAN ID”字段对应的MAC地址表项,并且该表项的三层转发标志置位(置1),当报文的目的MAC匹配这样的MAC地址表项(相当于匹配了VLAN的网关MMAC地址表项)后,说明需要进行三层转发,继续查找交换芯片的三层表项。其它MAC地址表的“三层转发标志位”置0,仅进行二层转发。
图2中PC1与PC2在同一IP网段,且同在VLAN 2中。假设两交换机上还未建立任何转发表项,现两PC用户要实现二层互访。
因为PC1和PC2均在VLAN 2中,而且连接在不同交换机上,根据前面介绍的VLAN通信原则可知,必须同时在SW1和SW2两交换机上注册VLAN 2。在此仅以手动注册为例进行介绍,即要同时在SW1和SW2上手动创建VLAN 2,并且把连接PC1、PC2的GE0/0/2端口均加入到VLAN 2中,且缺省VLAN必须为2,使得这两个端口在收到两主机发来的不带VLAN标签(通常主机发送的数据帧是不带VLAN标签的)的数据帧时打上VLAN 2的标签。理论上,这两个端口可以配置为Acess、Trunk和Hybrid任意一种类型(根据前面介绍的三种交换端口的VLAN标签操作方法可知,它们的配置方法是不一样的,在此不作介绍。)但交换机连接主机的端口通常配置为Access类型,缺省VLAN为VLAN 2。这样当接收到主机发送的数据帧后会打上缺省的VLAN 2标签。
同样,根据前面介绍的VLAN通信原则知道,如果不考虑VLAN标签交换,在PC1与PC2的通信路径中各交换机端口必须允许VLAN 2通过,所以SW1与SW2连接的GE0/0/1端口也必须允许VLAN 2通过。交换机之间连接的端口通常是配置为Trunk类型或Hyrbid类型(配置方法也不一样),而且为了使得VLAN 2数据帧保持VLAN 2标签(当然,具体是否要保持帧中的VLAN标签不变,要视具体拓扑结构和通信需求而定),必须使通过GE0/0/1端口发送的数据帧保留原来的VLAN 2标签。在此假设SW1和SW2的GE0/0/1端口均配置为Trunk类型,PVID保持缺省的VLAN 1不变,允许VLAN 2通过。
【说明】Trunk端口只要帧中的VLAN标签对应的VLAN ID与端口的PVID不一致则会保留帧中VLAN标签不变发送(前提是端口要允许该VLAN通过)。Hybrid端口发送数据帧时是否保留原来的VLAN标签是通过命令指定的,与PVID无关。
数据帧在通过接口发出时必须进行数据链路层的封装,在二层交换网络的通信中,必须获取目的端的MAC地址。而主机之间的MAC地址获取是通过ARP协议根据目的IP地址进行解析的,所以即使在同一VLAN内主机之间的二层通信也要先通过ARP协议获取目的端MAC地址。PC1与PC2之间的二层通信流程如下:
(1)PC1首先判断目的主机PC2的IP地址跟自己的IP地址在同一网段,于是发送ARP广播请求报文,以获取目的主机PC2的MAC地址。ARP请求报文中的“目的MAC地址”字段各位为全1,“目的IP地址 ”字段为PC2的IP地址10.1.1.3。
(2)ARP请求报文到达SW1的接口GE0/0/2后,发现是不带VLAN标签的帧,于是给报文添加VLAN 2的标签(此时的VLAN 2等于该端口的PVID),然后将报文的“源MAC地址”+“VLAN ID”与入接口的对应关系(1-1-1, 2, GE0/0/2)添加进MAC地址表中,生成PC1的MAC地址表项。然后在除入接口GE0/0/2外,所有允许VLAN 2通过的交换机端口上广播该ARP请求报文。
(3)当ARP请求报文从SW1的GE0/0/1端口(Trunk类型)发送时,因为该端口的PVID=1(缺省值),与报文的VLAN 2标签不同,且允许VLAN 2通过,所以直接透传(不剥除报文中的VLAN 2标签)该报文到SW2的GE0/0/1端口。
(4)SW2的GE0/0/1端口(Trunk类型)收到该ARP请求报文后,判断报文的VLAN 2标签对应的VLAN 2是该端口允许通过的VLAN,接收该报文。同时,也将ARP请求报文中的“源MAC地址”+”VLAN ID“和入接口 的对应关系添加进MAC地址表中,生成PC1的MAC地址表项。
【说明】这样,在SW1和SW2两台交换机上都已生成了PC1的MAC地址表项,可直接用于发送到PC1的数据帧的转发。
(5)SW2根据ARP请求报文中的“目的MAC地址”+“VLAN ID”在本地MAC地址表中进行查找,初始状态下没有找到,于是在除入接口GE0/0/1外,所有允许VLAN2通过的端口上广播该ARP请求报文。但SW2在从GE0/0/2端口发出ARP请求报文前,根据接口的Access配置,会先剥离其中的VLAN 2标签。
(6)PC2收到该ARP请求报文后,将其中的“源MAC地址”(PC1的MAC地址)和“源IP地址”(PC1的IP地址)对应关系记录在ARP表中,生成PC1的ARP表项。然后比较报文中的“目的IP地址”和自己的IP地址,发现相同,判定原来所收到ARP请求报文是发给自己的,于是向PC1发送ARP响应报文,报文中的源MAC地址是自己的MAC地址2-2-2,目的IP地址为PC1的IP地址10.1.1.2,不带VLAN标签。
(7)SW2的GE0/0/2端口收到ARP响应报文后,同样给报文添加VLAN 2的标签,同时将报文中的“源MAC地址”+“VLAN ID”与接口的对应关系(2-2-2, 2,GE0/0/2)添加进MAC地址表中,生成PC2的MAC地址表项。然后根据报文的“目的MAC地址”(PC1的MAC地址)+“VLAN ID”(1-1-1, 2)在本地查找MAC地址表。由于SW2在前面已生成了PC1的MAC地址表项,所以会查找成功,然后根据表项所映射的GE0/0/1端口转发该ARP响应报文。但SW2将向其出接口GE0/0/1转发PC2发送的ARP响应报文前,因为该端口为Trunk类型,且PVID=1(缺省值),与报文中的VLAN 2标签不同,但允许VLAN 2通过,所以直接透传报文到SW1的GE0/0/1端口。
(8)SW1根据收到的ARP响应报文中的“目的MAC地址”+“VLAN ID”在本地MAC地址表中进行查找,由于SW1也已在前面已生成了PC1的MAC地址表项,所以会查找成功,然后根据表项所映射的GE0/0/2端口转发该ARP响应报文。但因为GE0/0/2端口是Access类型,所以在转发前会剥离报文中的VLAN 2标签。
(9)PC1在收到PC2的ARP响应报文后,依据报文中的“源MAC地址”和“源IP地址”字段值生成PC2的ARP表项。
后续PC1与PC2的互访,由于彼此已学习到对方的MAC地址,可以直接进行帧封装了,报文中的“目的MAC地址”直接为对方的MAC地址。这样PC1、PC2发送的VLAN 2数据帧到达SW1、SW2时就可以直接根据帧中的目的MAC地址在本地查找对应的MAC地址表项,获取转发出接口,同时根据出接口上的VLAN配置决定数据帧是否可以从该端口进行转发。