Windows 笑传之 VLAN 串串包
0x01: 多出来的 IPv6 地址
突然发现自己的网卡上多了几个 IPv6 地址,并且从外部不可达,导致电脑无法访问 IPv6 网络。定睛一看才发现,居然是隔壁 VLAN 的网段 😱
我自己的 Windows PC 是接在交换机的一个 Trunk 口下的,这个 Trunk 口上会承载 untagged + tagged VLAN45。虽然我这个配置确实不太好,但是理论上不应该出这种问题才对。
在这种模式下运行着的还有几个 Linux 开发板,他们并没有出现任何问题,这让我确信是 Windows 有什么特殊之处。
0x02: 抓包看到确实有 VLAN Tag
通过 Wireshark 抓包,可以看到 Windows PC 确实收到了来自 VLAN 45 里的路由器的 RA 报文,并且带有 VLAN Tag。
既然数据包带上了 VLAN Tag,Windows 为什么没有忽略而是盲目听信呢?
0x03: Windows 其实没有看到 VLAN Tag
既然系统会响应 VLAN 45 的 RA,说明协议栈把它当成了 untagged 帧。
并且,SLAAC 是单向的,只要 Windows 接收到 RA 报文,Windows 就可以独立给网卡配置 IPv6 地址。这一点不同于 DHCP 需要双向交互才能得到地址,所以只会莫名其妙多出来 SLAAC 的 IPv6 地址,而 IPv4 地址却一切正常。
0x04: 是网卡的锅
我使用的网卡是 Realtek Gaming 2.5GbE Family Controller,基于 RTL8125 芯片。这种芯片的 Windows 驱动默认开启了 Rx VLAN Offload,或者也可以称之为 VLAN Stripping。
网卡硬件收到带 802.1Q 标签的帧后,直接在芯片内剥离 4 字节的 VLAN 标签头,将剥离后的“裸以太网帧”通过 DMA 上传到系统内存,交给 TCP/IP 协议栈。
同时,硬件会把被剥离的 VLAN ID、802.1p 优先级等信息,存放在该帧对应的接收描述符(Rx Descriptor)元数据字段中,留给驱动做 QoS 或调试使用。
Windows 协议栈拿到的是已经被剥掉标签的裸帧,完全感知不到 VLAN 的存在。
而 Wireshark 依赖的 Npcap 驱动工作在 NDIS 网络驱动层,它不会只读取协议栈收到的裸帧,而是会读取网卡接收描述符里的 VLAN 元数据,自动将 802.1Q 标签重新插回报文结构再展示出来。
所以,虽然在 Wireshark 里看到了 VLAN Tag,但是 Windows 看不到。
0x05: 解决方案
最简单的解决方案是关闭系统的 IPv6 功能。但这操作杀敌一千自损一万,不考虑。
其次就是调整交换机接口类型,把 Trunk 口改成 Access 口,只允许 untagged 帧。治标不治本,半个多小时白研究了,不甘心。
终极解决方案:修改注册表禁用 VLAN 硬件剥离
需要通过添加 Realtek 驱动的隐藏注册表参数,强制禁止硬件剥离 VLAN 标签。
在注册表编辑器中定位到如下路径:
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\00xx |
末尾的 00xx 需要自己找,一个个点进去看 DriverDesc 的值,找到对应的网卡就行。
在右侧空白处右键新建 DWORD (32 位) 值,创建或修改现有的以下键名并设置对应数值:
| 键名 | 数值 | 作用说明 |
|---|---|---|
SkDisableVlanStrip |
1 | 禁用硬件 VLAN 标签剥离功能 |
*PriorityVLANTag |
0 | 关闭优先级与 VLAN 处理。* 前缀必须要加上,并不是输入错误 |
MonitorModeEnabled |
1 | 启用报文监控模式,保留完整帧结构 |
MonitorMode |
1 |

最后重启电脑即可。完美解决,实测不影响后续 Wireshark 抓包分析。
参考:
- 标题: Windows 笑传之 VLAN 串串包
- 作者: SerinaNya
- 创建于 : 2026-07-08 15:56:19
- 更新于 : 2026-08-05 11:17:39
- 链接: https://serinanya.cn/2026/fix-realtek-vlan-offload-on-windows/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。