亲密的网络旅程番外篇:亲手“造”出一个 VLAN 标签——从 Linux 命令行到 Wireshark 抓包的全流程实战
之前的解析中,关于“如何在真实世界看见 VLAN”的部分确实过于简略,更像是“功能介绍”而非“实操指南”。
现在,让我们专门围绕这个核心主题,从Linux 命令行操作到Wireshark 抓包验证,展开一篇完整、详尽的实战文章。这篇文章将完全以“手把手带你做一次验证”的视角来组织。
亲密的网络旅程番外篇:亲手“造”出一个 VLAN 标签——从 Linux 命令行到 Wireshark 抓包的全流程实战
引言:理论再好,不如亲手验证
我们在前面的章节中,深入理解了 802.1Q VLAN 的机制,知道了它通过在以太网帧中插入一个 4 字节的标签,将单根物理网线划分成多个逻辑网络。
但是,这些标签真的存在吗?
还是说,它们只是教科书里的理论模型?当你打开 Wireshark 时,你真的能“亲眼看到”那个 4 字节的“身份证”吗?
答案是肯定的。但仅仅看截图是不够的。你需要亲手操作——亲手“造”一个 VLAN 标签,亲手“发”一个带有 VLAN 标签的数据包,再亲手“抓”到它、“解析”它。
这一章,我们就来做这件事。我们不需要昂贵的交换机,不需要复杂的配置。你只需要一台装有 Linux 系统(如 Ubuntu、CentOS)的电脑,以及 Wireshark 即可。
让我们开始吧。
第一部分:准备工作——环境与工具
1.1 你需要什么?
- 一台 Linux 机器:你可以是实体机,也可以是虚拟机(如 VirtualBox、VMware)。推荐使用 Ubuntu 或 CentOS。
- Wireshark:用于抓包和解析数据。在 Linux 中,可以通过
sudo apt install wireshark(Ubuntu)或sudo yum install wireshark(CentOS)安装。 - 网络接口:你需要一个可用的物理网卡或虚拟网卡,比如
eth0或ens33。接下来的操作会在一个独立的接口上进行,不会影响你的正常上网。
1.2 确认你的网络接口
首先,查看你当前可用的网络接口。打开终端,输入以下命令:
iplinkshow你会看到类似这样的输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:ab:cd:ef brd ff:ff:ff:ff:ff:ff在这个例子中,ens33是你的主物理网卡。我们将使用它来创建 VLAN 接口。注意:确保你的网卡处于UP状态(即已连接并启用)。
第二部分:Linux 中的“魔法”——vconfig 命令详解
我们之前在理论中提到了vconfig。现在,让我们实地使用它。
2.1 安装 vconfig
在 Ubuntu/Debian 系统中,vconfig属于vlan包,需要额外安装:
sudoaptinstallvlan在 CentOS/RHEL 系统中,它通常包含在vconfig包中:
sudoyuminstallvconfig安装完成后,可以通过vconfig -h查看帮助信息,确认安装成功。
2.2 创建 VLAN 接口
假设我们要在物理网卡ens33上创建一个VLAN ID 为 10的虚拟接口。
输入以下命令:
sudovconfigaddens3310这个命令做了什么?
vconfig:调用 VLAN 配置工具。add:表示“添加”一个 VLAN 接口。ens33:指定要依附的物理网卡。10:指定 VLAN ID(范围 1-4094)。
执行后,终端会返回:
Added VLAN with VID == 10 to IF -:ens33:-此时,系统会在ens33上创建一个名为ens33.10的虚拟接口。
你可以再次运行ip link show,你会发现一个新的接口出现了:
3: ens33.10@ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 00:0c:29:ab:cd:ef brd ff:ff:ff:ff:ff:ff注意:此时ens33.10的状态还是DOWN(关闭),它还没有被激活。
2.3 激活 VLAN 接口
要让ens33.10真正工作,我们需要将它“激活”。
sudoiplinksetens33.10 up或者使用:
sudoifconfigens33.10 up现在再次运行ip link show ens33.10,你会看到状态变成了UP。
3: ens33.10@ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:ab:cd:ef brd ff:ff:ff:ff:ff:ff补充说明:你也可以使用vlan包中提供的另一个命令vconfig的set_flag选项来激活接口,但ip link set ... up是更通用的方法。
2.4 给 VLAN 接口分配 IP(可选)
为了让这个 VLAN 接口能被“使用”,我们可以给它分配一个 IP 地址。
sudoipaddradd192.168.10.1/24 dev ens33.10或者:
sudoifconfigens33.10192.168.10.1 netmask255.255.255.0注意:这个 IP 地址仅用于测试,它与物理网卡ens33的 IP 是独立的。这意味着,你可以让ens33连接互联网,而ens33.10连接一个完全不同的 VLAN 网络。
第三部分:Wireshark 中的“读卡”——捕获并验证 VLAN 标签
现在,我们有了一个可以发送 VLAN 标签的接口ens33.10。接下来,我们要用它发送一个数据包,并通过 Wireshark 捕获它,亲眼验证 VLAN 标签的存在。
3.1 启动 Wireshark 监听
- 打开 Wireshark(需要 root 权限或属于 wireshark 用户组)。
- 在接口列表中,选择你的物理网卡
ens33(注意:不是ens33.10,因为 VLAN 标签是在物理网卡上“实时”生成的,我们必须在物理层捕获它)。 - 点击“开始捕获”(蓝色的鲨鱼鳍图标)。
3.2 发送测试数据包
我们不需要发送复杂的 HTTP 请求,最简单的测试方法是使用ping命令。但ping通常使用icmp协议,我们需要确保它通过ens33.10接口发送。
打开另一个终端窗口,输入:
ping-Iens33.10192.168.10.2解释:
-I ens33.10:指定通过ens33.10接口发送数据包。192.168.10.2:假设这是一个在相同 VLAN 中的目标 IP(你可以使用你自己的测试 IP,或者将目标设为192.168.10.255进行广播)。
如果你没有目标 IP,也可以使用arping发送 ARP 请求(这种方式更简单,因为 ARP 帧通常较小):
sudoarping-Iens33.10192.168.10.2或者直接发送一个广播包:
ping-Iens33.10-c1-b192.168.10.2553.3 在 Wireshark 中寻找“幽灵”
当你执行ping或arping命令时,Wireshark 的窗口会迅速滚动,显示捕获到的数据包。
我们需要找到我们发出的那个数据包。由于我们使用ens33.10发送,且目标为192.168.10.2,我们在 Wireshark 的过滤器中输入以下过滤条件:
icmp或者(如果你只发了 ARP):
arp观察:
在 Wireshark 的“数据包列表”窗格中,你应该会看到一个来自192.168.10.1发往192.168.10.2的数据包。
关键步骤:选中这个数据包,在“数据包详细信息”窗格(中间的窗口)中,展开Ethernet II这一行。
3.4 发现“VLAN 身份证”
在Ethernet II下面,你会看到类似这样的结构:
Ethernet II, Src: 00:0c:29:ab:cd:ef, Dst: ... Destination: ... Source: ... Type: 802.1Q Virtual LAN (0x8100)关键点:
Type: 802.1Q Virtual LAN (0x8100):这是 Wireshark 告诉你的重要信息——这不是一个普通的以太网帧,它包含 VLAN 标签。- 继续展开
802.1Q Virtual LAN这一行,你会看到:
802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 10 Priority: 0 (Best Effort) DEI: 0 ID: 10 (VLAN ID)“证据”出现了!
- ID: 10:这正是我们在
vconfig中指定的 VLAN 10。 - PRI: 0:这是默认的优先级。
- DEI: 0:这是一个可丢弃标志位。
结论:Wireshark 成功地解析出了这个 4 字节的 VLAN 标签。
3.5 深入底部:查看原始字节
在 Wireshark 的“数据包字节”窗格(最底部的窗口),你会看到原始的十六进制数据。在以太网头部之后,你应该能看到:
81 00 00 0a81 00:对应0x8100,即 VLAN 标签的 TPID。00 0a:0a(十进制为 10)是 VID,00是 PCP + DEI。
这就是 VLAN 标签在物理线上的真实“模样”。这就是我们在理论中提到的“魔法 4 字节”。
第四部分:深入实验——验证不同 VLAN 的隔离性
为了更透彻地理解,我们可以做一个“控制变量”实验:在没有 VLAN 标签的情况下,看同一个数据包如何被解析。
4.1 发送不带 VLAN 标签的普通帧
首先,停止正在进行的ping操作。然后,使用物理网卡ens33发送一个普通的ping包:
ping-Iens33192.168.1.1(假设你的主网络 192.168.1.1 是你的网关)
在 Wireshark 中过滤icmp,你会看到这个包。展开它的Ethernet II头部,你会发现:
Type: IPv4 (0x0800)没有0x8100,没有 VLAN 标签。它就是一个标准的以太网帧。
4.2 直观对比
| 帧类型 | Type 字段 | VLAN 标签 | 解释 |
|---|---|---|---|
| 标准以太网帧 | 0x0800(IP) | 无 | 这是最常见的普通数据包 |
| VLAN 标记帧 | 0x8100(VLAN) | 4 字节 | 包含 VID=10,PRI=0 |
实验结论:
- 当你通过
ens33.10发送数据时,Linux 内核在底层自动插入了 4 字节的 VLAN 标签。 - 当你通过
ens33发送数据时,Linux 内核插入的是标准的 IP 协议类型。 - 这是通过
vconfig创建的虚拟接口与物理接口之间的本质区别。
第五部分:还原“真实场景”——中间与右边的 Linux 命令
我们在理论中看到的那几行命令,现在可以完全理解了:
vconfig add eth1 2 ip link set vlan0002 up这里eth1是物理接口,2是 VID。执行后,系统会创建一个名为vlan0002或eth1.2的虚拟接口。当你给这个虚拟接口配置 IP 并启用它后,它就像一条独立的“虚拟网线”,连接到 VLAN 2 中。
这个命令的经典应用场景:
- 路由器/防火墙:一个物理网卡通过 VLAN 虚拟出多个接口,分别连接不同的“部门子网”,实现物理隔离。
- 服务器:一台服务器通过不同的 VLAN 接口,同时连接“管理网络”和“业务网络”。
- 虚拟化:在 KVM、VMware 等虚拟化平台中,宿主机通过 VLAN 接口将不同虚拟机的流量分离到不同的物理交换机上。
第六部分:总结——从“见证”到“创造”
今天,我们完成了一次完整的“理论→实践”闭环:
- 理论:我们知道 VLAN 标签是 4 字节的
0x8100加上 VID。 - 工具:我们用
vconfig在 Linux 中创建了 VLAN 接口。 - 发送:我们通过
ping和arping发送了测试数据包。 - 捕获:我们用 Wireshark 捕获了物理接口上的原始帧。
- 验证:我们亲眼看到了
0x8100和 VID=10 的真实存在。
核心洞见:
VLAN 标签并不是一个“理论概念”,也不是 Wireshark 为了显示方便而“编造”的。它是一个真实存在的、可观察、可操作的 4 字节数据。当你理解了它的生成方式(vconfig)和解析方式(Wireshark),你就真正掌握了 VLAN——它不再是书本里的图,而是你手中的工具。
下一步:
你可以尝试修改 VID,比如vconfig add ens33 20,再重复一次上面的步骤,看看 Wireshark 中显示的 ID 会不会变成 20。当你能够反复验证这个过程时,你就真正掌握了 VLAN 的“灵魂”。
