GoodbyeDPI — 深度包检测规避工具
这款软件旨在绕过许多互联网服务提供商使用的深度包检测系统,这些系统会阻止访问某些网站。
它可以处理使用光分路器或端口镜像连接的DPI(被动DPI),这种DPI不会阻止任何数据,只是比请求的目标回复得更快,以及串联连接的主动DPI。
需要管理员权限的Windows 7、8、8.1、10或11。
快速开始
- 针对俄罗斯:从发布页面下载最新版本,解压文件并运行1_russia_blacklist_dnsredir.cmd脚本。
- 针对其他国家:从发布页面下载最新版本,解压文件并运行2_any_country_dnsredir.cmd。
这些脚本以推荐模式启动GoodbyeDPI,并将DNS解析器重定向到非标准端口的Yandex DNS(以防止DNS污染)。 如果它能正常工作 — 恭喜!你可以按原样使用或进一步配置。
如何使用
从发布页面下载最新版本并运行。
用法: goodbyedpi.exe [选项...]
-p 阻止被动DPI
-q 阻止QUIC/HTTP3
-r 将Host替换为hoSt
-s 移除主机头与其值之间的空格
-m 混合主机头大小写(test.com -> tEsT.cOm)
-f <值> 设置HTTP分片为指定值
-k <值> 启用HTTP持久(keep-alive)分片并设置为指定值
-n 启用-k时不等待第一个分段的ACK
-e <值> 设置HTTPS分片为指定值
-a 在方法和请求URI之间添加额外空格(启用-s,可能会破坏网站)
-w 尝试在所有处理的端口上查找并解析HTTP流量(不仅仅是80端口)
--port <值> 对额外的TCP端口执行分片(使用-w时还包括HTTP技巧)
--ip-id <值> 处理额外的IP ID(十进制,丢弃具有此ID的重定向和TCP RST)。
此选项可多次提供。
--dns-addr <值> 将UDP DNS请求重定向到指定IP地址(实验性)
--dns-port <值> 将UDP DNS请求重定向到指定端口(默认为53)
--dnsv6-addr <值> 将UDPv6 DNS请求重定向到指定IPv6地址(实验性)
--dnsv6-port <值> 将UDPv6 DNS请求重定向到指定端口(默认为53)
--dns-verb 打印详细的DNS重定向消息
--blacklist <文本文件> 仅对提供的文本文件中的主机名和子域执行规避技巧
(HTTP主机/TLS SNI)。
此选项可多次提供。
--allow-no-sni 启用--blacklist时,如果无法检测到TLS SNI,仍执行规避。
--frag-by-sni 如果在TLS数据包中检测到SNI,在SNI值之前对数据包进行分片。
--set-ttl <值> 激活伪请求模式并以指定的TTL值发送。
危险!可能会以意想不到的方式破坏网站。谨慎使用(或使用--blacklist)。
--auto-ttl [a1-a2-m] 激活伪请求模式,自动检测TTL并根据距离减少它。
如果距离短于a2,TTL减少a2。如果更长,使用(a1; a2)比例,
以距离为权重。如果结果TTL大于m(ax),则设为m。
默认(如果设置):--auto-ttl 1-4-10。同时设置--min-ttl 3。
危险!可能会以意想不到的方式破坏网站。谨慎使用(或使用--blacklist)。
--min-ttl <值> 在--set-ttl和--auto-ttl模式下发送伪请求的最小TTL距离
(128/64 - TTL)。
--wrong-chksum 激活伪请求模式并发送具有不正确TCP校验和的请求。
在虚拟机或某些路由器中可能无法工作,但比set-ttl更安全。
--wrong-seq 激活伪请求模式并发送具有过去TCP SEQ/ACK的请求。
--native-frag 通过发送较小的数据包来分片(拆分)数据包,而不缩小窗口大小。
运行更快(不会减慢连接速度)且效果更好。
--reverse-frag 像--native-frag一样分片(拆分)数据包,但以相反的顺序发送。
适用于无法处理分段HTTPS TLS ClientHello的网站
(因为它们接收"组合"的TCP流)。
--max-payload [值] 不处理TCP有效载荷数据超过[值]的数据包。
使用此选项可通过跳过已建立会话中的大量数据(如文件传输)
来减少CPU使用率。可能会跳过处理一些大型HTTP请求。
默认(如果设置):--max-payload 1200。
传统模式设置:
-1 -p -r -s -f 2 -k 2 -n -e 2 (最兼容模式)
-2 -p -r -s -f 2 -k 2 -n -e 40 (HTTPS速度更快但仍兼容)
-3 -p -r -s -e 40 (HTTP和HTTPS速度更快)
-4 -p -r -s (最佳速度)
现代模式设置(更稳定、更兼容、更快):
-5 -f 2 -e 2 --auto-ttl --reverse-frag --max-payload
-6 -f 2 -e 2 --wrong-seq --reverse-frag --max-payload
-7 -f 2 -e 2 --wrong-chksum --reverse-frag --max-payload
-8 -f 2 -e 2 --wrong-seq --wrong-chksum --reverse-frag --max-payload
-9 -f 2 -e 2 --wrong-seq --wrong-chksum --reverse-frag --max-payload -q (这是默认设置)
注意:--wrong-seq和--wrong-chksum的组合会生成两个不同的伪造数据包。
要检查是否可以规避ISP的DPI,首先确保你的提供商没有通过在浏览器中启用"安全DNS(DNS over HTTPS)"选项来污染DNS答复。
然后不带任何选项运行goodbyedpi.exe
可执行文件。如果它能正常工作 — 恭喜!你可以按原样使用或进一步配置,例如,如果你所在国家的被封网站列表已知且可用,可以使用--blacklist
选项。
如果你的提供商拦截DNS请求,你可能需要使用--dns-addr
选项指向运行在非标准端口的公共DNS解析器(如Yandex DNS 77.88.8.8:1253
),或使用第三方应用程序配置DNS over HTTPS/TLS。
查看.cmd脚本并根据你的偏好和网络条件进行修改。
工作原理
被动DPI
大多数被动DPI在你尝试通过HTTP访问被封网站时会发送HTTP 302重定向,而在HTTPS的情况下会发送TCP重置,速度比目标网站更快。DPI发送的数据包通常具有IP标识字段等于0x0000
或0x0001
,这在俄罗斯提供商中可以看到。如果这些数据包将你重定向到另一个网站(审查页面),GoodbyeDPI会阻止它们。
主动DPI
主动DPI更难欺骗。目前,该软件使用7种方法来规避主动DPI:
- 对第一个数据包进行TCP级别的分片
- 对持久性(保持活动)HTTP会话进行TCP级别的分片
- 将
Host
头替换为hoSt
- 移除
Host
头中头部名称和值之间的空格 - 在HTTP方法(GET、POST等)和URI之间添加额外的空格
- 混合使用Host头部值的大小写
- 发送具有低生存时间值、不正确校验和或不正确TCP序列/确认号的伪造HTTP/HTTPS数据包,以欺骗DPI并防止将其传递到目的地
这些方法不应破坏任何网站,因为它们完全兼容TCP和HTTP标准,但足以防止DPI数据分类和规避审查。额外的空格可能会破坏某些网站,尽管HTTP/1.1规范允许这样做(参见19.3宽容应用程序)。
该程序加载WinDivert驱动程序,它使用Windows过滤平台设置过滤器并将数据包重定向到用户空间。只要控制台窗口可见,它就会一直运行,当你关闭窗口时就会终止。
如何从源代码构建
本项目可以使用GNU Make和mingw构建。唯一的依赖是WinDivert。
要构建x86可执行文件,运行:
make CPREFIX=i686-w64-mingw32- WINDIVERTHEADERS=/path/to/windivert/include WINDIVERTLIBS=/path/to/windivert/x86
对于x86_64:
make CPREFIX=x86_64-w64-mingw32- BIT64=1 WINDIVERTHEADERS=/path/to/windivert/include WINDIVERTLIBS=/path/to/windivert/amd64
如何作为Windows服务安装
查看service_install_russia_blacklist.cmd
、service_install_russia_blacklist_dnsredir.cmd
和service_remove.cmd
脚本中的示例。
根据你自己的需求修改它们。
已知问题
- 严重过时的Windows 7安装由于缺少对SHA256数字签名的支持,无法加载WinDivert驱动程序。安装KB3033929 x86/x64,或者最好使用Windows Update更新整个系统。
一些SSL/TLS堆栈无法处理分片的ClientHello数据包,HTTPS网站将无法打开。Bug:#4,#64。分片问题已在v0.1.7中修复。ESET防病毒软件与WinDivert驱动程序不兼容#91。这很可能是防病毒软件的错误,而不是WinDivert的问题。
类似项目
- zapret 由@bol-van开发(适用于MacOS、Linux和Windows)
- Green Tunnel 由@SadeghHayeri开发(适用于MacOS、Linux和Windows)
- DPI Tunnel CLI 由@zhenyolka开发(适用于Linux和路由器)
- DPI Tunnel for Android 由@zhenyolka开发(适用于Android)
- PowerTunnel 由@krlvm开发(适用于Windows、MacOS和Linux)
- PowerTunnel for Android 由@krlvm开发(适用于Android)
- SpoofDPI 由@xvzc开发(适用于macOS和Linux)
- GhosTCP 由@macronut开发(适用于Windows)
- ByeDPI 适用于Linux/Windows + ByeDPIAndroid 适用于Android(无需root)
- youtubeUnblock 由@Waujito开发(适用于OpenWRT/Entware路由器和Linux)
致谢
感谢@basil00开发的WinDivert。这是本程序的主要部分。
感谢每位BlockCheck贡献者。没有这个工具,就不可能理解DPI的行为。