博主头像
mxd's Blog

"The quieter you become,the more you are able to hear."

什么是SNI阻断?浅谈SNI阻断,以及你应该怎么做

SNI阻断浅谈

大家好,今天来跟大家聊聊SNI阻断这个网络技术问题。需要注意的是,ESNI现在也可以被阻断。

什么是SNI阻断

SNI,全称为Server Name Indication,是TLS协议的一个扩展。它允许在同一个IP地址上托管多个安全(HTTPS)网站。简单来说,SNI就像是快递柜上的标签,告诉我们每个格子里放的是谁的包裹。

SNI阻断就是指网络服务提供商或其他网络中介通过监控SNI信息,故意阻断与特定服务器的连接。这就像是快递柜被设置了规则,不允许你告诉它你要取的包裹上写着谁的名字,或者它故意不按照你提供的名字来打开格子。

从技术角度说就是一些网络服务提供商或防火墙故意识别TLS握手中的SNI字段,并拒绝或丢弃这些连接请求,从而阻止用户访问某些网站。

被SNI阻断的具体表现

被SNI阻断时,通常会有以下几种表现:

  • 无法访问特定网站:直接导致部分用户无法访问他们需要的网站,比如一些常见的国外网站,像GitHub等。
  • 连接异常中断:在访问过程中,可能会出现连接突然中断的情况,比如长时间下载某个文件后,定时阻断,每次30分钟~1小时,再恢复10分钟,套国内中转才能解决问题。我的亲身经历。访问pixiv也会有这样的情况。
  • 对于用户来说ERR_CONNECTION_RESET,当然Reset掉了有时候也不是sni的阻断,可能还有其他因素。

应对SNI阻断的方法

想要减少、应对SNI阻断,可以尝试以下方法:

  • 使用科学上网:可以加密整个网络连接,使得SNI信息在传输过程中被隐藏,从而绕过SNI阻断。
  • 使用ESNI(Encrypted SNI)(离了大谱了,这玩意现在也可以被阻断)ESNI通过加密客户端问候消息的SNI部分,来保护SNI的私密性。Web服务器在其DNS记录中添加一个公钥,客户端使用该公钥来加密SNI记录,以便只有特定的服务器才能解密它。
  • 使用ECH(Encrypted Client Hello):ECH是ESNI的后继者,它不仅加密SNI,还加密整个Client Hello消息。ECH使用依赖方(如Web浏览器)需要事先知道的公钥对有效负载进行加密,这意味着ECH对于浏览器供应商事先已知的大型CDN最有效。
  • DNS over HTTPS (DoH):DoH是一种安全协议,它通过HTTPS来加密DNS查询,从而防止DNS查询被篡改或监视。这可以作为对抗SNI阻断的一种补充手段,因为它增加了访问的隐私性。
  • 域前置(Domain Fronting):这是一种技术,通过将流量伪装成流向一个不同的、未被阻断的域名,来绕过SNI阻断。这种方法的有效性取决于服务器如何响应无效的SNI请求,如果服务器在收到混淆的SNI数据包后仍然返回一个有效的证书,则该方法有效。本文下方列出了一个基于Chromium内核浏览器的操作方式给大家参考。

SNI阻断的原理

  1. 识别SNI:当用户访问一个使用HTTPS的网站时,客户端在发起SSL/TLS握手时,会将目标网站的域名发送给服务器。
  2. 拦截与分析:中间的网络设备可以读取这些SNI信息。
  3. 决策阻断:根据SNI信息,网络服务提供商可能选择阻止与特定域名的连接请求。

🔍 如何检测我的网络连接是否受到SNI阻断?

  1. 使用命令行工具

    • curl:可以使用curl命令来测试连接。例如,使用以下命令:

      #这里的example.com是个示例,国内不墙www.example.com.
      curl --resolve www.example.com:443:104.21.69.162 https://www.example.com -iv

      如果连接被阻断,通常会返回错误信息。

    • openssl:使用openssl命令来测试TLS握手。例如:

      openssl s_client -connect 23.56.20.124:443 -servername example.com

      如果连接被阻断,输出会显示没有证书信息,例如:

      no peer certificate available
      SSL handshake has read 0 bytes and written 315 bytes

      如果连接成功,会显示证书信息。

  2. 使用网络监测工具

    • Wireshark:Wireshark是一个强大的网络监测工具,可以捕获和分析网络数据包。通过捕获TLS握手过程中的数据包,可以查看SNI字段及其响应情况,从而判断是否存在SNI阻断。
  3. 在线检测服务

    • 一些网站提供SNI检测服务,可以方便快捷地检查某个域名是否受到阻断。例如,可以访问一些专门的检测网站,输入目标域名进行检测。

ESNI与SNI的区别

ESNI和SNI主要有以下区别:(ESNI也可以被阻断)

  • 加密程度:SNI以明文形式传输,容易被中间人窃取和篡改;而ESNI通过加密SNI部分,保护了SNI的私密性。
  • 部署难度:SNI的部署相对简单,只需要客户端和服务器支持TLS即可;ESNI的部署需要服务器在DNS记录中添加公钥,并且客户端需要支持ESNI扩展。
  • 互操作性:SNI的互操作性较好,几乎所有现代浏览器和服务器都支持;ESNI的互操作性较差,目前只有部分浏览器和服务器支持。

域前置

域前置(Domain Fronting):域前置技术利用某些服务器不验证SNI的特点,给防火墙和服务器一个假的SNI。例如,P站的服务器设置的默认证书正好是颁发给*.pixiv.net的泛域名证书,因此无论请求什么,返回来的证书总是能用的。

  • 配置浏览器启动参数:以Chromium内核浏览器为例,可以通过配置浏览器启动参数来绕过SNI阻断。例如:

    --host-rules="MAP example.com HostA" --host-resolver-rules="MAP HostA 1.2.3.4" --ignore-certificate-errors

    这里的HostA1.2.3.4是未被屏蔽的域名和IP地址。

希望这些方法能帮助你检测和应对SNI阻断。如果你还有其他问题,欢迎在评论区留言讨论。

什么是SNI阻断?浅谈SNI阻断,以及你应该怎么做
https://blog.mxdyeah.top/mxdyeah_blog_post/what-is-sni.html
本文作者 mxdyeah
发布时间 2024-09-30
许可协议 CC BY-NC-SA 4.0
发表新评论