亲密的网络旅程番外篇:亲手“造”出一个 VLAN 标签——从 Linux 命令行到 Wireshark 抓包的全流程实战

亲密的网络旅程番外篇:亲手“造”出一个 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 wiresharkUbuntu或sudo yum install wiresharkCentOS安装。网络接口你需要一个可用的物理网卡或虚拟网卡比如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.10ens33: 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.10ens33: 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或者如果你只发了 ARParp观察在 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 0a0a十进制为 10是 VID00是 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 字节包含 VID10PRI0实验结论当你通过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和 VID10 的真实存在。核心洞见VLAN 标签并不是一个“理论概念”也不是 Wireshark 为了显示方便而“编造”的。它是一个真实存在的、可观察、可操作的 4 字节数据。当你理解了它的生成方式vconfig和解析方式Wireshark你就真正掌握了 VLAN——它不再是书本里的图而是你手中的工具。下一步你可以尝试修改 VID比如vconfig add ens33 20再重复一次上面的步骤看看 Wireshark 中显示的 ID 会不会变成 20。当你能够反复验证这个过程时你就真正掌握了 VLAN 的“灵魂”。