VLAN基础
VLAN产生背景
在典型的以太网中,当某台主机发送一个广播帧或者未知的单播帧时,该数据帧会被泛洪,甚至传递到整个广播域,广播域越大,产生的安全问题、垃圾流量问题就越严重。
如在上图的交换网络中,网络中只有终端和交换机,在这样的网络中,广播帧能够到达网络的每一处,因此整个交换网络也是一个广播域。 如果PC1向PC2发送单播帧,网络中只有SW1、SW3、SW7的MAC表存在有关PC2的MAC地址表项,那么只有SW1和SW3会对该单播帧执行点对点的转发操作,SW2和SW5将会泛洪,SW7会丢弃数据帧,这样虽然实现了PC1和PC2的通信,但网络中很多其他主机会收到垃圾流量。
因此,为了解决广播域带来的问题,引入了VLAN (Virtual Local Area Network,虚拟局域网) 的概念。
一个VLAN就是一个广播域,所以在同一个VLAN内部,计算机可以直接进行二层通信; 而不同VLAN内的计算机,无法直接进行二层通信,只能进行三层通信来传递信息, 即广播报文被限制在一个VLAN内。
VLAN实现原理
根据网络环境需要,使用不同的方法划分好VLan,为了区别数据帧是属于哪个vlan,需要对数据帧添加vlan标签(Tag),交换机根据数据帧所属的vlan进行转发。
VLAN Tag
数据帧从终端主机发出来时是不带有VLAN Tag 的,也就是untagged帧,数据帧到了交换机,交换机根据VLAN的设置,在接收到的数据帧的特定位置加上VLAN Tag,也称为tagged帧。
VLAN Tag中的主要字段:
- TPID:2字节,Tag Protocol Identifier(标签协议标识符),表示数据帧类型。
- 取值为0x8100时表示IEEE 802.1Q的VLAN数据帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。
- 各设备厂商可以自定义该字段的值。当邻居设备将TPID值配置为非0x8100时, 为了能够识别这样的报文,实现互通,必须在本设备上修改TPID值,确保和邻居设备的TPID值配置一致。
- PRI:3 bit,Priority,表示数据帧的优先级,用于QoS。
- 取值范围为0~7,值越大优先级越高。当网络阻塞时,交换机优先发送优先级高的数据帧。
- CFI:1 bit,Canonical Format Indicator(标准格式指示位),表示MAC地址在不同的传输介质中是否以标准格式进行封装,用于兼容以太网和令牌环网
- CFI取值为0表示MAC地址以标准格式进行封装,为1表示以非标准格式封装。
- 在以太网中,CFI的值为0。
- VID:12 bit,VLAN ID,表示该数据帧所属VLAN的编号。
- VLAN ID取值范围是0~4095。由于0和4095为协议保留取值,所以VLAN ID的有效取值范围是1~4094。
- 交换机利用VLAN标签中的VID来识别数据帧所属的VLAN,广播帧只在同一 VLAN内转发,这就将广播域限制在一个VLAN内。
VLAN 划分
计算机发出的数据帧不带任何标签。对已支持VLAN特性的交换机来说,当计算机发出的 Untagged帧一旦进入交换机后,交换机必须通过某种划分原则把这个帧划分到某个特定的 VLAN 中去。
VLAN的划分包括:
- 基于接口划分:根据交换机的接口来划分VLAN。
- 网络管理员预先给交换机的每个接口配置不同的PVID,当一个数据帧进入交换机时,如果没有带VLAN标签,该数据帧就会被打上接口指定PVID的标签,然后数据帧将在指定VLAN中传输。
- 基于MAC地址划分:根据数据帧的源MAC地址来划分VLAN。
- 基于IP子网划分:根据数据帧中的源IP地址和子网掩码来划分VLAN。
- 基于协议划分:根据数据帧所属的协议(族)类型及封装格式来划分VLAN。
- 基于策略划分:根据配置的策略划分VLAN,能实现多种组合的划分方式,包括接口、MAC地址、IP地址等。
基于接口划分
将VLAN ID配置到交换机的物理接口上,从某一个物理接口进入交换机的、由终端计算机发送的Untagged数据帧都被划分到该接口的VLAN ID(port vlan id,PVID,默认情况西下PVID值为1)所表明的那个VLAN。
这种划分规则简单直观,容易实现,缺点是当主机移动时需要重新配置VLAN。
二层接口类型
基于接口的VLAN划分依赖于交换机的接口类型,交换机的接口类型分为三种:Access、Trunk、Hybrid
Access接口
Access接口一般用于和不能识别Tag的用户终端(如用户主机、服务器等)相连,或者不需要区分不同VLAN成员时使用。
- Access接口只能加入一个VLAN,这个 VLAN 也就是接口的 PVID
- Access 接口仅允许 VLAN ID 与接口 PVID 相同的数据帧通过。
- Access 接口接收数据帧:
- 接口从链路上收到一个Untagged帧,交换机会在这个帧中添加上VID为PVID 的Tag,然后对得到的Tagged帧进行转发操作(泛洪、转发、丢弃)。
- 接口从链路上收到一个Tagged帧,交换机会检查这个帧的Tag中的VID是否 与PVID相同。如果相同,则对这个Tagged帧进行转发操作;如果不同,则直接丢弃 这个Tagged帧。
- Access接口发送数据帧: 当一个 Tagged 帧从本交换机的其他接口到达一个 Access 接口后,交换机会检查这个帧的 Tag 中的 VID 是否与 PVID 相同,如果相同,则将这个 Tagged 帧的 Tag 进行剥离,然后将得到的 Untagged 帧从链路上发送出去;如果不同,则直接丢弃这个 Tagged 帧。
Trunk接口
Trunk接口一般用于连接交换机、路由器、AP以及可同时收发Tagged帧和Untagged帧的语音终端。
- Trunk接口允许多个VLAN数据帧通过
- Trunk除了要配置 PVID,还要配置允许通过的 VLAN ID 列表,其中 VLAN 1 是默认存在的。
- Trunk接口仅允许在 VLAN ID 列表中的数据帧通过,Trunk接口可以允许多个 VLAN 的帧带 Tag 通过,但只允许一个 VLAN 的帧从该类接口上发出时不带Tag
- Trunk接口接收数据帧:
- 当Trunk接口从链路上收到一个 Untagged 帧,交换机会在这个帧中添加上VID为 PVID 的Tag,然后查看PVID是否在允许通过的VLAN ID列表中。如果在,则对得到的 Tagged帧进行转发操作;如果不在,则直接丢弃得到的Tagged帧。
- 当Trunk接口从链路上收到一个 Tagged 帧,交换机会检查这个帧的Tag中的VID是否在允许通过的VLAN ID列表中。如果在,则对这个Tagged帧进行转发操作;如果不在, 则直接丢弃这个Tagged帧。
- Trunk接口发送数据帧
- 当一个 Tagged 帧从本交换机的其他接口到达一个 Trunk 接口后,如果这个帧的 Tag 中的 VID 不在允许通过的 VLAN ID 列表中,则该 Tagged 帧会被直接丢弃。
- 当一个 Tagged 帧从本交换机的其他接口到达一个 Trunk 接口后,如果这个帧的 Tag 中的 VID 在允许通过的 VLAN ID 列表中,则会比较该 Tag 中的 VID 是否与接口的 PVID 相同:相同则剥离 Tag 后将 Untagged 的帧从链路发出,不同则直接发送出去,不剥离。
Hybrid接口
Hybrid接口既可以用于连接不能识别Tag的用户终端(如用户主机、服务器等),也可以用于连接交换机、路由器以及可同时收发Tagged帧和Untagged帧的语音终端、AP。
- Hybrid接口也可以允许多个VLAN数据帧通过
- Hybrid接口除了配置PVID,还存在 两个 VLAN ID 列表,一个是 Untagged VLAN ID,一个是 Tagged VLAN ID,其中 VLAN 1 默认在Untagged VLAN 列表中,存在两个列表中的 VLAN 帧都是允许通过Hybrid接口的。
- Hybrid与 Trunk 接口的特定基本一致,但 Trunk 接口仅允许一个 VLAN 的帧不带 Tag,而 Hybrid 接口允许多个 VLAN 的帧不带 Tag。 华为设备默认的接口类型是Hybrid。
- Hybrid接口接收数据帧: 与 Trunk 接口大概一致,只是检查的 VLAN ID 列表会比 Trunk 多一个,无论接收到的是 Tagged 还是 Untagged,添加 VID 后得到的 Tagged帧只要在两个列表中任意一个,都进行转发,如果都不在则丢弃。
- Hybrid接口发送数据帧:
- 当一个 Tagged 帧从本交换机的其他接口到达一个 Hybrid 接口后,如果这个帧的 Tag 中的 VID 既不在 Untagged VLAN ID 列表中,也不在 Tagged VLAN ID 列表中,则该 Tagged 帧会被直接丢弃。
- 当一个 Tagged 帧从本交换机的其他接口到达一个 Hybrid 接口后,如果这个帧的 Tag 中的 VID 在 Untagged VLAN ID 列表中,则交换机会对这个 Tagged 帧的 Tag 进行剥离, 然后将得到的Untagged 帧从链路上发送出去。
- 当一个 Tagged 帧从本交换机的其他接口到达一个 Hybrid 接口后,如果这个帧的 Tag 中的 VID 在 Tagged VLAN ID 列表中,则交换机不会对这个 Tagged 帧的 Tag 进行剥离, 而是直接将它从链路上发送出去。
总结一下各类接口加 Tag 和剥夺 Tag 的不同:
- 接收 Untagged 数据帧时,所有类型接口都会根据自己的 PVID 为其打上相同的 VLAN Tag,但 Trunk 和 Hybrid 还会根据帧的 VID 是否在允许通过的 VLAN ID 列表中来判断是否接收,Access 则无条件接收(
我没遇到过把自己 PVID ban了的情况,这里有点不理解这个机制) - 接收 Tagged 数据帧时,所有类型接口都会根据数据帧的 VID 是否为其允许通过的 VLAN 来判断是否接收(Access接口就是缺省 VLAN)
- 发送数据帧时,Access接口直接剥离所有的数据帧 Tag,Trunk接口只剥离 VID 与 接口 PVID 相同的数据帧,Hybrid接口则根据 Untagged列表选择性剥离。
基于MAC地址划分
交换机内部建立并维护了一个MAC地址与 VLAN ID的对应表。当交换机接收到计算机发送的Untagged帧时,交换机将分析帧中的源MAC地址,然后查询MAC地址与 VLAN ID的对应表,并根据对应关系把这个帧划分到相应的VLAN中。
这种划分方法更加灵活,当计算机接入交换机的端口改变时也不需要重新配置,但MAC地址的伪造使得这种方法安全性不高。
在 Access 和 Trunk 接口上,只有基于 MAC 划分的 VLAN 和 PVID 相同时,才能使用 MAC VLAN 功能,因此基于 MAC 地址划分 VLAN 推荐在 Hybrid 接口上配置。
基于IP子网划分
基于 IP 子网的 VLAN 是以帧中 IP 包的源 IP 地址作为依据来进行划分的。设备从端口接收到帧后,根据帧中 IP 包的源 IP 地址,找到与现有 VLAN 的对应关系,然后自动划分到指定 VLAN 中转发。
这种划分 VLAN 的方法优点是当用户物理位置移动时,即从一个交换机换到其他的交换机 时,VLAN 不用重新配置。
这种划分 VLAN 的方法缺点是效率低,因为检查每一个数据帧的网络层地址是需要消耗处 理时间的,一般的交换机芯片都可以自动检查网络上数据帧的头,但要让芯片能检查 IP 头,需 要更强的识别和处理能力。
基于协议划分
基于协议的 VLAN 是根据端口接收到的帧所属的协议(族)类型及封装格式来给帧分配不 同的 VLAN ID。可用来划分 VLAN 的协议族有 IP、IPX、AppleTalk 等,封装格式有 Ethernet II、 802.3、802.3/802.2 LLC、802.3/802.2 SNAP 等。
交换机从端口接收到以太网帧后,通过识别帧中的协议类型和封装格式来确定帧所属的 VLAN,然后将数据帧自动划分到指定的 VLAN 中传输。
VLAN匹配顺序
如果交换机的某个端口下同时开启以上四种 VLAN,则缺省情况下,VLAN 将按照基于 MAC 地址的 VLAN、基于 IP 子网的 VLAN、基于协议的 VLAN、基于端口的 VLAN 的先后顺序进行 匹配。当交换机的以太网端口收到帧时,将采用以下方法处理:
- 当收到的帧为 Tagged 帧时,如果端口允许携带该 VLAN 标记的帧通过,则正常转发; 如果不允许,则丢弃该帧。
- 当收到的帧为 Untagged 帧时,会以帧的源 MAC 地址为依据去匹配 MAC-VLAN 表项。 如果匹配成功,则按照匹配到的 VLAN ID 和优先级进行转发;如果匹配失败,则进行 下一步处理。
- 按 IP 子网 VLAN 匹配方式进行匹配,依据帧的源地址来确定帧所属的 VLAN,如果匹 配成功,将帧自动划分到指定 VLAN 中进行转发;如果匹配失败,则进行下一步处理。
- 按协议 VLAN 匹配方式进行匹配,如果帧匹配协议模板,则给帧打上由该协议模板定 义的协议 VLAN 的 VLAN ID 进行转发;如果帧没有匹配协议模板,则给帧打上端口的缺省 VLAN ID 进行转发
VLAN 间通信
通过划分 VLAN 可以缩小广播域从而减小广播风暴的影响,但也导致属于不同 VLAN 下的网络之间无法互访,因此还需要实现不同 VLAN 间的通信。其实实现的核心就是 VLAN Tag 的剥离和添加,把 VLAN Tag 剥离了就是普通的报文了,就可以在三层进行转发了。 在实际网络部署中,通常把不同网段的 IP 地址段划分到不同的 VLAN,同 VLAN 且同网段的 PC 之间可以直接通信,无需通过三层转发设备,这种通信称为二层通信。VLAN 间互访需要使用三层通信,三层通信需要借助例如路由器、三层交换机、防火墙等三层设备。
路由器实现
使用路由器实现 VLAN 间通信有两种方式,一种是使用物理接口,一种是使用子接口。
物理接口
路由器三层接口作为网关,转发本网段前往其他网段的流量;一个物理接口就对应一个网段的网关,因此每个 VLAN 单独使用一个交换机接口与路由器互连。这种方案可扩展性较差,因为路由器作为三层设备,可用的物理接口比较少。
在 SW1 上配置 VLAN,并使用两个接口分别连接到路由器的两个物理接口,R1 的两个接口分别作为 VLAN 10 和 VLAN 20 的默认网关,实现 VLAN 间通信。
- 路由器的三层接口无法处理携带 VLAN Tag 的数据帧,因此交换机上的连接路由器的接口应该配置为 Access接口
子接口
子接口是基于路由器以太网接口创建的逻辑接口,以物理接口 ID + 子接口 ID 进行标识,子接口同物理接口一样可以进行三层转发。
- 子接口和物理接口不同,可以接收 Tagged 帧。
- 一个物理接口可以创建多个子接口,将该物理接口对接交换机的接口配置为 Trunk 口,即可实现一个物理接口为多个 VLAN 提供三层转发服务。
- 由于三层子接口不支持 VLAN 报文,当它收到 VLAN 报文时,会将 VLAN 报文当成非法报文而丢弃,因此需要在子接口上将 VLAN Tag 剥离,又称为 VLAN 终结 (VLAN Termination),子接口发出报文时再将对应的 VLAN 标签添加回报文之中再发送。
三层交换机实现
三层交换机除了具备二层交换机的功能,还支持通过三层接口 (如 VLANIF 接口) 实现路由转发功能。 VLANIF 是一种三层的逻辑接口,支持 VLAN Tag 的剥离和添加,因此可以实现 VLAN 之间的通信。
- VLANIF 接口编号与对应的 VLAN ID 相同,例如 VLAN 10 对应 VLANIF 10
如图,要实现 PC1 和 PC2 之间的通信。(各设备都具有了相对应的ARP和MAC表项)
- 由于是跨网段通信,PC1 将报文发送到网关 (目的MAC为MAC2)
- 交换机收到报文后,经过解封装,发现目的 MAC 为 VLANIF 10 接口的 MAC ,因此交给路由模块进行处理。
- 路由模块解析到目的 IP 并非本地接口的 IP 地址,因此进行三层转发,查找路由表后匹配到了 VLAN20 的直连路由。
- 匹配的是直连路由,因此交换机在 ARP 表中查找目的 IP 对应的 MAC 地址 (即MAC3) ,并重新封装后交给交换模块。
- 交换模块查找 MAC 地址表从而确定发送接口,并判断是否需要添加或剥除 Tag,最终将报文 (源MAC = MAC2,目的MAC = MAC3) 发送给PC2,完成通信。
附:二、三接口对比