本文旨在整理和总结在互联网上发布的可以被用于解决SNI阻断的开源工具,以工具的介绍和使用为主要内容,并不着重于仔细探究背后的实现方式与技术细节(笔者也没能力去探究)。

在使用过程中出现问题,请仔细回顾文章,以检查是否操作有误,或到对应工具的项目评论区进行反馈。
笔者不负责工具的维护,也不负责在使用工具时可能存在的安全风险。

一. SNI阻断简介

以下内容摘自《SNI阻断与解决方案》:

在建立新的TLS连接时,客户端(如浏览器)发出的第一个握手包(称为Client Hello)中,包含了想要访问的域名信息(称为SNI,Server Name Indication)。
某些服务器会同时支持多个域名。在加密传输之前,它需要知道客户端访问的是哪个域名。于是SNI必须以明文的方式传输。并且由于浏览器并不知道服务器是否需要SNI,浏览器会对所有的TLS握手都加入SNI。
于是,根据黑名单,某些防火墙可以根据明文SNI信息,对TLS连接进行精确阻断

二. SNI阻断的判断

以下内容摘自GotoX项目的帮助文档

如何判断网站是否被 GFW 封锁 SNI,以及如何选择伪造的 SNI 名称?

  1. 在浏览器中新建标签页
  2. 按下 F12 打开开发者工具,选择 网络/network 面板
  3. 在地址栏中输入转到使用 HTTPS 的目标网址,等待页面加载完成,面板日志会记录失败的请求
  4. 点击日志条目查看,如果 消息头/Headers 中没有 响应头/Response Header 这个域名可能就是被 SNI 封锁
  5. (如已排除 DNS 污染和 IP 封锁可跳过此步骤)Ping 上一步得到的域名,如果有回应,基本可以肯定就是 SNI 封锁,否则就是 DNS 污染或 IP 封锁
  6. 可以先尝试不发送 SNI(配置方法见上方),服务器将发送默认证书,如果证书匹配则连接成功
  7. 如果上一步失败,尝试限定使用 IPv6 连接(如果有且未被封锁)
  8. 如果上一步失败,尝试修改原域名的次级域名作为 SNI,如: .palemoon.org = img.palemoon.org
  9. 或者修改成同一个服务器的其它未封锁域名,如: www.instagram.com = graph.cdninstagram.com
  10. 也可以尝试任意其它你想要使用的 SNI 名称
  11. 如果被封锁网站与其它网站共用 IP(如免费 CDN),则必须发送 SNI,且保留主域名不变

三. SNI阻断的解决

以下内容摘自《SNI阻断与解决方案》:

目前尚无通用的解决方案。有一个较为通用的,但部署起来略麻烦的方案称为域前置Domain Fronting)。
它的原理简单来说是这样的:部分服务器允许TLS连接说自己需要域名A,但之后的HTTP协议说自己需要域名B;或者服务器压根就不看SNI信息
在这种情况下,对于一个处于黑名单,受到SNI阻断的域名,在建立TLS时,可以选用一个黑名单之外的域名,绕过防火墙的监测;或者干脆不发送SNI信息

当然,它的缺点是,依赖于服务器行为。也就是说,每个不同的站点,可能都需要不同的策略。

举两个例子:

  1. Pixiv的服务器实际上是不看SNI的。在建立TLS连接的时候,即使不携带SNI,也可以正常进行访问。
  2. zh.wikipedia.org是一个黑名单域名,但同站点的www.wikipedia.org则不是。在建立TLS连接时,使用 SNI = www.wikipedia.org,之后的 HTTP 请求依然可以正常连到 zh.wikipedia.org

顺便说一句,域前置实际上不是一个合理的用法,网站完全可以拒绝这类连接,比如 Google 和 Amazon 就主动在自己的所有服务中拒绝这项技术。

四. 受到GFW的SNI阻断,但可以借助域前置技术访问的站点

以下为笔者的不完全整理。

  • E-Hentai
  • Pixiv
  • Wikipedia
  • Syosetu(成为轻小说家吧)
  • Reddit
  • Quora

更为完整的列表见由Accesser项目的作者所整理的 目前支持的站点

五. 互联网上已有的相关工具

1.Escape

Escape是由法国Madynes团队开发的一款用于绕过SNI阻断的Firefox浏览器插件,可以实现对SNI信息的自定义修改。
Madynes团队隶属于法国国立计算机及自动化研究院,致力于探索未来互联网的管理手段,着眼于设计新的方法来配置、监控和保护未来互联网的通信协议和服务。
该团队于2015年发表了一篇名为《Efficiently bypassing SNI-based HTTPS filtering》的论文,详细介绍了绕过SNI阻断的原理与实现(即Escape插件)。感兴趣的读者可自行阅读。
很遗憾,此工具支持的最高版本浏览器仅为Firefox32(2014年发布)。但“麻雀虽小,五脏俱全”,使用者仍然可以在Firefox32上实现现代浏览器的大部分功能。接下来将以ExHentai、Pixiv和Syosetu三个站点为例,介绍Escape的使用。
Escape的使用示例(https://nicebowl.fun/24_1

2.revolter-firefox

Firefox32的确过于老旧,运行速度一般,对插件的支持也不很丰富。这一节将介绍一款基于Firefox68(2019年发布)的工具,revolter-firefox,同样支持对SNI进行自定义修改。
revolter-firefox项目的原作者为Xmader,在喝茶后删除了仓库,目前Github上的项目为爱好者的备份。
下面简单介绍下工具的使用以及需要注意的事项。
revolter-firefox的使用示例(https://nicebowl.fun/24_2

3.Accesser

Accesser是由URenko开发的工具,双击打开可执行文件即可使用(首次使用需信任证书)。
因为作者长期未进行维护,所以工具对E-Hentai系列网站以及Pixiv系列网站的连接尚存在一些问题。笔者根据项目作者源码,自行封装了一版Accesser,感兴趣的读者可前去下载
由于Accesser是通过代理方式来实现其功能,因此请尽量避免与其它科学上网工具的同时使用。
Accesser的使用示例(https://nicebowl.fun/24_3

4.GotoX

GotoX是由SeaHOH开发的工具,与Accesser相比,功能更加丰富,更新与维护更加及时,帮助文档也更为详细。
本文仅介绍GotoX的绕过SNI阻断的特性。
GotoX的使用示例(https://nicebowl.fun/24_4

5.Pixiv-Nginx

Pixiv-Nginx是由mashirozx开发的一款传播度相当广的工具。
在互联网上已有大量文章介绍此工具的配置与使用,前人之述备矣,本文不再赘叙。
参考阅读:
Pixiv-Nginx项目主页
PIXIV网页版及客户端访问恢复指南
[更新]访问EX仍然可以不用梯子的3年多前就用烂的方法
使用Nginx反向代理访问Pixiv
本地nginx反向代理访问Pixiv指北

6.bypass

笔者并不很熟悉这个项目,或者说是知之甚少。
参考阅读:
利用域前置技术绕过GFW

7.v2ray

一款功能强大,用户广泛的科学上网工具,但在v2ray上配置域前置稍显繁琐。
参考阅读:
SNI 阻断与解决方案

8.Chromium系列浏览器启动参数

感谢评论区@kit 网友的建议。

chromium系列浏览器启动参数--host-rules="MAP *.a.com b.com[,MAP...]",访问a.com的任意子域名时,tls连接b.com服务器(使用b.com作为sni)。类似参数--host-resolver-rules可以指定域名ip。

通过设置启动参数,可以轻松地解决SNI阻断,同时避免上述部分方法中因使用版本老旧的浏览器而产生的兼容性问题。
通过配置Chromium系列浏览器启动参数以解决DNS污染与SNI阻断(https://nicebowl.fun/24_8

此方法的另一种实现:
Sheas-Cealerhttps://github.com/SpaceTimee/Sheas-Cealer),一只基于 WPF(.Net5) 的 SNI 伪造工具,适用平台 Windows 10+。

9.TCPioneer & phantomsocks

原理很接近早年的西厢计划。与上述通过修改SNI信息来解决阻断的方法不同,这是通过魔改TCP包从而使GFW无法正常进行监测的神奇工具。
由于并未对SNI信息进行修改,因此甚至可以直连那些使用了CDN加速的网站,可以说是本文所列出的工具中最强大的一款,使用起来也非常简便。

参考阅读:
TCPioneer-直连H萌娘
PhantomSocks 修改TCP帧从而实现突破防火墙
Your state is not mine: a closer look at evading stateful internet censorship
你的状态不是我的

六. 结语

本文总结了互联网上已有的可被用于解决SNI阻断的工具,并介绍了其中一些工具的使用方法。

虽然借助域前置可以实现对境外网站的直连,但应注意的是,连接的质量与双方的网络质量密切相关。
如果自己网络条件尚可或网站的线路优化良好,那么通过此法可以较为流畅的访问目标网站;
但如果网络质量糟糕,则可能出现明显的卡顿与延迟,比如等待好久却只能加载出半张图片,这也是正常现象。
一般来说,只要能够加载出网站的标题,就代表已经解决SNI阻断,成功直连到了目标站点。

[数据删除]

“土法炼钢,贻笑大方。”
在探索“SNI阻断”这个话题时,笔者颇花费了一番心思,走了不少弯路。
最后总算是磕磕绊绊,靠着“土法”炼出这篇拙作。
笔者未曾修读CS专业,文中可能不乏脱漏谬误之处,还请大方之家在一笑之余能不吝指教。:)

已有 65 条评论

  1. Aghayev

    我发现有的文章有全文输出在 RSS 里,
    比如这一篇,ehviewer,ex教程

    其他的 RSS 里只有一个通向网站的链接

    这是故意设定的吗?

    1. 有些文章设置了摘要分割线,有些文章没有。
      估计是这个原因...

  2. Aghayev

    请注意,中国移动正在审查 SNI * .github.io

    请将默认值更改为其他

    1. OAO。这可真是个坏消息。

    2. gennshi

      有什么别的推荐么?

  3. 我修读的就是CS专业,可是连SNI阻断是什么都不知道,这应该跟信通有关吧

  4. Aghayev

    除了域前置之外还可以修改 tcp 包

    https://github.com/Macronut/phantomsocks

    对不支持 域前置的 Cloudflare 和 AWS 很有用

  5. Devil-Antivirus

    revolter-firefox打不开pixiv了,又自定义了一个SNI还是不行;
    DoH服务也不太行,得找一个靠谱的服务器,搞半天还不如直接修改本地hosts

    1. 北京移动环境下测试,完全可以直连。
      八成是你有哪里配置错误。

    2. pixiv上了cloudflare的CDN cloudflare的CDN不支持域前置 要手动指向源站

  6. 第一次知道还能这么绕过GFW(捂脸),之前一直是科学上网用户。不过按目前的规定,只要你在中国大陆访问被阻断的内容就是违法的。

    1. 不至于,除非你发表不当言论或者以某种手段盈利。
      不然成千上万科研工作者和程序员要是离开了Google只能用百度,那这些人的工作就可以不用做了(逃

      1. 确实,单纯的看看没人搭理你

    2. Rxinns

      主观回答,可能有错误:

      违法可能确实违法,但是“民不举官不究”,去看看的话没人理你。我认为,gfw也许完全知道我们的一举一动,只不过翻墙进行学术研究和ghs不怎么管,在中国翻墙去外面骂中国的“50万”们才会被抓。

      1. 24k

        而且好像这些50万被抓对外都是说ghs,给足面子了23333

  7. pz

    求问Accesser的build方法,自己做了点改动

    1. 见 https://github.com/URenko/Accesser/wiki/%E5%BC%80%E5%8F%91%E8%80%85%E6%8C%87%E5%8D%97

  8. kit

    实际上无需上述工具。chromium系列浏览器启动参数
    --host-rules="MAP *.a.com b.com[,MAP...]",访问a.com的任意子域名时,tls连接b.com服务器(使用b.com作为sni)。类似参数--host-resolver-rules可以指定域名ip。
    除了映射过多可能会导致启动crash之外毫无问题。

    1. 谢谢补充!

    2. 测试了一下,这样做恐怕是不成立的。设置--host-rules="MAP a.com b.com"后,会把原本发送给a.com的数据包改为发送给b.com;但我们需要的是仍然给a.com发送数据包,只是把包里的SNI信息换成b.com,而这是--host-rules无法实现的。

    3. 又测试了一下,是我的问题,这个思路是可行的,抱歉打扰。

  9. kit

    使用 --host-resolver-rules 设定ip解析(https://www.diggui.com/)
    使用 --host-rules 设定域前置(挂edge代理扩展,查看证书备用名)
    使用 --origin-to-force-quic-on 强制http3(https://http3check.net/)

    1. lit

      从某网站抄的能用的一段bat内容。里面为什么一个网站两个ip?
      @start .\"Google Chrome.lnk" --host-rules="MAP *****.com Megumin, MAP ****.com Eris" --host-resolver-rules="MAP Megumin 104.**.**.91, MAP Eris 178.***.***.***" --test-type --ignore-certificate-errors

  10. 萌新

    按您的操作一步步在Firefox上配置完了Accesser,但打开Pixiv和E站时均提示:
    建立安全连接失败
    连接到 www.pixiv.net 时发生错误。对等端的证书有一个无效的签名。
    错误代码:SEC_ERROR_BAD_SIGNATURE

    希望帮忙解答下是哪出了问题QAQ

  11. 0001

    作者你好,我刚刚用GotoX尝试添加了各种被阻断的站点,包括dmhy,P站,E站,steam商店和社区,全都已经可以直连。但NYAA表站和里站出了问题,我各自给指定了正确的IP后(表站185.178.208.182,里站198.251.89.38),两者均显示522证书错误,换用了多个伪造的sni后还是不行。后来我根据原作者的配置,将表站的sni伪造成same@ddos-guard.net,终于可以直连。但里站我又尝试了伪造成很多不同的sni,还是一直提示证书错误。想问一下,为什么nyaa的必须伪造成特定的sni才能验证证书?里站需要伪造成什么样的sni才能访问呢?

    1. 并不是所有网站都允许任意的SNI。至于nyaa里站,我这边通过方案8进行测试,可以使用任意SNI直连,建议再仔细检查你的GotoX配置。

      1. 水月

        您好,今天ex里站突然无法访问了,我以为更新了缩略图的地址:s.exhentia.org,我加上了您的修改后缀不论加不加都显示为:
        404 无法访问
        不能 "GET CFW"
        无论是通过 https://exhentai.org/ 还是 DIRECT 都无法访问成功
        请问我该如何修改?

  12. v2ray配置域前置的那篇文章似乎打不开了,网上也没有搜索到相关文章,还有什么别的相关文章推荐吗

    1. 我这边可以正常访问,检查科学上网工具是否正常运行。

      1. OK,进去了,似乎是之前使用的代理的ip被ban了

  13. 根据这篇文章的原理,我写了一个SNI伪造工具,可以对一些网站进行无代理FQ,非常感谢,这里是项目的开源地址 -> https://github.com/SpaceTimee/Sheas-Cealer

  14. ExplodingMOSFET

    不确定是什么原因,我这里用Firefox32+Escape上e站已经有相当一段时间可以进得去,也看得到缩略图和封面,但是看不到大图,使用MPV时也不能加载图片。尝试使用梯子也不能加载图片,我推测是因为e站更新了什么导致Firefox32这种老浏览器无法加载图片了,在论坛搜了一下相似问题,菠萝和管理员基本都是回复浏览器太老让你用新的。

    另外最近GotoX和Accesser出现了打开之后反而不能正常访问hentaiverse的情况(显示连接超时),而且关闭之后一段时间内也不能访问hv,也不知道是怎么回事

    1. 无法加载图片是因为Firefox32不接受Let's Encrypt R3证书。解决方案是在escape插件中再添加一条规则:

      website *.hath.network
      sni *.hath.network
      certificate exception √

      即可正常浏览画廊。

      其它工具的问题请到对应工具的项目讨论区进行反馈。

      1. shuiyue123

        今天表站更新后,好像已经不支持Escape的firefox32版本了,会出现连接被重置的现象。
        测试了一下,好像是屏蔽了两个IP地址,导致1和2方式ehentai表站
        无法连接重置现象(就是2方式重装浏览器就无法连接了),但是我也不知道怎么改,3方法我不知道是不是还没用,GotoX还是正常使用。

  15. dev-sidecar也可以修改SNI

  16. 太强了,谢谢大佬的分享,请教一下:
    我是在exhentai开始被sni阻断后,一直用Pixiv-Nginx单独对exhentai实现解决sni阻断的。
    我平时win平台访问境外网站都是用clash的,服务端是自己的日本vps上的xray-core,
    如果不使用pixiv-nginx,而是用clash代理exhentai,那么会被exhentai标识为日本ip,然后部分画廊不可见,比如搜索“白野ジア”,用clash代理只会显示一个画廊,而用pixiv-nginx却能显示16个。
    而问题是,这种方法仅能在clash不使用tun模式的情况下生效,clash使用system proxy的模式,然后将exhentai.org和hath.network设定为仅直连,不会有问题,但是仅能代理支持使用系统代理或自定义代理的程序,部分仅支持直连的程序就无法实现代理
    而tun模式创建一个网卡之后就可以避免前述问题,但是之后即使将exhentai.org和hath.network设定成直连,访问exhentai.org也依旧会被屏蔽画廊
    曾经在clash for windows提交过issue,但是被作者看到后直接close(
    大佬可以帮我解释下为什么会这样吗?

    1. 我基本不使用clash,爱莫能助。

      1. 今天尝试用了下Sheas-Cealer,感觉常驻代理的情况下,这种修改chromium浏览器启动参数的方式,相对于pixiv-nginx这类还要开一个反向代理的方式更不容易出现奇奇怪怪的问题?
        不过可惜的是clash一旦开了tun还是莫名其妙的就会被屏蔽画廊,感觉还是再搭个非日本的vps做节点分流比较靠谱(可惜甲骨文新加坡申请不下来
        欸,反正能正常使用,也懒得折腾tun为什么不行了= =

    2. 今天自己突然找到解决方案了,在这里发出来也许可能万一对谁有点点帮助(大概不太可能吧,找到解决方案后发现其实就这么简单= =):
      Clash在tun模式里 fake-ip-filter里添加exhentai.org和*.e-hentai.org即可= =

  17. Tramast

    感谢作者分享,有两个问题,一个是希望科普下GFW所有的屏蔽手段,还有一个是如Google这样的站点不能使用域前置的如何访问,大佬要是有时间回答我不胜感激,十分感谢。

    1. 1. 我不懂,不敢乱讲;
      2. 见本文第五章第9节。

  18. lit

    Chromium系列浏览器启动参数正确的格式是这个,但是看不懂希望有人把能添加的网站都给加一下

    @start .\"Google Chrome.lnk" --host-rules="MAP *****.com Megumin, MAP ****.com Eris" --host-resolver-rules="MAP Megumin 104.**.**.91, MAP Eris 178.***.***.***" --test-type --ignore-certificate-errors

  19. Paul

    TCPioneer作者,也是H萌娘的主要管理者已经被抓了。软件开发者也要保护自身安全,只要有家人在境内就会被诱骗回国逮捕,和沙特一样。

    1. TCPioneer的作者是macronut,并不是H萌娘的管理员。
      H萌娘的管理员做的事情是添加了一些常用网站的配置文件。
      像H萌娘这种充斥着低水平键怔内容的互联网下水道被重拳出击,在我看来不是一件坏事。
      至于H萌娘从一个讨论R-18词条的爱好者空间逐渐沦为键怔斗士聚集地这件事本身,某些管理员是难辞其咎的。

  20. Harry

    感谢大佬的付出!!很有帮助!!!!

    1. Harry

      最近在用chatgpt,但3月GFW把openai墙了。一开始只是单纯的DNS污染,修改host就能搞定;但最近开始有SNI阻断了。查阅了很多资料都没能找到一个简单的办法绕过GFW,今天按照大佬的第八种办法修改浏览器参数成功连接上openai了。

      1. 印象中OpenAI默认ban大陆IP,即使能在中国大陆直连也没法使用他们的服务。

        1. Harry

          openai只在第一次登录的时候检查是否是大陆ip。只要成功登录一次,留下cookie,后续就可以不挂代理自动登录了。我的情况还比较特殊,openai封了所有VPS服务商的ip地址,导致我通过VPS上自建的代理登录openai时都显示access denied,在这个时候关闭代理刷新页面就能成功登录,算是钻了个空子。

          1. DevilAntivirus

            真的吗?我第一次登录成功后,不挂代理上的话(chat.openai.com)还是会Access denied,是需要像访问exhentai那样先清空cookie再导入登录的cookie吗? 我用的是本文5.9的方法(tcp desync)直连,换成5.8方法的话,会报错SSL/TLS版本不支持

          2. Harry

            这种办法四月份之后就不行了......因为openai官方加大了封锁力度,开始直接封禁大陆ip,拉黑名单了。

          3. Harry

            如果是在VPS上自建代理,可以尝试用cloudflare warp救活。比如一些VPS只有ipv4地址,用cloudflare warp可以给他添加纯净原生的ipv6地址,然后再用如v2ray等代理工具调整一下分流策略,设置使用ipv6地址访问chatgpt官网即可。

  21. sudin

    请问revolter-firefox加载不了图片是怎么回事,不仅是e站,百度,b站这些网站的图片也加载不出来。但是我挂了个梯子e站的图片就能加载出来了(b站,百度的图片还是无法加载),并且关掉梯子后只要不关浏览器图片就能正常加载。

    1. sudin

      关掉梯子也能加载好像是我的梯子有问题,显示是没连接实际还连着。退出梯子后就不能加载图片了

      1. sudin

        没事了,在另一篇文章的评论区找到改host解决的方式了

        1. P3R5T9

          前几天才搜到这篇博文,按博主在文章中所教revolter-firefox 设置方法,我实践操作一波,访问e站也同样加载不出图片,随后赶紧来翻评论区,发现老哥你前几天发的反馈和我有同样问题,刚看老哥你最后发的评论说是参照“另一篇文章评论区提供的改host文件方式已解决”,不知“另一篇文章”是博主发的哪一篇??
          麻烦老哥之后回复甩下具体的博文地址,同时回复下是在“另一篇文章”评论区中发布时间为哪一天的评论有提到改host方法,我看博主的大多数博文评论数很多,怕仔细翻找错过了。。。

          1. sudin

            https://nicebowl.fun/11#C4是这篇,评论你拉到底然后稍微往上翻一下就能看到了

  22. ExplodingMOSFET

    坐标四川电信&移动,最近一段时间以来这篇文章里我用试过的方法(1,2,3,4,8,9)访问exhentai全部失效(但是表站完全正常)。
    近几天偶然发现exhentai貌似更换了ip地址,在 www.ipaddress.com 测试发现exhentai.org域名现在指向两个cloudflare的ip(还有2个ipv6地址)。在hosts中更换exhentai的ip后,使用TCPioneer可以以较低的成功率访问,其他方法在改过ip后仍不能访问,原因不明。
    另外,包括数月前就停止维护的nekoinverter版本在内的各版本的ehviewer都可以在我的网络环境下成功访问里站(大佬的代码是真稳啊),所以我猜测里站最近除了更换了ip,还增加了一些访问限制,不知道大伙的情况怎么样。

  23. vwm

    访问exhentai的工具,山东移动能用:https://github.com/SpaceTimee/Sheas-Cealer

  24. 大佬问下,我在firefox32的表里站界面内用firebug写入cookie之后刷新界面依旧是未登录状态,是怎么回事

  25. rrtt

    tcpioneer现在已经没法直连google了,之前有大佬提到了用DiG GUI(www.diggui.com),想请教一下具体是怎么操作呢,或者在哪里能看到相关教程?

    1. SStan

      这个原项目有一个分支,那个勤奋老哥隔三岔五的会更新config文件。

      1. rrtt

        https://github.com/Manicsteiner/TCPioneer-Hmoegirl
        找到一个,大概是你说的这个?

  26. yihen

    https://github.com/spartacus-soft/spartacus
    这个比TCPioneer更强大,配置文件都不需要了

    1. dyingrt

      有点过于强大了,以至于不是很敢用

添加新评论