让我们来探讨一下如何绕过GFW

让我们来探讨一下如何绕过GFW

2024-10-20
GFW俗称中国网络国家防火墙,它运用多种技术阻断境内对境外某些网站的访问,比如谷歌、Discord。但对于某些阻断方式,通过一些手段,我们可以绕过GFW来进行访问

首先,我们要知道GFW是如何封锁我们的流量的

  1. IP黑洞:目前无解,但仅对部分服务黑洞,如谷歌系(谷歌、推特、YouTube等)

  2. DNS污染:为域名返回一个假的IP。使用hosts文件强制指定域名对应ip或者使用加密的DNS(DoH、DNS 签名等)就可以解决

  3. HTTP劫持:因为流量不是加密的,GFW作为天然的中间人可以直接进行篡改(如:重定向到404页面、劫持到反诈页面等)。可以使用HTTPS连接规避,但你可能会遇到SNI阻断

  4. SNI阻断:在客户端与服务器建立加密连接前,客户端会发送 Client Hello 报文,而这个报文是明文,并且一般都会携带 server_name ,GFW可以知道你要访问哪个网站,对不在白名单(如:discord.com)的域名进行阻断。因为 server_name 实际上是一个扩展,并不强制,你可以不发送它来规避SNI阻断

那么,让我们分析一下GFW对于不同网站的封锁情况

我们使用WireShark进行抓包

继续,尝试发送空 Server Name 报文

成功访问。在WireShark中并未发现 Server Name 字段

那么,有没有什么软件可以帮我们不发送Server Name呢?有的,兄弟有的

方法一:ECH

注意:本方法实际上是启用一个尚未普及的技术:加密SNI。该方法并不能让所有明确被SNI阻断的网站恢复正常访问。尽管客户端(你)支持ECH,若服务器不支持,则在服务器看来那就是一个非法请求,不予受理 如果想要本方法奏效,你需要确保:

  1. 网站托管在Cloudflare或者托管商声明支持ECH
  2. 网站域名被SNI阻断,客户端被发RST包

首先我提供一个网站:https://www.cloudflare-cn.com/ssl/encrypted-sni/#results 这个网站可以查询你的浏览器是否正在使用ECH。进入网站点击 检查我的浏览器 ,待检查完毕后,检查 安全 SNI 一项是否为 如果你为 × ,也不要气馁,我们现在来解决

Edge浏览器

右键桌面的快捷方式点击属性,在目标一栏中添加 --enable-features=EncryptedClientHello 打开设置,搜索DNS,找到 使用安全的 DNS 指定如何查找网站的网络地址 (当前版本我叫这个。反正就是配置DoH的地方) 选择Cloudflare (1.1.1.1) 再次测试即可 (其他浏览器我没测试,应该大同小异,网上搜索一下XX浏览器开启ECH就行) 接下来尝试访问:https://iwara.tv 。你应该能直连了

方法二:Accesser

本方法采用一个神奇的方法来绕过SNI阻断,域前置。原理为客户端先找网站要一张SSL证书,然后再用这个通用证书写好要访问的网站发给服务器,这样,GFW也就看不见你要访问的网站,也就没法进行SNI阻断。 注意:本方法需要在本地运行一个程序并且劫持所有HTTP流量,可能会导致某些正常上网情况下不会出现的问题,请酌情使用

https://github.com/URenko/Accesser

Accesser是一个HTTP代理。它通过中间人的身份处理终端的HTTP出口流量,以绕过SNI阻断。我们正常访问网站时,客户端会发送Client Hello,而这个报文是明文,并且通常会携带ServerName,这个时候GFW就能通过检测ServerName来进行阻断,代替网站向客户端发送一个RST报文重置连接,做到网站被“墙”的效果

而通过Accesser代理后,它会抹掉ServerName然后发送Client Hello。这个时候,如果服务端支持域前置,则会返回客户端一个默认的SSL证书(公钥),然后客户端就能使用这个公钥再次发送一个加密的Client Hello,此时携带上ServerName就不会被GFW阻断了。但是,如果客户端在第一次我们拿公钥的时候拒绝了空ServerName的Client Hello,那这个办法就失效了,不过大部分网站是支持这样做的

Windows

Linux(以Debian12为例)