第 03 篇:VLAN(802.1Q)详解——网工必会的虚拟局域网隔离与实战
系列文章入口如下:
网工进阶必看:《从TCP/IP到AI智算网络》系列总目录(持续更新)-CSDN博客
一、VLAN 全称是什么
VLAN = Virtual Local Area Network,虚拟局域网。
IEEE 802.1Q 是它的标准编号。简单说:在一条物理网线上,用"标签"把流量逻辑隔离成多个独立的广播域。
二、为什么需要 VLAN
上一篇文章我们讲了 ARP——设备靠广播"喊话"找 MAC 地址。但你想想:
如果一个公司 200 台电脑全接在同一台交换机上,每台开机都要发 ARP 广播、DHCP 广播、NetBIOS 广播……200 台机器每台每秒都在"喊",整个网络就是个菜市场。
现实中的痛点:
| 痛点 | 没有 VLAN 的世界 | 有 VLAN 之后 |
| 广播风暴 | 所有人挤在一个广播域,广播包满天飞 | 广播被限制在各自的 VLAN 内,互不影响 |
| 安全隔离 | 财务部、研发部、访客全在同一网段,谁都能访问谁 | 不同 VLAN 之间默认不通,像隔了堵墙 |
| 灵活组网 | 换部门要重新布线、换交换机端口 | 逻辑上改个 VLAN ID 就行,物理位置不变 |
| IP 地址浪费 | 一个大局域网要塞几百个 IP | 每个 VLAN 独立子网,IP 规划清晰 |
一句话总结:VLAN 解决的是"如何在共享的物理网络上,逻辑上划分出多个互不干扰的独立网络"的问题。
三、协议原理和交互过程
3.1 快递类比:一栋楼里的不同公司
想象一栋写字楼,只有一部电梯(物理交换机),但楼里租了三家公司:
- A 公司(财务部):工位 101–110
- B 公司(研发部):工位 201–210
- C 公司(访客):工位 301–310
快递员(数据帧)坐电梯上楼,到了楼层怎么知道该送哪个公司?
现实做法:每个公司的快递贴上不同颜色的标签——红色给 A、蓝色给 B、绿色给 C。前台只看颜色,不是自己公司的直接拒收。
VLAN 就是给以太网帧贴"颜色标签"。
3.2 Ethernet II 帧怎么"贴标签"
回忆第 01 篇讲的 Ethernet II 帧结构:

802.1Q 的做法是:在"源 MAC"和"类型"之间,硬塞进去 4 个字节的标签(Tag):

TPID(Tag Protocol Identifier)= 0x8100:告诉交换机"我这个帧带 VLAN 标签了"。
TCI(Tag Control Information) 里面最关键的是 VID(VLAN ID)——占 12 位,所以 VLAN 编号范围是 1~4094(0 和 4095 保留)。
3.3 交换机怎么处理带标签的帧
交换机端口有三种角色:

Access 端口的工作流程(最常见):
PC1 (VLAN 10) ──→ [交换机 Access 端口]
│
├─ 收到无标签帧 → 打上 VID=10 的标签 → 内部转发
│
├─ 查 MAC 表 → 找到目的端口
│
└─ 从另一个 Access 端口发出 → 剥掉标签 → PC2 收到
Trunk 端口的工作流程(交换机互联):
交换机A ──Trunk── 交换机B
│ │
├─ VLAN 10 帧 ──→ 带标签(VID=10) ──→ 交换机B 按标签转发
├─ VLAN 20 帧 ──→ 带标签(VID=20) ──→ 交换机B 按标签转发
└─ 所有 VLAN 共用一条物理链路
3.4 跨 VLAN 通信:为什么默认不通
关键结论:不同 VLAN 之间默认二层不通。
原因很简单:ARP 广播只在本 VLAN 内传播,不会跨 VLAN 转发。PC1(VLAN 10)喊"谁是 192.168.10.1",VLAN 20 里的设备根本听不到。
要跨 VLAN 通信,必须靠 三层设备(路由器或三层交换机)做 VLAN 间路由(Inter-VLAN Routing):
PC1 (VLAN10, 192.168.10.10)
│
▼
[交换机] ──Trunk── [路由器/三层交换机] ──Trunk── [交换机]
▲ │
│ ▼
PC2 (VLAN20, PC3 (VLAN20, 192.168.20.20)
192.168.10.20)
路由器给每个 VLAN 配一个子接口(或三层交换机配 SVI),充当各 VLAN 的网关,数据包经网关转发。
四、VMware 实际抓包测试
4.1 实验环境准备
| 项目 | 配置 |
| 虚拟机 | 两台 Ubuntu 22.04 桌面版 |
| VMware 网络 | 两台均设为"自定义:VMnet1(仅主机)" |
| Host A | IP: 192.168.95.128/24 |
| Host B | IP: 192.168.95.130/24 |
| 抓包工具 | Wireshark(装在 Ubuntu 上) |
注意:VMware Workstation 的虚拟交换机(vmnet)不支持 802.1Q 标签透传给虚拟机。也就是说,你在 Ubuntu 里配了 VLAN 子接口,发出的带标签帧到了 VMware 虚拟交换机就会被剥掉或丢弃。
所以本实验的核心验证点是:在 Ubuntu 内用 Wireshark 观察 VLAN 子接口的行为,以及验证"同 VLAN 通、不同 VLAN 不通"的逻辑。
4.2 步骤一:创建 VLAN 子接口
在 Host A 上:
# 加载 8021q 内核模块
sudo modprobe 8021q
# 确认模块已加载
lsmod | grep 8021q

# 创建 VLAN 10 子接口(基于 ens33)
sudo ip link add link ens33 name ens33.10 type vlan id 10
# 给子接口配 IP
sudo ip addr add 192.168.10.128/24 dev ens33.10
# 启动子接口
sudo ip link set ens33.10 up
# 查看
ip addr show ens33.10
输出应类似:

在 Host B 上做同样操作,但 IP 改为 192.168.10.130/24。
4.3 步骤二:验证同 VLAN 互通(在VMware无法验证vlan接口能力)
# 从 Host A ping Host B(通过 VLAN 子接口)
ping -I ens33.10 -c 1 192.168.10.130
结果分析:
- 如果两台虚拟机直连同一 VMnet(仅主机模式),且 VMware 不剥离 VLAN 标签,则能通。
- 实际情况:VMware Workstation 的虚拟交换机通常会剥离 802.1Q 标签,所以 ens33.10 发出的带标签帧到对端后被剥掉标签,对端 ens33.10 收不到带标签帧,ping 不通。你可以用 Wireshark 在发送端抓 ens33 接口验证——如果只能看到 Ethernet II 而没有 802.1Q 层,说明标签在发出去之前就被虚拟交换机处理了。

- 但是ping ens33,非子接口ip确实通的,为什么呢?

核心问题:VMware底层网段冲突 + 标签被剥离
- 对端底层配了95网段:.130机器底层 ens33 配了 192.168.95.130/24,而 ens33.10 配了 192.168.10.130/24。
- 历史ARP已印证:上一轮.128机器上 arp -n 显示,它已经解析到了.130底层的MAC(00:50:56:37:cb:08)在 ens33(95网段)上,但10网段是 (incomplete)。
- VMware剥标签的致命影响:当.128通过 ens33.10(VLAN 10)发ARP广播时,VMware虚拟交换机剥离了802.1Q标签。对端收到无标签包后,因为底层 ens33 是通的(95网段),但内核期望 ens33.10 收到带标签的包,无标签包被底层接收后无法交给 ens33.10,导致10网段ARP永远无响应。
为什么底层95通,VLAN 10却不通?
- 你的两台机器底层其实在同一个VMware虚拟网络(能互相ARP解析95网段)。
- 但VLAN实验要求二层隔离。VMware Workstation的虚拟交换机不支持标签透传,导致:
- 带标签发出 → 被VMware剥离 → 对端收到无标签 → 对端 ens33.10 收不到(因为它要标签) → ARP失败。
- 对端底层 ens33 收到了,但IP是95网段,不处理10网段的ARP请求。
4.4 步骤五:清除 VLAN 子接口(实验完恢复)
sudo ip link delete ens33.10
五、故障排查
5.1 VLAN 不通的六大常见原因
| 故障现象 | 可能原因 | 排查方法 |
| 同 VLAN 内 ping 不通 | Access 端口 VLAN ID 配错 | 检查端口 PVID 是否和终端 VLAN 一致 |
| 跨 VLAN 不通 | 没有三层路由/网关没配 | 检查路由器子接口或三层交换机 SVI 是否 UP |
| Trunk 链路不通 | Trunk 允许的 VLAN 列表没包含目标 VLAN | show interfaces trunk 看 allowed VLANs |
| 能 ping 通但抓不到标签 | 交换机 Access 端口发出时剥了标签 | 正常行为,Access 口对终端剥标签 |
| 虚拟机 VLAN 子接口不通 | VMware 虚拟交换机剥离 802.1Q 标签 | 正常行为,VMware Workstation 不支持标签透传 |
| ARP 显示 incomplete | 对端不在同一 VLAN 或接口 DOWN | ip link show 确认子接口 UP,arp -n 看状态 |
5.2 排障速查流程
不通了?按这个顺序查:
1. 物理层:接口 UP 了吗?有 RUNNING 吗?
→ ip link show ens33
2. VLAN 子接口:创建了?UP 了吗?
→ ip addr show ens33.10
3. IP 配了吗?同网段吗?
→ ip addr show | grep inet
4. ARP 能解析吗?
→ arp -n (看有没有 MAC,状态是不是 REACHABLE)
5. 对端在同一 VLAN 吗?
→ 确认两端 VLAN ID 一致
6. 中间交换机 Trunk 放行了吗?
→ 检查 Trunk allowed VLAN 列表
5.3 一个真实排障案例
现象:两台服务器配了 VLAN 子接口,IP 同网段,但 ping 不通。
排查:用 Wireshark 抓 ens33 接口,过滤 vlan,发现发出的帧带 VLAN 10 标签,但对端交换机端口是 Access 口配的 VLAN 20。
原因:服务器发出的带标签帧(VID=10)到了 Access 端口,交换机期望的是无标签帧或 VID=20 的帧,直接丢弃。
解决:把交换机端口改为 Trunk,允许 VLAN 10 通过;或者服务器改为无标签模式(由交换机 Access 口打标签)。
六、总结
| 要点 | 说明 |
| VLAN 是什么 | 在一条物理链路上用 802.1Q 标签逻辑隔离出多个广播域 |
| 标签格式 | TPID (0x8100) + TCI(含 12 位 VLAN ID,范围 1-4094) |
| 端口类型 | Access(连终端,剥标签)、Trunk(交换机互联,保留标签) |
| 跨 VLAN 通信 | 默认不通,需要三层路由(路由器子接口或三层交换机 SVI) |
| 广播隔离 | 每个 VLAN 是独立广播域,ARP 广播不跨 VLAN |
| VMware 限制 | Workstation 虚拟交换机不支持 802.1Q 标签透传,实验仅验证逻辑 |
下一篇预告
第 04 篇:LLDP(802.1AB)—— 交换机之间的"自我介绍协议"
VLAN 解决了"一台交换机隔出多个房间"的问题,但交换机之间怎么知道对端是谁、对端支持哪些 VLAN、链路带宽多少、邻居设备是什么型号?如果网络出故障,你总不能一台一台登录设备去查邻居关系吧。LLDP(Link Layer Discovery Protocol)就是让网络设备每隔几十秒自动"广播名片"的协议——不依赖 IP、不走 TCP/IP 栈,纯二层运作。下篇讲 LLDP 报文结构、与 CDP 的区别、VMware 里怎么模拟多交换机拓扑抓包观察邻居发现过程。
附录:命令速查
| 操作 | 命令 |
| 加载 802.1Q 模块 | sudo modprobe 8021q |
| 创建 VLAN 子接口 | sudo ip link add link ens33 name ens33.10 type vlan id 10 |
| 删除 VLAN 子接口 | sudo ip link delete ens33.10 |
| 查看 VLAN 配置 | cat /proc/net/vlan/config |
| 查看 VLAN 接口详情 | cat /proc/net/vlan/ens33.10 |
| 抓 VLAN 包 | sudo wireshark &(过滤条件填 vlan) |
| 查看 ARP 表 | arp -n |
| 清 ARP 缓存 | sudo ip neigh flush dev ens33 |
| 永久配置 VLAN(netplan) | 在 /etc/netplan/*.yaml 中配置 vlans: 字段 |
| 查看接口状态 | ip link show |
| 查看 IP 配置 | ip addr show |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)