🔍 什么是 WFP?
Windows Filtering Platform (WFP) 是微软自 Windows Vista 起内置的一套网络过滤框架。它允许应用程序或驱动在系统网络栈的多个层级插入回调函数,从而检查、修改甚至阻止网络数据包。与传统的 Winsock LSP 或 TDI 相比,WFP 提供了更细粒度的控制:你可以在应用层 (ALE)、传输层 (Transport)、网络层 (IP) 等不同位置设置过滤器,支持 TCP/UDP、ICMP 以及原始 IP 流量。
WFP 的核心优势在于它是内核级的,性能开销极低,且不会改变系统网络设置(例如不会创建虚拟网卡)。许多安全软件(如 Windows Defender 防火墙)、VPN 客户端以及抓包工具都基于 WFP 实现。Clash Verge Rev 利用 WFP,可以在不修改路由表、不创建 TUN 网卡的情况下实现流量的透明拦截和重定向。
🎯 为什么 Clash 需要 WFP?
在 Windows 上,传统代理方案通常依赖系统代理 (WinINet/WinHTTP) 或 TUN 虚拟网卡。系统代理简单但覆盖不全——许多应用(如命令行工具、游戏、UWP 应用)并不遵循系统代理设置。TUN 模式虽然能实现全局代理,但需要安装虚拟网卡驱动,与部分杀毒软件、VPN 存在兼容性问题,且每次启动都要修改路由表,容易导致断网。
WFP 提供了一个更优雅的解决方案:它直接在内核层面拦截网络请求,不依赖代理设置,也不创建额外网络接口。这意味着:
- 不会与其它 VPN 软件产生网卡冲突。
- 无需修改系统路由表,避免路由错误导致断网。
- 支持所有基于 Winsock 的应用程序,包括那些硬编码 DNS 或不走系统代理的软件。
Clash Verge Rev 在 Windows 上默认使用 WFP 作为 TUN 模式的底层驱动,用户可以在设置中看到相关选项。关于 TUN 模式的其他细节,你可以参考 开启 TUN 模式 一文。
⚖️ WFP 与 TUN 模式的本质区别
尽管在 Clash Verge Rev 中两者均被归类为“TUN 模式”的底层实现,但它们的机制截然不同:
内核过滤层
在 Windows 网络栈中注册回调,直接在 ALE 层拦截连接请求和 UDP 包,不创建虚拟网卡。
虚拟网卡层
创建虚拟网络适配器,通过修改路由表将流量导入该网卡,再由用户态程序读取。
WFP 开销更低
内核回调直接处理,无上下文切换到用户态;TUN 需要数据包在用户态和内核态间拷贝。
WFP 更友好
不创建额外网络设备,不会与其他 VPN 驱动冲突;TUN 则可能因 Wintun 驱动问题导致蓝屏。
实际体验中,使用 WFP 后,系统启动、休眠恢复时不会出现短暂的断网,因为路由表保持不变。然而,WFP 目前仅支持 Windows 平台,而 TUN 模式是跨平台的。如果你需要在 Linux 或 macOS 上实现类似功能,就必须使用 TUN 或系统代理。
🛠️ 配置 Clash Verge Rev 使用 WFP
在最新版 Clash Verge Rev 中,启用 WFP 非常简单:
- 打开 Clash Verge Rev,进入 “设置” → “TUN 模式”。
- 将 “TUN 堆栈” 下拉菜单从 “System” 或 “gVisor” 切换为 “WFP”。
- 点击开启 TUN 模式,系统会提示管理员权限(WFP 需要注册内核过滤器),点击“是”。
- 观察日志,如果出现 “WFP filter registered” 类似信息,说明已生效。
配置文件中的对应字段为:
启用后,你无需再进行额外的端口代理设置。配合 DNS 配置 中的 Fake‑IP 模式,DNS 请求也会被 WFP 内核过滤器拦截并重定向到 Clash 的 DNS 模块,实现无泄漏的全局代理。如果你还需要局域网共享,可参考 Ubuntu 部署教程 中的类似思路,在 Windows 防火墙中放行对应端口。
🚀 性能优化与资源管理
WFP 虽然高效,但大量过滤规则或同时活动连接仍可能消耗系统资源。以下优化建议可帮你获得最佳体验:
- 限制 WFP 过滤范围:默认情况下,WFP 会拦截所有进程的流量。如果你只需要代理特定应用,可以在配置中添加
bypass列表,让系统流量直连。 - 结合规则分流:利用 Rule 模式 将国内流量在 WFP 层直接放行(DIRECT),避免所有包都进入代理内核处理,降低 CPU 使用率。
- 监控句柄泄漏:极少数情况下,老旧驱动或恶意软件会干扰 WFP 过滤器。通过
netsh wfp show state检查活跃过滤器数量,若异常增多,重启 Clash 可清理。
若发现 Clash 注册的过滤器数量随着时间持续增长(句柄泄漏),可以尝试更新至最新版 Mihomo 内核,因为内核会定期清理无效的过滤规则。
🩺 故障排查与高级诊断
WFP 无法启动
确保以管理员权限运行,且系统没有禁用 Windows Filtering Platform 服务。
部分应用无法代理
检查应用的网络堆栈是否为内核级(如 WSL2),WFP 可能无法拦截。改用系统代理或 TUN 模式。
蓝屏 (BSOD)
通常由 Wintun 驱动冲突引起。切换到 WFP 后蓝屏应消失,确保 Wintun 驱动已卸载。
DNS 解析失效
检查 TUN 配置中 dns-hijack 是否包含 any:53,并确保 Fake‑IP 范围没有冲突。
如果你在 WFP 模式下遇到奇怪的断网问题,可以在 Clash Verge Rev 的日志中搜索 “WFP” 关键词,定位具体错误。若系统事件查看器中出现 “BFE service” 相关错误,则可能是基础过滤引擎 (BFE) 被禁用。此时需要在服务中启用 “Base Filtering Engine” 并重启。
更详细的排错步骤可参阅 TUN 模式断网排查 一文,其中许多思路同样适用于 WFP。
🔮 未来展望:WFP 与 eBPF
WFP 是 Windows 专有技术,而 Linux 生态则通过 eBPF 实现类似的内核可编程性。Mihomo 内核团队正在探索在 Linux 上使用 eBPF 来实现透明代理的可能性,这将为 Linux 平台带来与 WFP 相媲美的低开销、无侵入代理体验。对于开发者来说,理解 WFP 的回调模型也有助于未来参与 eBPF 驱动的开发,两者在概念上高度相似。
如果你想深入研究 WFP 的底层细节,可以参考 GitHub Wiki 文档 中的内核模块部分。同时,也欢迎在 GitHub 仓库 提交 Issue 或 PR,帮助改进 WFP 实现。