🔌 TUN 驱动在代理体系中的角色
在 TUN 模式 下,Clash 需要将系统所有的 IP 包(包括 TCP 和 UDP)引导至用户态的代理内核。在 Windows 中,这一功能依赖于一个内核级虚拟网卡驱动。该驱动创建一个虚拟网络接口,并与操作系统路由表联动,把目标流量从物理网卡“劫持”到这个虚拟接口上。
一旦驱动出现问题——例如安装不完整、版本不兼容或与旧驱动冲突——就会导致断网、DNS 失效或部分应用无法联网。因此,理解驱动的工作原理是解决 Windows 下各种怪奇网络问题的关键。
🪟 Wintun:新一代 Windows TUN 驱动
Wintun 是 WireGuard 项目开发的一款轻量级、高性能的 Layer 3 TUN 驱动,目前已被 Clash Verge Rev、Clash for Windows 等主流客户端采用。相比旧版 OpenVPN 的 tap-windows6 或 wintap,Wintun 具有以下显著优势:
- 极小的资源占用: 内核内存池管理优化,吞吐量提升的同时降低 CPU 消耗。
- 原生 NDIS 6.50 支持: 兼容 Windows 10/11,获得更好的电源管理。
- PPL (受保护进程) 签名: 通过与 WHQL 签名结合,减少安全软件拦截。
- 更简单的 API: 用户态只需通过 IOCTL 与驱动通信,无需复杂的 TAP 适配器。
在 Clash 中,Wintun 驱动通常以 wintun.dll 形式分发,客户端启动时自动安装并创建名为 clash-tun(或自定义名称)的虚拟网卡。
# 查看 Wintun 驱动的详细信息 Get-NetAdapter -Name "*clash*" | Format-List Name, DriverDescription, DriverVersion
若你想深入了解 Wintun 本身的源码,可访问 WireGuard 官方仓库。
👻 旧版残留:cfw-tun 与注册表痕迹
从 Clash for Windows (CFW) 迁移到 Clash Verge Rev 的用户,经常会遇到一个顽固问题:系统中同时存在 cfw-tun 和 clash-tun 两个虚拟网卡,导致路由表出现两条默认路由,流量随机走错接口。
nslookup 解析正常但 ping 不同,路由表存在两个 0.0.0.0 条目。
为什么卸载 CFW 后驱动仍残留?
CFW 使用 tap-windows 或旧版 Wintun 驱动,并在系统注册表中留下了“永久”设备实例。即使你卸载了客户端,Windows 也会保留驱动包(Driver Store),以便下次插入相同硬件时自动安装。这就是为什么重启后 cfw-tun 阴魂不散的原因。
手动定位残留驱动
在命令提示符(管理员)中执行:
pnputil /enum-drivers | findstr /i "wintun"
列出所有已发布(published)的驱动包。找到与 CFW 相关的 .inf 名称(通常包含 cfw 或 tap 字样),记录其发布名称(Published Name),例如 oemXX.inf。
🧹 彻底清理:从设备管理器到注册表
常规的设备管理器卸载往往不彻底。请按以下步骤进行深度清理:
1. 卸载设备并删除驱动
- 打开设备管理器 → 查看 → 显示隐藏的设备。
- 展开“网络适配器”,找到
cfw-tun(或任何不再使用的 Clash 旧接口)。 - 右键 → 卸载设备,勾选“删除此设备的驱动程序软件”。
2. 从驱动存储中强制删除
pnputil /delete-driver oemXX.inf /force
将 oemXX.inf 替换为上一步查找到的对应驱动包名称。此操作会从系统的 Driver Store 中永久移除该驱动,使其无法再自动安装。
3. 清理注册表残留(谨慎操作)
打开注册表编辑器,定位到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
查找名为 cfwtun、tap0901 或类似的服务键,确认其 ImagePath 指向已卸载的驱动文件后,右键删除整个项。同时检查 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList 下是否还有对应接口的配置文件。
📊 性能对比与调优
Windows 下 TUN 模式性能受驱动类型、MTU 设置和硬件卸载能力影响。以下是在相同网络环境下(千兆宽带)的简单对比:
| 驱动类型 | TCP 吞吐量 (Mbps) | UDP 丢包率 (%) | CPU 额外占用 |
|---|---|---|---|
| Wintun (最新) | ~940 | <0.1% | 低 |
| 旧版 tap-windows6 | ~820 | 0.5% | 中等 |
| 系统内置 TUN (gvisor) | ~700 | <0.1% | 较高 |
调优建议:
- 调整 MTU: 在 Wintun 接口属性中,将 MTU 值设为 1420 或更低(如 1280),以减少 UDP 分片。
- 禁用大量 TCP 卸载: 在虚拟网卡的高级属性中关闭 “Large Send Offload (LSO)” 和 “TCP Checksum Offload”,交由 Clash 内核处理更可靠。
- 绑定 CPU 亲和性: 如果使用 Clash Verge Rev,可在任务管理器中将 Clash 进程的 CPU 关联设置为最后一个核心,减少中断冲突。
🔬 驱动级调试工具
当常规排障手段无效时,可以借助以下工具深入分析:
- Process Monitor (ProcMon): 过滤
wintun.dll和 Clash 进程,观察注册表读写与文件操作,定位驱动加载失败点。 - Windows Performance Recorder (WPR): 录制网络堆栈事件,分析 DPC 延迟和 ISR 时间,判断驱动是否引起高延迟。
- netsh trace: 捕获网络包,查看是否有 NDIS 错误:
netsh trace start capture=yes tracefile=c:\net.etl。
如果你发现日志中反复出现 Wintun: Unable to create adapter,请检查系统是否启用了 Hyper‑V 或 WSL2,这些虚拟化平台会抢占虚拟网卡命名空间。解决方法见 常见问题页面。
🏁 最佳实践与自动化
- 使用最新客户端: Clash Verge Rev 提供了驱动自动更新和健康检查,确保 Wintun 版本始终为最新。
- 避免同时运行多个代理软件: 多个 TUN 驱动会争抢路由表,建议仅保留一套代理工具。
- 创建还原点: 在进行驱动清理前,通过 Windows 系统还原创建一个恢复点。
- 编写清理脚本: 将上述 pnputil 和注册表操作封装成
.bat文件,迁移或重装时一键执行。结合 配置文件管理 思路,甚至可以将其纳入配置备份体系。 - 监控驱动状态: 在 Clash 客户端的日志中保持对
tun关键字的监控,第一时间发现驱动异常。
当你从底层彻底掌控了 Windows 虚拟网卡驱动后,那些曾经令人困惑的“断流”“冲突”“重启失效”都将迎刃而解。若你还想进一步优化 TCP/UDP 的代理行为,强烈推荐阅读 《TCP 与 UDP 深度对比》 以及 《Clash 与 HTTP/3》,从传输层和协议层继续深挖网络性能。