简而言之,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 重置攻击:
伪造 RST 包: GFW 会同时向你的设备和目标服务器发送伪造的 TCP RST(Reset)控制位数据包。
强制中断: 你的浏览器接收到这个包后,会认为连接由于异常被对方强制关闭,从而报错
ERR_CONNECTION_RESET。后续封锁: 在接下来的几分钟内,GFW 可能会对该源 IP 和目标 IP 之间的所有连接进行短暂QOS。
域前置方案
为了解决上述问题2和3,出现了域前置(Domain Fronting)的玩法。主要有两种玩法:修改浏览器启动参数和本地中间人代理。
方案一:浏览器启动参数
前者的代表是 ,它通过修改Chromium系列浏览器的启动参数来实现浏览器内部的SNI修改和忽略证书验证。
优点: 免额外本地证书或代理软件配置,流量无额外特征且轻量级
缺点: 浏览器启动参数存在长度限制,理论上不能容纳无限规则(实际上规则不太可能这么长),以及只能作用于单个浏览器
方案二:本地中间人代理
后者的代表是 ,它的原理是本地运行一个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完成阻断绕过。
自定义规则方法
对于你想连接而规则中未包含的域名,你可以通过以下方式完成自定义规则:
用无污染的DNS或ping测试网站(例如 )的海外结果获取正确IP
软件页面点添加规则,网站分组和名称任选
填入目标域名(x.com自动通配*.x.com)
SNI伪造任意填写不被阻断的SNI如apple.com
如果DNS解析出的IP为Cloudflare的,可以直接填入Cloudflare CDN一键加速
如果这套操作下来依然连不上,请使用Server模式。关于这个模式,下一篇文章将进行详细介绍。
尽管已经非常强大,SniShaper亦非绝对完美。关于使用中出现的问题,欢迎到 的issue页面反馈。
日后会加入的功能
基于HelloRetryRequest的echconfig获取和自动更新,将ECH可用性扩展至部分非Cloudflare CDN网站