本文旨在整理和总结在互联网上发布的可以被用于解决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.moe/24_1

2.revolter-firefox

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

3.Accesser

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

4.GotoX

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

5.Pixiv-Nginx

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

6.bypass

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

7.v2ray

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

六. 结语

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

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

[数据删除]

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

已有 15 条评论

  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. 北京移动环境下测试,完全可以直连。
      八成是你有哪里配置错误。

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

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

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

    2. Rxinns

      主观回答,可能有错误:

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

  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

添加新评论