Windows 实现透明代理或者全局代理的方案总结
Windows 实现透明代理或者全局代理的方案总结
题中所指的透明代理或全局代理的意思为:无需手动设置 Proxy 的、应用无感知的、可以实现代理所有应用流量的代理方式。
透明代理的用处
- 全局抓包(中间人代理):有些应用不会读取 System Proxy 设置,因此只能通过透明代理来实现此类应用流量的捕获
- 全局科学:懂的都懂
方案总结
Windows 上没有 iptables,我调查了目前大部分抓包类软件和科学类应用的透明代理实现方式,按照技术栈分类如下,总体来说推荐基于 Windows Filtering Platform (WFP) 的方案
基于 Windows Filtering Platform (WFP) 的方案
这种方案利用了 Windows 提供的 WFP API,需要进行驱动级别的编程,然而有一些项目提供了封装好的易于使用的 API,比较著名的有 Netfilter SDK , WinDivert
比如:
- 最负盛名的开源中间人代理工具 mitmproxy 在2024年初的10.2版本中发布了 基于 WinDivert 的 Local Redirect 模式 ,无需用户设置系统代理即可捕捉全局流量
- HTTP Debugger Pro 则使用 Netfilter SDK 来实现全局系统代理
- Proxifier 在 4.0 中也将处理流量的方式从 Inline Hook 迁移到了WFP
- Clash.NET 基于 Netfilter SDK 实现全局科学
- Netch 和 nft-game 同样基于 Netfilter SDK 。
- junjiexing/libredirect: 使用WFP重定向socket链接
- zliu-fd/WinDivertProxy: Proxy any program via WinDivert to a specific server
- xljiulang/WindivertDotnet: 面向对象的WinDivert的dotnet异步封装
基于虚拟网卡接口的方案
这类方案的原理一般为先创建一个虚拟网卡,然后修改路由表将所有流量转发到代理,据说在性能上不如基于WFP的方案。Windows上主流开源方案有以下两个:
具体来说,有以下几个项目:
- mitmproxy 的 WireGuard 模式
- tun2socks 使用 OpenVPN 创建虚拟网卡,然后将流量转发到代理( [教程] 在 Windows 上使用 tun2socks 进行全局代理 | by Tachyon | Medium )
- Clash 基于 Wintun 来实现全局科学
- leaf 项目使用 Rust 实现了 tun2socks, Maple 则是一个基于 leaf 的 Windows 全局代理方案
基于进程注入 Inline Hook 的方案
这类方案通过 hook connect 函数来实现流量的重定向。基于该方案的项目貌似比较少,已知 Proxifier 在 4.0 之间采取该方式实现全局流量捕获。
参考文章
- Wintun:一款惊艳的 WireGuard 虚拟网卡接口驱动-技术圈
- [教程] 在 Windows 上使用 tun2socks 进行全局代理 | by Tachyon | Medium
- Windows驱动编程之NetFilter SDK-编程技术-看雪-安全社区|安全招聘|kanxue.com
- junjiexing/libredirect: 使用WFP重定向socket链接
- WinDivert+MITM实现https流量透明_windivert proxy-CSDN博客