惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 布谷鸟过滤器 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading 布谷鸟过滤器 Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式
为什么需要 VLAN 网络
2023-01-05 · via 蛮荆

2023-01-05 计算机网络

概述

VLAN (Virtual Local Area Network) 是一种逻辑上将单个物理局域网 (LAN) 划分为多个虚拟局域网的技术。每个 VLAN 是一个独立的广播域, 允许网络管理员根据组织结构、功能、部门或其他标准将网络设备划分为逻辑组。

和子网的关系

VLAN 和子网的关系

解决了哪些问题?

1. 广播域分割和控制

每个 VLAN 形成一个独立的广播域,减少了广播帧传递的范围 (如 ARP、DHCP、RIP 都会产生广播帧),减少了二层网络中的广播风暴问题,并提高网络性能。

2. 逻辑划分和安全隔离

VLAN 允许网络管理员根据项目、功能或其他标准对网络进行逻辑划分,这对于大型组织来说是必需,同时也可以根据安全需求将设备划分为不同的逻辑分组,这样就可以隔离敏感系统功能、操作和数据。

3. 灵活性和管理简化

VLAN 允许网络管理员根据需要重新配置网络逻辑拓扑结构,而无需更改物理布线,提高了网络灵活性,同时简化了网络管理和维护。

使用场景

1. 数据中心网络和服务商

在数据中心中,可以利用 VLAN 网络隔离虚拟机、存储和其他资源,服务商也可以利用 VLAN 将不同租户的流量进行隔离,确保安全性和隐私。

2. 组织网络

在组织网络中 (例如企业网络和校园网络),可以利用 VLAN 将不同楼层、部门、项目划分到不同的逻辑网络中,实现安全隔离和流量控制。


802.1Q 标准

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 交换网络中,会存在以下两种格式的以太网帧:

  1. 有标记帧: 加了 4 字节 802.1Q Tag 的帧
  2. 无标记帧: 未加 4 字节 802.1Q Tag 的原始帧

链路类型

VLAN 内的主机不需要知道 VLAN 的存在,发出的是无标记的帧报文,交换设备收到报文后,根据配置规则判断出报文所属的 VLAN 之后,再进行 VLAN 标记。 反过来说,交换设备确定最终的报文出接口后,需要将 VLAN 标记从帧中删除,这样主机收到的都是不带 VLAN 标记的以太网帧。

Access Link 和 Trunk Link

1. 接入链路

接入链路 (Access Link) 用于连接 VLAN 内主机和交换机的链路,主机发送和接受的帧都是 无标记帧

2. 干道链路

干道链路 (Trunk Link) 用于交换机之间的互连或交换机与路由器之间的链路,干道链路可以承载多个不同 VLAN 数据,数据帧在干道链路传输时, 干道链路的对端设备需要能够识别数据帧属于哪个 VLAN,所以在干道链路上传输的都是 有标记帧

两个作用:

  1. 报文中继: 将 VLAN 报文发送到互联的交换机 (改写 MAC 地址、IP 包头中的 TTL 和 Check Sum 校验码信息等操作)
  2. 干道承载: 一条 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。

QniQ 帧格式

如图所示,外层的 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 的不足,动态 VLAN 大致可以分为以下 3 类。

基于 MAC 地址划分

VLAN 静态换分

基于主机网卡的 MAC 地址来划分 VLAN, 网络管理员配置 MAC 地址和 VLAN ID 之间的映射关系,保存在 FDB 表中 (详细见附录),如果交换机收到了不带 VLAN Tag 的帧,就会根据 FDB 表为该帧添加对应的 VLAN Tag。

优点: 主机的数量或者物理位置发生变更时,不需要重新配置 VLAN, 提高了网络的灵活性 不足: 仅适用于网卡不经常发生变化、网络环境简单的场景,此外还需要预先定义网络中的所有主机,以便配置 MAC 地址和 VLAN ID 之间的映射关系

基于子网划分

VLAN 静态换分

基于主机的 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。

Trunk Link

如图所示,为了让 DeviceA 和 DeviceB 之间的链路同时支持 VLAN2 内的用户通信和 VLAN3 内 的用户通信,需要配置连接接口同时接入两个 VLAN, 也就是配置 DeviceA 的以太网接口 Port2 和 DeviceB 的以太网接口 Port1 同时加入 VLAN2 和 VLAN3。

UserA 发送数据到 UserB 的过程:

  1. 数据帧首先到达 DeviceA 的 Port4 接口
  2. Port4 给数据帧加上 VLAN Tag, 其中 VLAN ID 的值为 2 (VLAN2)
  3. DeviceA 查询 MAC 表中是否存在目的 MAC 地址为 DeviceB 的转发表项
    • 如果存在,DeviceA 将数据帧转发给 Port2
    • 如果不存在,DeviceA 会将数据帧发送到本设备上除 Port4 接口外的所有属于 VLAN2 的接口 (类似于发起一次广播),通过应答学习 DeviceB 并记录到 MAC 表中
  4. 接口 Port2 将数据帧发送到 DeviceB
  5. DeviceB 接收到数据帧之后,会查询 MAC 表中是否存在目的 MAC 地址为 UserB 的转发表项
    • 如果存在,DeviceB 会将数据帧发送给 Port3
    • 如果不存在,DeviceB 会将数据帧发送到本设备上除 Port1 接口外的所有属于 VLAN2 的接口 (类似于发起一次广播),通过应答学习 UserB 并记录到 MAC 表中
  6. 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 的通信过程如下:

  1. Host A 比较自己和 Host C 的所在网段,发现 Host C 和自己不在同一个子网
  2. Host A 发送 ARP 请求到网关 DeviceA, 获取网关的 MAC 地址
  3. DeviceA 收到 ARP 请求之后返回应答报文,报文中的源 MAC 地址等于 VLAN2 对应的三层子接口的 MAC 地址
  4. Host A 学习网关的 MAC 地址
  5. Host A 发送报文到网关,其中目的 MAC 地址为三层子接口的 MAC 地址,目的 IP 为 Host C 的 IP 地址
  6. DeviceA 收到报文后进行三层转发,发现目的 Host C 的 IP 地址为直连路由,报文通过 VLAN3 对应的三层子接口进行转发
  7. DeviceA 作为 VLAN3 内部主机的网关,向 VLAN3 内部发送一个广播,请求 Host C 的 MAC 地址
  8. Host C 收到 ARP 请求之后返回应答报文
  9. 网关收到 Host C 的应答之后,就把 Host A 的报文发送给 Host C
  10. Host A 后续发送给数据包,都需要先经过网关,由网关做三层转发

VLANIF 接口

三层交换技术: 将路由技术与交换技术合二为一,在交换机内部实现了路由,提高了网络的整体性能。

VLANIF 接口产生背景:

三层交换机通过路由表传输数据流时,如果该数据流是首次传输,会产生一个 MAC 地址与 IP 地址的映射表,当同样的数据流再次传输时,将根据映射表直接通过二层网络传输而不是三层网络, 消除了路由器进行路由选择而造成的网络延迟,提高了数据包转发效率

为了保证数据流首次通过路由表时能够正常转发,路由表中必须有正确的路由表项,因此必须在三层交换机上部署三层接口和路由协议,实现三层路由可达,VLANIF 接口由此而产生, VLANIF 接口是三层逻辑接口,可以部署在三层交换机上,也可以部署在路由器上。

通过 VLANIF 接口实现VLAN间的通信

如图所示,交换机划分了 2 个 VLAN: VLAN2 和 VLAN3,可以通过下面的配置实现 VLAN 间互通:

  • 在 Device 上创建 2 个 VLANIF 接口并配置 VLANIF 接口的 IP 地址,保证两个 VLANIF 接口对应的 IP 地址路由可通
  • 将主机的默认网关设置为所属 VLAN 对应的 VLANIF 接口 的 IP 地址

完成上面的配置之后,User A 和 User C 的通信过程如下:

  1. User A 比较自己和 User C 的所在网段,发现 User C 和自己不在同一个子网
  2. User A 发送 ARP 请求到网关 Device, 获取网关的 MAC 地址
  3. Device 收到 ARP 请求之后返回应答报文,报文中的源 MAC 地址等于 VLANIF2 的 MAC 地址
  4. User A 学习网关的 MAC 地址
  5. User A 发送报文到网关,其中目的 MAC 地址为 VLANIF2 的 MAC 地址,目的 IP 为 User C 的 IP 地址
  6. Device 收到报文后进行三层转发,发现目的 User C 的 IP 地址为直连路由,报文通过 VLANIF3 对应的三层子接口进行转发
  7. Device 作为 VLAN3 内部主机的网关,向 VLAN3 内部发送一个广播,请求 User C 的 MAC 地址
  8. User C 收到 ARP 请求之后返回应答报文
  9. 网关收到 User C 的应答之后,就把 User A 的报文发送给 User C
  10. 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,以及对应的端口信息,这样就可以决定在接收到数据帧时应该将其转发到哪个端口,确保数据帧被正确发送到目标设备。

Reference