为什么需要 VLAN 网络
2023-01-05 计算机网络
概述
VLAN (Virtual Local Area Network) 是一种逻辑上将单个物理局域网 (LAN) 划分为多个虚拟局域网的技术。每个 VLAN 是一个独立的广播域, 允许网络管理员根据组织结构、功能、部门或其他标准将网络设备划分为逻辑组。
和子网的关系
解决了哪些问题?
1. 广播域分割和控制
每个 VLAN 形成一个独立的广播域,减少了广播帧传递的范围 (如 ARP、DHCP、RIP 都会产生广播帧),减少了二层网络中的广播风暴问题,并提高网络性能。
2. 逻辑划分和安全隔离
VLAN 允许网络管理员根据项目、功能或其他标准对网络进行逻辑划分,这对于大型组织来说是必需,同时也可以根据安全需求将设备划分为不同的逻辑分组,这样就可以隔离敏感系统功能、操作和数据。
3. 灵活性和管理简化
VLAN 允许网络管理员根据需要重新配置网络逻辑拓扑结构,而无需更改物理布线,提高了网络灵活性,同时简化了网络管理和维护。
使用场景
1. 数据中心网络和服务商
在数据中心中,可以利用 VLAN 网络隔离虚拟机、存储和其他资源,服务商也可以利用 VLAN 将不同租户的流量进行隔离,确保安全性和隐私。
2. 组织网络
在组织网络中 (例如企业网络和校园网络),可以利用 VLAN 将不同楼层、部门、项目划分到不同的逻辑网络中,实现安全隔离和流量控制。
802.1Q 标准
VLAN 的帧标记采用 IEEE 802.1Q 标准,定义了在以太网帧中插入 VLAN Tag的方法。 标准规定了Tag的格式、VLAN ID 的范围等,在源 MAC 地址字段和协议类型字段之间加入 4 字节的 802.1Q Tag。
帧格式字段 | 含义 |
---|---|
TPID | 取值为 0x8100 时表示 802.1Q Tag帧,如果不支持 802.1Q 的设备收到这样的帧,会直接丢弃 |
PRI | 取值范围为 0~7,值越大优先级越高。用于当交换机阻塞时,优先发送优先级高的数据帧 |
CFI | CFI 为 0 说明是经典格式,CFI 为 1 表示为非经典格式,用于兼容以太网和令牌环网。在以太网中,CFI的值为 0 |
VID | VLAN ID 取值范围是 0~4095 |
每台支持 802.1Q 协议的交换机发送的数据包都会包含 VLAN ID,以指明该交换机属于哪一个VLAN, 因此在一个 VLAN 交换网络中,会存在以下两种格式的以太网帧:
- 有标记帧: 加了 4 字节 802.1Q Tag 的帧
- 无标记帧: 未加 4 字节 802.1Q Tag 的原始帧
链路类型
VLAN 内的主机不需要知道 VLAN 的存在,发出的是无标记的帧报文,交换设备收到报文后,根据配置规则判断出报文所属的 VLAN 之后,再进行 VLAN 标记。 反过来说,交换设备确定最终的报文出接口后,需要将 VLAN 标记从帧中删除,这样主机收到的都是不带 VLAN 标记的以太网帧。
1. 接入链路
接入链路 (Access Link) 用于连接 VLAN 内主机和交换机的链路,主机发送和接受的帧都是 无标记帧。
2. 干道链路
干道链路 (Trunk Link) 用于交换机之间的互连或交换机与路由器之间的链路,干道链路可以承载多个不同 VLAN 数据,数据帧在干道链路传输时, 干道链路的对端设备需要能够识别数据帧属于哪个 VLAN,所以在干道链路上传输的都是 有标记帧。
两个作用:
- 报文中继: 将 VLAN 报文发送到互联的交换机 (改写 MAC 地址、IP 包头中的 TTL 和 Check Sum 校验码信息等操作)
- 干道承载: 一条 Trunk Link 可以传输多个 VLAN 报文
接口类型
1. Access 接口
交换机上用于连接主机的接口,只能连接 Access Link, 仅允许唯一的 VLAN ID 通过本接口,Access 接口发送到对端的以太网帧永远是不带 VLAN Tag 的帧。
2. Trunk 接口
交换机上用于连接其他交换机的接口,只能连接 Trunk Link,允许多个 有标记帧 (VLAN Tag) 通过。
3. Hybrid 接口
交换机上既可以连接主机,也可以连接其他交换机的接口,相当于 Access 接口和 Trunk 接口的混合体,同时可以连接 Access Link 和 Trunk Link, 并在出接口时将帧中的 VLAN Tag 剥离。
4. QinQ 接口
使用 QniQ 协议,可以给帧上打上双重 Tag (在已有的 Tag 上面再记录一层 Tag),从而支持 2^24 (4096*4096) 个 VLAN。
如图所示,外层的 Tag 通常被称作公网 Tag,用来存放公网的 VLAN ID。内层标签通常被称作内网 Tag,用来存放内网的 VLAN ID, 通过两者的组合,可以大幅度提升 VLAN 网络的数量。
不同接口对于帧的处理方式
当一个数据帧到达交换机接口时,如果是 无标记帧 (没有 VLAN Tag) 并且该接口上面配置了 PVID (Port Default VLAN ID),数据帧会自动被标记上接口的 PVID, 如果数据帧是 有标记帧 (包含 VLAN Tag), 即使接口上面配置了 PVID, 交换机也不会改变数据帧的 VLAN Tag。
不同的接口类型,交换机对于数据帧的处理过程也不同。
接口类型 | 有标记帧 | 无标记帧 | 发送帧过程 |
---|---|---|---|
Access 接口 | 当 VLAN ID 与 默认 VLAN ID 相同时,接收报文,否则丢弃报文 | 接收报文,并打上默认的 VLAN ID | 剥离帧的 PVID Tag, 然后发送 |
Trunk 接口 | 当 VLAN ID 位于接口允许通过的 ID 列表中,接收报文,否则丢弃报文 | 打上默认的 VLAN ID, 当默认的 VLAN ID 位于接口允许通过的 ID 列表中,接收该报文,否则丢弃该报文 | 当 VLAN ID 与默认 VLAN ID 相同并且位于接口允许通过的 ID 列表中,剥离 Tag 发送该报文 当 VLAN ID 与默认 VLAN ID 不同并且位于接口允许通过的 ID 列表中,保持 Tag 发送该报文 |
Hybrid 接口 | 当 VLAN ID 位于接口允许通过的 ID 列表中,接收报文,否则丢弃报文 | 打上默认的 VLAN ID, 当默认的 VLAN ID 位于接口允许通过的 ID 列表中,接收该报文,否则丢弃该报文 | 当 VLAN ID 位于接口允许通过的 ID 列表中,发送该报文 |
VLAN 访问方式
生成 VLAN 之后,主机的和交换设备之间的通信方式可以是固定不变的 (静态 VLAN),也可以根据交换设备每个端口所连接的计算机进行动态调整 (动态 VLAN)。
静态 VLAN
静态 VLAN 也可以称为基于端口的 VLAN, 交换机的端口可以划分一个或多个 VLAN, 这样一个交换机可以连接多个 VLAN, 并在这些 VLAN 之间进行数据转发。
VLAN 用于在二层交换机上面分割广播域,通过将一个交换机 (逻辑上) 分成多个交换机,将多个计算机隔离到不同的 VLAN 中, 这样交换机在收到广播帧后,只会转发到属于同一 VLAN 的其他端口,限制了广播的范围。
不足之处
由于需要单独指定端口,当内部主机超过一定数量时,指定端口的操作会变得十分繁琐,而且单个主机每次变更连接端口后,必须同时联动更改端口所属的 VLAN, 这无法满足拓扑结构经常变动的网络场景。
动态 VLAN
动态 VLAN 可以随时改变端口所属的 VLAN, 很好地弥补静态 VLAN 的不足,动态 VLAN 大致可以分为以下 3 类。
基于 MAC 地址划分
基于主机网卡的 MAC 地址来划分 VLAN, 网络管理员配置 MAC 地址和 VLAN ID 之间的映射关系,保存在 FDB 表中 (详细见附录),如果交换机收到了不带 VLAN Tag 的帧,就会根据 FDB 表为该帧添加对应的 VLAN Tag。
优点: 主机的数量或者物理位置发生变更时,不需要重新配置 VLAN, 提高了网络的灵活性 不足: 仅适用于网卡不经常发生变化、网络环境简单的场景,此外还需要预先定义网络中的所有主机,以便配置 MAC 地址和 VLAN ID 之间的映射关系
基于子网划分
基于主机的 IP 地址来划分 VLAN,如果交换机收到的是不带 VLAN Tag 的帧,根据报文中的源 IP 地址,确定添加的 VLAN ID。
优点: 将指定网段发出的报文在指定的 VLAN 传输,即使主机更换网卡或其他原因导致 MAC 地址发生变化也不受影响,只要 IP 地址不变就可以加入之前的 VLAN,提升管理灵活性 不足: 所有主机必须位于同一个网段
基于协议划分
基于数据帧所属的协议类型及封装格式来划分 VLAN, 网络管理员配置协议域和 VLAN ID 的映射关系表,如果交换机收到了不带 VLAN Tag 的帧, 就根据映射表给数据帧添加指定 VLAN Tag。然后数据帧将在指定 VLAN 中传输。
优点: 将协议与 VLAN 绑定,便于管理和维护 不足: 需要对所有协议类型和 VLAN ID 的映射表进行初始化配置,会有额外的性能开销
通信过程
同一 VLAN 同一交换机通信
这本质上就和 LAN 内部通信过程一样,这里不再赘述。
同一 VLAN 内跨交换机通信
当同一 VLAN 内的主机被连接在不同的交换机上时,需要交换机之间的接口可以识别和发送跨交换机的 VLAN 报文,也就是 Trunk Link。
如图所示,为了让 DeviceA 和 DeviceB 之间的链路同时支持 VLAN2 内的用户通信和 VLAN3 内 的用户通信,需要配置连接接口同时接入两个 VLAN, 也就是配置 DeviceA 的以太网接口 Port2 和 DeviceB 的以太网接口 Port1 同时加入 VLAN2 和 VLAN3。
UserA 发送数据到 UserB 的过程:
- 数据帧首先到达 DeviceA 的 Port4 接口
- Port4 给数据帧加上 VLAN Tag, 其中 VLAN ID 的值为 2 (VLAN2)
- DeviceA 查询 MAC 表中是否存在目的 MAC 地址为 DeviceB 的转发表项
- 如果存在,DeviceA 将数据帧转发给 Port2
- 如果不存在,DeviceA 会将数据帧发送到本设备上除 Port4 接口外的所有属于 VLAN2 的接口 (类似于发起一次广播),通过应答学习 DeviceB 并记录到 MAC 表中
- 接口 Port2 将数据帧发送到 DeviceB
- DeviceB 接收到数据帧之后,会查询 MAC 表中是否存在目的 MAC 地址为 UserB 的转发表项
- 如果存在,DeviceB 会将数据帧发送给 Port3
- 如果不存在,DeviceB 会将数据帧发送到本设备上除 Port1 接口外的所有属于 VLAN2 的接口 (类似于发起一次广播),通过应答学习 UserB 并记录到 MAC 表中
- Port3 将数据帧发送给 UserB
不同 VLAN 之间通信
VLAN 生成的逻辑上的交换机之间是无法进行通信的,因为 VLAN 实现的是逻辑隔离,为了跨 VLAN 通信,必须借助路由器或三层交换机来完成 (三层子接口)。
为什么不同 VLAN 之间不通过路由就无法通信呢? 因为 LAN 内的通信必须在数据帧头中指定通信目标的 MAC 地址, 而为了获取 MAC 地址,会通过 ARP 协议发起广播,如果广播报文无法到达,自然也就无法解析 MAC 地址,进行后面的通信了。
三层子接口
如图所示,DeviceA 是支持配置子接口的三层设备,DeviceB 是二层交换设备,LAN 通过 DeviceB 的以太网接口与 DeviceA 的以太网接口连接, LAN 内部的主机被划分为两个 VLAN: VLAN2 和 VLAN3, 可以通过如下配置实现不同 VLAN 之间通信:
- 在 DeviceA 的以太网接口创建 2 个三层子接口: Port1 和 Port2,并配置 802.1Q 协议封装与 VLAN2 和 VLAN3 分别对应
- 配置三层子接口的 IP 地址,保证两个三层子接口对应的 IP 地址路由正常
- 将 DeviceA 和 DeviceB 连接的以太网接口类型配置为 Trunk 或者 Hybrid 类型,允许 VLAN2 和 VLAN3 的数据帧正常通过
- 将主机的默认网关设置为所属 VLAN 对应的三层子接口的 IP 地址
完成上面的配置之后,Host A 和 Host C 的通信过程如下:
- Host A 比较自己和 Host C 的所在网段,发现 Host C 和自己不在同一个子网
- Host A 发送 ARP 请求到网关 DeviceA, 获取网关的 MAC 地址
- DeviceA 收到 ARP 请求之后返回应答报文,报文中的源 MAC 地址等于 VLAN2 对应的三层子接口的 MAC 地址
- Host A 学习网关的 MAC 地址
- Host A 发送报文到网关,其中目的 MAC 地址为三层子接口的 MAC 地址,目的 IP 为 Host C 的 IP 地址
- DeviceA 收到报文后进行三层转发,发现目的 Host C 的 IP 地址为直连路由,报文通过 VLAN3 对应的三层子接口进行转发
- DeviceA 作为 VLAN3 内部主机的网关,向 VLAN3 内部发送一个广播,请求 Host C 的 MAC 地址
- Host C 收到 ARP 请求之后返回应答报文
- 网关收到 Host C 的应答之后,就把 Host A 的报文发送给 Host C
- Host A 后续发送给数据包,都需要先经过网关,由网关做三层转发
VLANIF 接口
三层交换技术: 将路由技术与交换技术合二为一,在交换机内部实现了路由,提高了网络的整体性能。
VLANIF 接口产生背景:
三层交换机通过路由表传输数据流时,如果该数据流是首次传输,会产生一个 MAC 地址与 IP 地址的映射表,当同样的数据流再次传输时,将根据映射表直接通过二层网络传输而不是三层网络, 消除了路由器进行路由选择而造成的网络延迟,提高了数据包转发效率。
为了保证数据流首次通过路由表时能够正常转发,路由表中必须有正确的路由表项,因此必须在三层交换机上部署三层接口和路由协议,实现三层路由可达,VLANIF 接口由此而产生, VLANIF 接口是三层逻辑接口,可以部署在三层交换机上,也可以部署在路由器上。
如图所示,交换机划分了 2 个 VLAN: VLAN2 和 VLAN3,可以通过下面的配置实现 VLAN 间互通:
- 在 Device 上创建 2 个 VLANIF 接口并配置 VLANIF 接口的 IP 地址,保证两个 VLANIF 接口对应的 IP 地址路由可通
- 将主机的默认网关设置为所属 VLAN 对应的 VLANIF 接口 的 IP 地址
完成上面的配置之后,User A 和 User C 的通信过程如下:
- User A 比较自己和 User C 的所在网段,发现 User C 和自己不在同一个子网
- User A 发送 ARP 请求到网关 Device, 获取网关的 MAC 地址
- Device 收到 ARP 请求之后返回应答报文,报文中的源 MAC 地址等于 VLANIF2 的 MAC 地址
- User A 学习网关的 MAC 地址
- User A 发送报文到网关,其中目的 MAC 地址为 VLANIF2 的 MAC 地址,目的 IP 为 User C 的 IP 地址
- Device 收到报文后进行三层转发,发现目的 User C 的 IP 地址为直连路由,报文通过 VLANIF3 对应的三层子接口进行转发
- Device 作为 VLAN3 内部主机的网关,向 VLAN3 内部发送一个广播,请求 User C 的 MAC 地址
- User C 收到 ARP 请求之后返回应答报文
- 网关收到 User C 的应答之后,就把 User A 的报文发送给 User C
- User A 后续发送给数据包,都需要先经过网关,由网关做三层转发
VLAN 局限性
1. VLAN ID 数量太少
VLAN Tag 中只有 12 位能用来存储 VLAN ID,最多可以提供 2^12 = 4096 个虚拟网络,这对于大型数据中心和多租户需求来说是远远不够的。
2. 跨网络访问
VLAN 作为二层网络技术,在需要跨网络访问的场景下 (例如两个独立数据中心) 依然需要通过三层网络传递,这时传递 VLAN Tag 会比较繁琐 (需要额外的协议帧来封装), 此外在虚拟化场景中,虚拟机和容器会有较大的量级并且每个虚拟机都有独立的 IP 地址和 MAC 地址,会给交换机带来较大的压力。
如何解决?
针对上面提到的这些问题,需要一个新的协议来作为解决方案,那就是 VXLAN 。
附录
FDB 表
在典型的交换机中,MAC 地址和 VLAN ID 之间的映射关系通常保存在交换机的 FDB 表 (Forwarding Database Table) 中。
字段 | 说明 |
---|---|
MAC 地址 | 数据帧中源设备的 MAC 地址 (也可以用于反向查询目标 MAC 地址) |
VLAN ID | 与 MAC 地址相关联的 VLAN ID |
端口 | 数据帧中源设备的端口号 |
当交换机收到一个数据帧时,它会检查数据帧的源 MAC 地址,并在 FDB 表中查找对应的条目。如果找到了匹配的条目,交换机就会根据表中的信息 (通过反向查找) 将数据帧转发到目标 MAC 地址端口。 如果在 FDB 表中找不到匹配的条目,交换机可能会通过广播机制向所有端口发送数据帧,以便学习 MAC 地址和端口的映射关系。
FDB 表通过记录每个已知的 MAC 地址和与之相关联的 VLAN ID,以及对应的端口信息,这样就可以决定在接收到数据帧时应该将其转发到哪个端口,确保数据帧被正确发送到目标设备。