·

SniShaper:ECH时代的全能Sni阻断绕过工具

 简而言之,SniShaper是一个全能型Sni阻断绕过工具,它可以不用连接代理服务器,直接通过修改Sni/构建ECH绕过GFW的阻断连接目标网站。同时,优选ip池等特性也能保证不错的访问速度。对于AI/流媒体等主动屏蔽中国ip的网站,Snishaper提供了Server模式。尽管经过了服务器中转,它没有传统代理的长连接隧道特征,而表现为低特征的正常网站访问。

工作原理

GFW的简单阻断原理有三种:

1. IP黑洞 对于连接某个IP的连接直接丢弃。这一情况并不广泛,主要针对Google的IP段和一些自建代理的VPS的IP。

2. DNS污染 国内的运营商/特定DNS服务商对被屏蔽网站的解析给出被污染的结果,与错误的IP连接,使得连接握手失败。往往这与第三种做法SNI阻断是并行的;对于被DNS污染但没有被SNI阻断的极少数网站(如Hacker news),你可以在解析到正确的IP后把它添加到host完成直连。当然,系统hosts文件修改比较麻烦,推荐把它添加入SniShaper的透传模式进行便捷的管理。

3. SNI阻断 当你在浏览器输入一个采用 HTTPS 的网址时,设备会首先与服务器建立连接。在正式加密通话前,客户端会发送一个名为 Client Hello 的明文数据包。

SNI阻断详解

GFW 利用 DPI(深度包检测) 技术,实时扫描流经的每一个数据包:

  • 匹配特征码: GFW 会识别出 TLS 握手的特征。

  • 提取 SNI: 一旦确认是 TLS 握手,GFW 就会直接读取 Client Hello 中的 SNI 字段,获取你想要访问的具体域名。

GFW 维护着一份动态更新的黑名单。它将提取出的 SNI 域名与黑名单进行实时比对:

  • 如果域名在白名单或无害名单中,数据包正常放行。

  • 如果域名命中黑名单,则触发阻断机制。

一旦确定目标域名违规,GFW 并不只是简单的丢弃数据包(丢包效率较低),而是采取更主动的手段——TCP 重置攻击

  1. 伪造 RST 包: GFW 会同时向你的设备和目标服务器发送伪造的 TCP RST(Reset)控制位数据包。

  2. 强制中断: 你的浏览器接收到这个包后,会认为连接由于异常被对方强制关闭,从而报错 ERR_CONNECTION_RESET

  3. 后续封锁: 在接下来的几分钟内,GFW 可能会对该源 IP 和目标 IP 之间的所有连接进行短暂QOS。


域前置方案

为了解决上述问题2和3,出现了域前置(Domain Fronting)的玩法。主要有两种玩法:修改浏览器启动参数和本地中间人代理。

方案一:浏览器启动参数

前者的代表是 Sheas-Cealer,它通过修改Chromium系列浏览器的启动参数来实现浏览器内部的SNI修改和忽略证书验证。

  • 优点: 免额外本地证书或代理软件配置,流量无额外特征且轻量级

  • 缺点: 浏览器启动参数存在长度限制,理论上不能容纳无限规则(实际上规则不太可能这么长),以及只能作用于单个浏览器

方案二:本地中间人代理

后者的代表是 SNIBypassGUI,它的原理是本地运行一个DNS服务,所有请求解析至127.0.0.1;客户端连接到127.0.0.1:443,本地运行的Nginx根据SNI头和Host头进行路由;通过一个配置文件nginx.conf完成流量的路由,用proxy_ssl_name指定SNI。

  • 优点: 对系统流量提供完整的代理和改写,规则配置较为灵活

  • 缺点: 不支持自定义规则,引入了本地根证书,没有支持ECH特性,根证书包含所有目标域名限制了规则的可拓展性

SNI 一致性检查

域前置绝非完美无缺:目前,主流 CDN 如Cloudflare、Google等厂商实施了 SNI 一致性检查:CDN 边缘节点会检查 TLS 握手中的 SNI 域名是否与 HTTP Header 中的 Host 域名属于同一个账户,或者是否完全一致。如果不匹配,则会拒绝连接。

因此,一直以来有"域前置已死"的说法。尽管如此,不少没上CDN或域前置检验不严格的网站依然可以使用域前置策略,它们不在少数。


ECH 的出现

ECH出现改变了游戏规则,也让这类工具需要融入新的思路。关于ECH的具体技术细节此处不多赘述,感兴趣可自行查询。

总而言之,ECH开启后外层SNI变成了一个统一的值,而它目前还没受阻断。目前,对ECH支持最激进和完善的是Cloudflare,同时它也是做SNI一致性检查最完善的。因此 ECH+域前置 足以覆盖绝大多数网站的使用。

然而,ECH自身工作类似黑箱。用于让客户端启用ECH的echconfig位于DNS服务的HTTPS记录中,这引入了潜在问题:

  • DNS可能被污染(尽管目前还没有专门针对echconfig的DNS污染)

  • 部分网站没有显式启用ECH(没有正确的HTTPS记录)


SniShaper 功能

为应对这些现实情况,SniShaper应运而生。它提供了以下功能:

  • 基于系统代理和本地中间人拦截改写流量

  • 本地改写SNI和指定上游IP

  • 本地通过echconfig自动构建启用ECH的连接

  • 由于证书机制是由根证书自动产生于内存的子证书,软件的规则具有可拓展性

  • Go+Wails的技术栈保证了性能和前端易用性

  • 为避免Go程序的握手特征过于明显,软件使用了utls来模仿Chrome

Cloudflare ECH 一键加速

由于Cloudflare CDN目前使用了统一的echconfig,你可以用DoH查询一个有HTTPS记录的网站然后把它的echconfig复用于所有部署于Cloudflare CDN的网站。Snishaper正支持此功能。

只需要将部署于Cloudflare CDN的目标域名填入软件界面的Cloudflare ECH一键加速,即可开启ECH完成阻断绕过。


自定义规则方法

对于你想连接而规则中未包含的域名,你可以通过以下方式完成自定义规则:

  1. 用无污染的DNS或ping测试网站(例如 在线ping)的海外结果获取正确IP

  2. 软件页面点添加规则,网站分组和名称任选

  3. 填入目标域名(x.com自动通配*.x.com)

  4. SNI伪造任意填写不被阻断的SNI如apple.com

  5. 如果DNS解析出的IP为Cloudflare的,可以直接填入Cloudflare CDN一键加速

如果这套操作下来依然连不上,请使用Server模式。关于这个模式,下一篇文章将进行详细介绍。


尽管已经非常强大,SniShaper亦非绝对完美。关于使用中出现的问题,欢迎到 SniShaper - GitHub 的issue页面反馈。

日后会加入的功能

  • 基于HelloRetryRequest的echconfig获取和自动更新,将ECH可用性扩展至部分非Cloudflare CDN网站

  • 另一个强大的注入echconfig和绕过DNS阻断的本地DNS软件,避免远程DNS高延迟和受阻断的情况,配合浏览器启动参数修改,自动化免中间人便捷使用