跳转至

域前置

简介#

TLS 握手时发送的 Client Hello 消息,通常会包含 SNI 扩展信息,这个信息含有网站域名,所以 GFW 等审查防火墙能识别用户连接的网站,并且对部分网站进行 RST,发送终止连接的信号。

域前置Domain fronting是发送虚假或空白 SNI 给服务器的反审查方案。1 由于 SNI 本身属于扩展协议,所以不正确的 SNI 或者没有 SNI,可能会触发服务器的兼容性功能,从而返回默认的或通用的证书,允许连接建立。(属于一种向前兼容)

将 SNI 加密#

不过部分群体自己调整 TLS 协议的 SNI 扩展部分,以不被中间人攻击。还是从上层扩展 TLS 协议,直接修补漏洞才是更好的方案。

2018年8月12日,互联网工程任务组IETF编写了 Encrypted Server Name Indication for TLS 1.3 草案(简称 ESNI), 用来解决 SNI 被明文传输的问题。2

2018年9月24日,在草案完成后不久,Cloudflare 就率先支持了 ESNI。3 Mozilla 也在 2018年10月18日,在 Firefox Nightly 中支持了 ESNI(须在 about:config 里手动开启)。[^90628]

2020年6月1日,IETF 在第 7 版 ESNI 草案里,转换了方向,将 TLS 的 Client Hello 握手消息给加密起来。 所以就更名为了 TLS Encrypted Client Hello,简称 ECH。4

2020年7月30日,ESNI 被 GFW 封禁,具体情况是含有 ESNI 扩展的 TLS 握手完成后(具体是 0xffce 扩展标识),连接会被切断, 然后该 IP 地址将的 TCP 连接会被阻止 2 或 3 分钟。567

2020年12月8日,Cloudflare 表示将为 ECH 做好准备,一旦准备好,就不会再支持 ESNI。8 Mozilla 也在 2021年1月7日 的博客里提到,Firefox 85 里将使用 ECH 取代 ESNI,about:config 里的 ESNI 选项将不复存在。9

Google Chrome 的情况不是很明确,有消息说早在 2020年10月20日,Google Chrome 就为浏览器添加了 ECH 功能, 须在 chrome://flags 页面里手动启用。10

2021年10月12日,Cloudflare 开始 TLS ECH 的初步部署,最初上线特定地理区域的免费用户,之后将扩展。11

2023年8月25日,Firefox 预告了即将正式内置 ECH 的消息。12

2023年9月5日,GFW 全面屏蔽了 Cloudflare 运营的 DoH https://1.1.1.1 的 TCP/443。而 ECH 需要 DoH, 当前的 Chrome 本来仅有 https://1.1.1.1 可以使用,这样的封锁被认为是应对即将全面上线的 ECH。13

2023年9月12日,Chrome 117 正式版添加了 ECH 功能,需要启用 DoH 以及在 chrome://flags 中开启 encrypted-client-hello 选项。141510

2023年9月17日,Cloudflare 运营的 DoH:https://1.1.1.1 突然被 GFW 解封,原因不明。13

2023年9月29日,Cloudflare 为所有免费计划的用户启用了 ECH,并且无法关闭,这意味着大量网站都启用了 ECH 功能。16

2023年10月1日,GFW 再次封禁了 Cloudflare 运营的 DoH:https://1.1.1.1,除了一些电信用户, 其他网络基本都会重定向到「中国国家反诈中心和工信部反诈中心」。17 直到 2023年10月30日,1.1.1.1 才恢复。18

2023年10月11日,Cloudflare 的全局 ECH 功能突然从全球下线,并且无法手动启用,同时下线的还有 Early Hints。 (2023年11月22日,Early Hints 恢复启用。)Cloudflare 并且没有给出详细的说明,只是说需要解决许多问题, 并于 2024 年的年初推出测试版。19

2023年10月24日,Firefox 119 正式添加了 ECH 功能(需先启用 DNS over HTTPS)。20

然而 Cloudflare 并没有根据这个时间表,在 2024 年的年初推行 ECH。2024年5月,Cloudflare 团队在社区里回答 「什么时候推出 ECH」时,给出了「我们没有预订执行时间」的答复。21 也许短时间内,ECH 都不会大规模使用吧。

域前置的后续#

2016 年开始,IM 软件 Signal、Telegram 使用了域前置规避审查,来解决被部分地区封锁的问题,2018年4月14日, 由于俄罗斯大规模封禁 Google 和 Amazon 云的 IP,尝试禁止这些软件,所以 Google 和 Amazon 禁用了域前置, 云运营商给出的理由是「安全问题」。这标志依附的自由策略逐渐失效。22

域前置浏览器#

通常域前置被作为一些软件独特的反审查方式,不过有开发者觉得域前置可以直接添加到浏览器上,这样就相当于一种翻墙浏览器。

revolter-firefox 就是这样的浏览器,开发者 Xmader 魔改了网络安全相关的二进制文件,使其默认不发送 SNI。23

然而开发者在 2019年10月 前删库,原因不明。24

Chromium 启动项#

有开发者,继续开发了简单、通用的 Windows SNI 伪装工具:Sheas-Cealer。 一个软件加上 Chromium 系列浏览器,配置也很简单,就能实现裸连 Google、Pixiv、Steam 和 Telegram 的效果, 并且能轻松添加新域名。

原理是 Chromium 系列的 --host-rules 参数:25

chrome.exe --host-rules="MAP example.com example.org" --host-resolver-rules="MAP example.org 192.0.2.0" --test-type --ignore-certificate-errors

上面的启动项里,将 example.com 映射到 example.org,然后 example.org 解析到 IP 192.0.2.0,最后是忽略证书错误。 但是不知道是错误还是特性,浏览器会发送 example.org 的 SNI 扩展信息请求,从而实现轻松伪装 SNI。

Sheas-Cealer GitHub 仓库地址:https://github.com/SpaceTimee/Sheas-Cealer。需要注意的是,软件 UI 不够易懂, 需要点击左上角的按钮,切换到「文件路径」,填写浏览器的路径才能开始使用。

附言:SNI 伪装工具还有 AccesserGotoX, 但是用法相对复杂一些,可能需要多种软件配合使用。

附言 2:原理真的很简单,GPT-4o 也可以轻松制作一个网页版:Chrome 域前置启动项生成器, 填入 Sheas-Cealer 的 YAML 格式规则, 应该就能在其他平台使用了。


  1. https://en.wikipedia.org/wiki/Domain_fronting 

  2. Eric Rescorla, Kazuho Oku, Nick Sullivan 与 Christopher A. Wood, Encrypted Server Name Indication for TLS 1.3, Internet Engineering Task Force, Internet Draft draft-ietf-tls-esni-00, 9月 2018. 参照: 2024-06-11. [Online]. 

  3. Matthew Prince, Encrypting SNI: Fixing One of the Core Internet Bugs, The Cloudflare Blog, 2018-09-24. (参照 2024-06-11). 

  4. Eric Rescorla, Kazuho Oku, Nick Sullivan 与 Christopher A. Wood, TLS Encrypted Client Hello, Internet Engineering Task Force, Internet Draft draft-ietf-tls-esni-07, 6月 2020. 参照: 2024-06-11. [Online]. 

  5. onoketa, [TLS] Possible blocking of Encrypted SNI extension in China, ietf email, 2020-07-30. (参照 2024-06-11). 

  6. iYouPort, 《报告:中国的防火长城已经封锁加密服务器名称指示(ESNI)》, iYouPort, 2020-08-08. (参照 2024-06-11). 

  7. Kevin Bock 等, 《揭示和规避中国对加密SNI(ESNI)的封锁》, GFW Report, 2020-08-06. (参照 2024-02-07). 

  8. Christopher Patton, Good-bye ESNI, hello ECH!, The Cloudflare Blog, 2020-12-08. (参照 2024-06-11). 

  9. Kevin Jacobs, Encrypted Client Hello: the future of ESNI in Firefox, Mozilla Security Blog, 2021-01-07. (参照 2024-06-11). 

  10. davidben 与 dadrian, TLS Encrypted Client Hello (ECH), Chrome Platform Status, 2023-12-12. (参照 2024-06-14). 

  11. Christopher Wood 与 Christopher Patton, Handshake Encryption: Endgame (an ECH update), The Cloudflare Blog, 2021-10-12. (参照 2024-06-11). 

  12. Dennis Jackson, Intent to experiment and ship: Encrypted Client Hello, Google Groups, 2023-08-25. (参照 2024-06-14). 

  13. 风向旗参考快讯, 由 Cloudflare 运营的 1.1.1.1 WARP 官网站点 HTTPS 访问今日下午被墙……, Telegram, 2023-09-05. (参照 2024-06-14). 

  14. David Adrian, Intent to Ship: TLS Encrypted Client Hello (ECH), Google Groups, 2024-02-21. (参照 2024-06-12). 附言:这段文字需要多个链接证明,是因为 Chrome 117 更新日志没有提及 ECH 更新,而在 Google Groups 里的开发者邮件交流中,有提到将在 117 版本正式。最后是 Chrome Platform Status 的资料,详细介绍了 ECH 在 105 版本 Dev Trial,然后 115 到 116 是 Origin Trial,最后在 117 Shipping 

  15. Adriana Jara, New in Chrome 117, Chrome for Developers/blog, 2023-09-12. (参照 2024-06-14). 

  16. Achiel van der Mandele, Alessandro Ghedini, Christopher Wood 和 Rushil Mehra, Encrypted Client Hello - the last puzzle piece to privacy, The Cloudflare Blog, 2023-09-29. (参照 2024-06-11). 

  17. LoopDNS资讯播报, 中国主要网络运营商对“Cloudflare DNS 1.1.1.1”实施访问限制, Telegram, 2023-10-01. (参照 2024-06-14). 

  18. GreatFire, 《1.1.1.1 在中国 100% 被封锁》, GreatFire.org, 2023-10-. (参照 2024-06-14). 

  19. smarsh, Early Hints and Encrypted Client Hello (ECH) are currently disabled globally, Cloudflare Community/Security, 2023-10-11. (参照 2024-06-14). 

  20. Firefox 119.0, See All New Features, Updates and Fixes, Mozilla, 2023-10-24. (参照 2024-06-14). 

  21. When will ECH be available to all planned users? - Feedback / Feature Request Submitting & Feedback, Cloudflare Community, 2024-03-27. (参照 2024-06-14). 

  22. https://en.wikipedia.org/wiki/Domain_fronting 

  23. Xu-Ming, revolter-firefox/revolter-firefox,. revolter-firefox, 2024-02-04. 参照: 2024-02-07. [Online]. 

  24. 095448a, 《解决 SNI RST 的新方式》, 2047, 2019-07-27. (参照 2024-02-07). 

  25. NiceBowl, 《通过配置Chromium系列浏览器启动参数以解决DNS污染与SNI阻断》, NiceBowl的博客, 2022-02-04. (参照 2024-06-19). 

(由于更新时间是手动更新的,所以部分页面内容已更新,但忘记修改新的日期了……)