本文概览
VLAN
Virtual Local Area Network,即虚拟局域网,用于将局域网的物理拓扑与逻辑拓扑解耦。将一个物理的局域网在逻辑上划分成多个广播域,VLAN 内的网络设备可以直接通信,跨 VLAN 不能直接通信,必须经由路由器等路由设备,从而将广播报文限制在单个广播域内。
VLAN 出现的背景
随着以太网的迅猛发展,网络接入设备呈指数级增长。而以太网在节点间传输数据基于共享物理介质,局域网中的网络设备越多,冲突的概率就会越高,性能会显著下降。其次,广播帧传递的范围太大,导致局域网的带宽资源、网络设备处理广播帧的 CPU 资源等资源的无谓消耗,影响整个局域网的性能。除此之外,在企业管理中,随着人员的变动,添加新设备时常常需要重新布线。而且通常会将不同部门划分不同的网络,以提高安全性。 虽然路由器也可以分割广播域,但由于路由器设备的价格较贵,而且分割的局域网个数受限于路由器的端口,而路由器本身的端口数量较少。在这种环境下,用于在交换机(特指二层交换机)上分割局域网的 VLAN 技术应运而生。
总结一下局域网物理拓扑的缺点:
- 网络设备越多,冲突概率越高,导致性能下降
- 广播风暴消耗资源,影响局域网的整体性能
- 扩展性低,无法灵活的分割网络
VLAN 的作用
VLAN 的出现解决了局域网物理拓扑带来的限制,其作用说白了只有一点,按需分割广播域。将一个物理网络划分成多个逻辑网络,可以理解为将一台真实的交换机在逻辑上分为了多个交换机。
VLAN 数据帧格式
重新复习一遍传统以太网帧的格式的解析
IEEE 802.1Q 标准协议1的 VLAN 数据帧格式,是在传统以太网帧的目的 MAC 地址和源 MAC 地址字段之后,协议类型字段之前加入 4 个字节的 VLAN 标签(VLAN Tag 简称 Tag),用于标识数据帧所属的 VLAN。下图中的红色部分表示 VLAN 标签。
以下仅对 VLAN 标签作出解释,其他字段的含义可查看传统以太网帧的格式
- TPID:Tag protocol identifier 标签协议标识符,表示数据帧类型,0x8100 表示 IEEE 802.1Q 帧,长度为 2 个字节
- TCI:Tag control information,包含了数据帧控制信息,同样由 2 个字节组成
- PCP(PRI):Priority code point,表示数据帧的优先级。之前的名称为 PRI,具体含义没变。PCP 占 3 bits,所以取值范围为 0 ~ 8,值越大表示优先级越高。如果发生拥塞,交换机首先发送优先级最高的数据包
- DEI(CFI):Drop eligible indicator 丢弃资格标识符,表示 MAC 地址封装是否符合规范格式,之前的名称为 CFI。DEI 占 1 bit,0 表示 MAC 地址以标准格式进行封装
- VID:VLAN identifier,表示帧所属的 VLAN。一般情况下在 TCI 中,只关心 VID。VID 占 12 bits,取值范围为 0 ~ 4095,总计可以标识 4096 个 VLAN
在一个 VLAN 网络中,数据帧由两种类型,有标记帧(tagged frame)和无标记帧(untagged frame)。交换设备的端口按照处理数据帧的能力,分为 Access 接口、Trunk 接口和 Hybrid 接口。每个接口都可以配置一个默认的 VLAN ID,用于为 untagged frame 添加 VLAN Tag。称为缺省 VLAN ID,即 PVID(Port Default VLAN ID)。
接口类型 | 作用 | 可处理的数据帧 |
---|---|---|
Access | 连接终端设备,如计算机或 IP 电话 | 单个 VLAN 的数据帧,即 untagged frame。 |
Trunk | 连接交换机之间或交换机与路由器之间 | 多个 VLAN 的数据帧,通过 VLAN 标签区分。即可同时收发 tagged、untagged frame。 untagged frame 仅存在于发送数据帧时剥离 VLAN 标签,转发给特定 VLAN |
Hybrid | 结合 Access 和 Trunk 的功能,可连接终端设备,同时处理多个 VLAN | 单个或多个 VLAN 的数据帧,根据配置确定 |
VLAN 的优缺点
- 优点
- 按需分割广播域
- 减少广播流量
- 提高安全性
- 简化管理成本
- 缺点
- VLAN ID 仅有 4096 个,在大型网络中不够用,
- 虽然可以从逻辑上划分成多个网络,但真实的数据帧无法脱离物理网络,即全部是 underlay 网络,会带来以下问题
- 交换机需要学习转发多个 VLAN 的数据帧,而交换机的内存有限且比较宝贵。当交换机 MAC 地址表不足以支持存储网络中的所有设备时,未存储 MAC 地址的设备的数据帧的转发,需要泛洪
- 不同的 VLAN ID 通常会分配不同的 IP 地址段,当业务集中在某个 IP 段内时,会导致网络资源分配不均
- 若局域网内使用 STP/RSTP 协议避免环路,则整个网络中的多个 VLAN 仅构造一颗树
VLAN 通信过程解析
为了更好的理解 VLAN 的实际通信过程,我们将分别从 VLAN 内通信、跨 VLAN 通信两个方面来详细描述及实践,其中又分别包括了同设备和跨设备两种类型,注意这里的设备指的是交换机等二层交换设备。
VLAN 内通信
同设备
同设备同 VLAN 内通信,交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。
- 数据帧传输:A 判断 B 和自己同属于一个网段,发送一个 ARP 报文获取 B 的 MAC 地址。A 发送 untagged 数据帧至交换机
- 交换机学习:交换机接收到一个 untagged 数据帧,将 PVID(缺省 VLAN ID)作为 VID,生成 Tag 添加至数据帧。并根据数据帧的源 MAC 地址、VID 和接收数据帧的端口,生成 MAC 表项(交换机自学习详细过程)
- 交换机转发:交换机根据数据帧的源 MAC 地址 和 VID 查找 MAC 表项,此时交换机 MAC 表项中还没有 B 的信息,于是交换机会在 A 所属 VID 的 VLAN 中广播报文。在发出广播报文前,会剥离 Tag,即 B 收到的也是 untagged 数据帧。B 响应 A 发出的 ARP 报文,交换机重复步骤 2,学习到 B 的 MAC 地址、VID 和接收数据帧的端口
- 直接通信:此时交换机 MAC 表项中已经包含了 A、B 的 MAC 地址、VID、接收端口,后续 A、B 通信时,交换机会查找 MAC 表,从表项所对应的端口发出单播报文
同设备同 VLAN 内实践
-
gns3 网络拓扑及配置
-
按照图中所示分别配置 A、B 的 IP 地址为 10.1.1.10、10.1.1.20,可以自定义 VLAN,不配置的话默认是 VLAN 1
- A:ip 10.1.1.10/24 10.1.1.1
- B:ip 10.1.1.20/24 10.1.1.1
-
-
查看交换机 VLAN 信息,包括 VID 对应的端口信息,和 MAC 表项。可以看到,e0/0 和 e1/1 都属于 VLAN 1,且此时还无任何表项
- show vlan
- show vlan
-
A、B 互 ping 后,查看交换机 MAC 表。可以看到 MAC 表项中包含 VID、MAC 地址及对应的端口。
- show mac address-table
跨设备
跨设备同 VLAN 内通信,交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。
-
交换机连接端口 PVID 与数据帧 VID 相同,即 IF1 与设备 A VID 相同
- 与同设备同 VLAN 内通信步骤相同
- 由于 VID 与交换机 IF1 的 PVID 相同,因此交换机在发出数据帧前,会将数据帧的 tag 剥离
- IF1 发出的数据帧为 untagged 数据帧
-
交换机连接端口 PVID 与数据帧 VID 不同,即 IF1 与设备 A VID 不同
- 与同设备同 VLAN 内通信步骤相似
- 由于 VID 与交换机 IF1 的 PVID 不同,因此交换机在发出数据帧前,不会将数据帧的 tag 剥离,直接透传该数据帧
- IF1 发出的数据帧为 tagged 数据帧
跨设备同 VLAN 内实践
-
gns3 网络拓扑及配置
-
配置 A、B 的 IP 地址为 10.1.1.10、10.1.1.20,和同设备同 VLAN 的配置命令一样
交换机连接端口 PVID 与数据帧 VID 相同
在不对交换机端口做特殊配置 VLAN 的情况下,所有设备和端口都是默认 VLAN 1,满足交换机连接端口 PVID 与 VID 相同的条件。
-
查看 Switch 1 VLAN 信息,可以看到所有的端口都属于 VLAN 1
-
在 B 上执行 ping A 的命令,并且在 Switch 1 和 Switch 2 之间抓包,可以看到 Switch 1 发往 Switch 2 的数据帧都是 untagged 数据帧
交换机连接端口 PVID 与数据帧 VID 不同
-
将 Switch 1 e1/1 端口的 PVID 改为 VLAN 10
- conf term
- int e1/1
- switchport trunk encapsulation dot1q (使用 IEEE 802.1Q 标准协议)
- switchport mode trunk
- switchport trunk native vlan 10
-
查看 Switch 1 VLAN 信息
- show vlan (端口 e1/1 已经不在 vlan 1 中)
- show int e1/1 switchport (Trunking Native Mode VLAN 为 10)
-
在 A 上执行 ping B 的命令,并且在 Switch 1 和 Switch 2 之间抓包,可以看到 Switch 1 发往 Switch 2 的数据帧都是 tagged 数据帧
跨 VLAN 通信
在文章开头处我们就说过,跨 VLAN 不能直接通信,必须经由路由器、三层交换机等路由设备,所以在后续的实践中我们需要使用三层交换机。三层交换机,本质上就是“带有路由功能的(二层)交换机”,三层交换机可以想象成一个路由器 + 一个(二层)交换机。
同设备
同设备跨 VLAN 通信,三层交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。
- 数据帧传输:A 判断 B 和自己不属于一个网段,发送一个 ARP 报文获取网关的 MAC 地址,目的 IP 为网关的地址 10.1.1.1。A 发送 untagged 数据帧至交换机
- 交换机学习:交换机接收到一个 untagged 数据帧,将 PVID(缺省 VLAN ID)作为 VID,生成 Tag 添加至数据帧。并根据数据帧的源 MAC 地址、VID 和接收数据帧的端口,生成 MAC 表项
- 交换机回复:交换机发现目的 IP 地址是自己,附上自己的 MAC 地址,回复 ARP 应答报文
- 数据帧传输:A 收到交换机回复的 ARP 应答报文,记录 IP、MAC 地址的对应关系至 arp 表中,重新封装数据帧,将目的 MAC 地址填为交换机回复的 MAC 地址,目的 IP 填为 B 的 IP 地址
- 查找路由表:交换机接收到一个 untagged 数据帧,添加 VLAN Tag。发现数据帧中的目的 MAC 地址是自己,则需要进行三层转发。根据目的 IP 地址查找三层转发表,此时 B 的相关信息还不存在与此表中,于是继续查找路由表
- 交换机转发:在路由表中发现目的 IP 地址属于另一个直连网段,在此网段中广播 ARP 报文以获取 B 的 MAC 地址。在发出广播报文前,同样会剥离 Tag,即发出 untagged 数据帧
- 数据帧传输:B 接收到 ARP 报文后,回复 ARP 应答报文,并记录 IP、MAC 地址至自己的 arp 表中,交换机重复步骤 2,学习到 B 的 IP、MAC、VID 对应关系,并记录到三层转发表中
- 直接通信:后续 A、B 通信时,发送数据帧至网关并匹配三层转发表进行三层转发
同设备跨 VLAN 抓包实践
-
gns3 网络拓扑及配置
-
配置 A、B 的 IP 地址为 10.1.1.10、10.1.2.10,和同设备同 VLAN 的配置命令相似,这里不再赘述
-
配置三层交换机
-
配置三层交换机
- conf term
- int e0/0
- switchport mode access
- switchport access vlan 10
- int vlan 10
- ip address 10.1.1.1 255.255.255.0
- no shut
- vlan 20 同上
- ip routing 这步必需,否则无法联通
-
查看 VLAN 信息
-
show vlan
-
-
查看路由信息
-
show ip route
-
-
查看 e0/0、e1/1 MAC 地址
-
-
在 A 上执行 ping B 的命令,并且在 A 与 L3Switch、B 与 L3Switch之间抓包
- A 发出的是 untagged 数据帧
- A 请求的目的 MAC 地址是网关的 MAC 地址
- B 回复的是 untagged 数据帧
- B 请求的目的 MAC 地址是请求时的源 MAC 地址,即 e0/0 的 MAC 地址
跨设备
跨设备跨 VLAN 通信,三层交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。
通信过程与同设备跨 VLAN 基本相似,同设备跨 VLAN 的过程中 A → 交换机 → B,相当于跨设备跨 VLAN 过程中的 A → 交换机 1 → 交换机 2,是整个跨设备跨 VLAN 通信过程的一半,剩余的半段通信过程类似。
跨设备跨 VLAN 抓包实践
-
gns3 网络拓扑及配置
-
配置 A、B 的 IP 地址为 10.1.1.10、10.1.2.10
-
配置三层交换机
-
- conf term
- 配置 A 和 L3Switch-1 之间为 access 链路
- int e0/0
- switchport mode access
- switchport access vlan 10
- no shut
- 配置 VLAN 10、VLAN 20 IP 分别为 10.1.1.1、10.1.2.1
- int vlan 10
- ip address 10.1.1.1 255.255.255.0
- no shut
- vlan 20 同理
- 配置 L3Switch-1 和 L3Switch-2 之间为 trunk 链路
- int e1/1
- switchport trunk encapsulation dot1q
- switchport mode trunk
- switchport trunk native vlan 10
- no shut
-
-
A ping B,并在 L3Switch-1 和 L3Switch-2 之间抓包
可以看到第一个 icmp 报文是不携带 VLAN ID,因为此时 L3Switch-1 的端口 PVID 和 报文中的 VID 一样,都是 10,所以发出的数据帧是 untagged 数据帧。在 L3Switch-2 发送 icmp reply 报文时,L3Switch-1 的端口 PVID 和 报文中的 VID 不同,于是 L3Switch-2 发出的是 tagged 数据帧,L3Switch-1 学习到 VID 是 20,后续的报文都会携带 VLAN ID。
VLAN 的常见应用
应用场景 | 描述 |
---|---|
部门划分 | 企业内不同部门间相互隔离,但共享同一个物理网络 |
客户和内部流量隔离 | 云服务提供商将客户的网络流量隔离,确保安全性 |
楼层或建筑划分 | 大型企业或学校拥有多个楼层或建筑,每个楼层独立管理 |
无线网络划分 | 为企业活学校的无线网络划分多个虚拟网络 |
虚拟化环境中的隔离 | 在虚拟化环境中,为虚拟机隔离网络环境 |
多租户数据中心 | 云计算环境或数据中心需要为多个租户提供独立的网络环境 |
就像我们在 VLAN 的作用 中提到的,任何需要在共用物理网络的基础上,划分多个逻辑网络的小型网络,都可使用 VLAN 实现。
-
除了 IEEE 802.1Q 还有 ISL,两者都可在数据帧中附加 VLAN 信息。唯一的区别是 ISL 是 Cisco 产品独有的,仅能在 Cisco 网络设备间使用。 ↩︎