Windows WFP:Clash Verge Rev 的系统级网络过滤引擎

🔍 什么是 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 网卡的情况下实现流量的透明拦截和重定向。

📌 关键概念: WFP 过滤器由“过滤条件”和“回调函数”组成。条件可以是 IP 地址、端口、进程 ID 等,回调函数则在匹配时执行相应动作(允许、阻止、调用自定义处理)。Clash 正是通过注册 WFP 回调,将符合条件的流量导入内核代理模块。

🎯 为什么 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 模式”的底层实现,但它们的机制截然不同:

WFP

内核过滤层

在 Windows 网络栈中注册回调,直接在 ALE 层拦截连接请求和 UDP 包,不创建虚拟网卡。

TUN

虚拟网卡层

创建虚拟网络适配器,通过修改路由表将流量导入该网卡,再由用户态程序读取。

性能

WFP 开销更低

内核回调直接处理,无上下文切换到用户态;TUN 需要数据包在用户态和内核态间拷贝。

兼容性

WFP 更友好

不创建额外网络设备,不会与其他 VPN 驱动冲突;TUN 则可能因 Wintun 驱动问题导致蓝屏。

实际体验中,使用 WFP 后,系统启动、休眠恢复时不会出现短暂的断网,因为路由表保持不变。然而,WFP 目前仅支持 Windows 平台,而 TUN 模式是跨平台的。如果你需要在 Linux 或 macOS 上实现类似功能,就必须使用 TUN 或系统代理。

⚠️ 注意: 在 v2.5.2 版本中,Clash Verge Rev 对 WFP 的支持已集成到 TUN 设置中,只需将 TUN 堆栈选择为“WFP”即可(前提是你的 Mihomo 内核已包含 WFP 模块)。

🛠️ 配置 Clash Verge Rev 使用 WFP

在最新版 Clash Verge Rev 中,启用 WFP 非常简单:

  1. 打开 Clash Verge Rev,进入 “设置”“TUN 模式”
  2. “TUN 堆栈” 下拉菜单从 “System” 或 “gVisor” 切换为 “WFP”
  3. 点击开启 TUN 模式,系统会提示管理员权限(WFP 需要注册内核过滤器),点击“是”。
  4. 观察日志,如果出现 “WFP filter registered” 类似信息,说明已生效。

配置文件中的对应字段为:

tun: enable: true stack: wfp # 使用 Windows Filtering Platform dns-hijack: - any:53 # WFP 模式同样需要 DNS 劫持

启用后,你无需再进行额外的端口代理设置。配合 DNS 配置 中的 Fake‑IP 模式,DNS 请求也会被 WFP 内核过滤器拦截并重定向到 Clash 的 DNS 模块,实现无泄漏的全局代理。如果你还需要局域网共享,可参考 Ubuntu 部署教程 中的类似思路,在 Windows 防火墙中放行对应端口。

🚀 性能优化与资源管理

WFP 虽然高效,但大量过滤规则或同时活动连接仍可能消耗系统资源。以下优化建议可帮你获得最佳体验:

  • 限制 WFP 过滤范围:默认情况下,WFP 会拦截所有进程的流量。如果你只需要代理特定应用,可以在配置中添加 bypass 列表,让系统流量直连。
  • 结合规则分流:利用 Rule 模式 将国内流量在 WFP 层直接放行(DIRECT),避免所有包都进入代理内核处理,降低 CPU 使用率。
  • 监控句柄泄漏:极少数情况下,老旧驱动或恶意软件会干扰 WFP 过滤器。通过 netsh wfp show state 检查活跃过滤器数量,若异常增多,重启 Clash 可清理。
# 在管理员终端查看当前 WFP 过滤器信息 netsh wfp show filters

若发现 Clash 注册的过滤器数量随着时间持续增长(句柄泄漏),可以尝试更新至最新版 Mihomo 内核,因为内核会定期清理无效的过滤规则。

🩺 故障排查与高级诊断

1

WFP 无法启动

确保以管理员权限运行,且系统没有禁用 Windows Filtering Platform 服务。

2

部分应用无法代理

检查应用的网络堆栈是否为内核级(如 WSL2),WFP 可能无法拦截。改用系统代理或 TUN 模式。

3

蓝屏 (BSOD)

通常由 Wintun 驱动冲突引起。切换到 WFP 后蓝屏应消失,确保 Wintun 驱动已卸载。

4

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 实现。

📖 继续阅读