在某些特殊时期,我们的科学上网工具不太好使的时候,我们还有要经常上github找资源、浏览v2ex和查询维基百科的需求,我们可以通过绕过GFW的SNI阻断来避免一些简易网站访问难的问题。
支持的站点
完整列表https://github.com/URenko/Accesser/blob/master/accesser/pac
GFW的过滤规则
轻度污染级别
DNS污染:
我兔通过通知运营商、国内的DNS服务商(运营商DNS、公共DNS等)对指定的域名请求进行污染,使之查询不到一个正确的IP,从而使我们没法访问。
你可能说我们在电脑、路由器里设置国外的dns就能解决?NO,没用。
国外的DNS只会徒增你的查询时间,降低网络体验,而且污染问题得不到解决。因为dns查询所用的53端口已经被劫持了,所以你用国外dns和运营商dns是一样的(传统dns查询)。解决方法:使用国外、权威和加密的DNS查询。如使用DoT,DoH,DoQ等代替传统dns查询,解决污染。
解决方案:
部署、使用加密DNS服务器最简单的方法是在局域网内搭建一个加密DNS服务器的中转站,局域网下的其它设备依然使用传统dns查询,但是传统dns查询的ip地址指向的是局域网dns服务器。
一般我们使用 AdGuard Home
它的用法可参考这几篇文章:
AdGuard Home 中文指南 - TimochanのBlog
由于这种污染级别实在是太低了,我们绕过它也极其容易,目前已经很少单独使用了。往往是轻度污染级别+中度污染级别一起出现使用。
中度打断级别
如果你侥幸绕过了DNS污染,正确获取到了服务器的IP,GFW就拿你没办法了吗,你就可以名言正顺的访问被墙的网页?NO!只要我检测到你在访问黑名单页面,我一样可以Ban掉。
怎么发现我们在访问黑名单网站呢?
通过对请求头的host进行判断在不在白名单内的IP+黑名单的域名。
curl 172.67.3.188 -H “host:www.v2ex.com“
如果IP在白名单内(对应的域名肯定都在白名单),那当然皆大欢喜,全部放行。
如果是非黑白名单IP+非白名单域名,那就给你定期打断。如github.com的定时抽风。
如果是非黑白名单IP+黑名单域名,那就给你一直打断TLS握手,让你没办法完成TLS握手,重置连接,无法访问。
对于一般的网站,这种方法足够了。
如果是黑名单IP,那就丢进路由黑洞,下文会有解释。
SNI阻断:
SNI域名阻断(Server Name Indication Domain Blocking)是一种用于在网络上屏蔽特定网站的技术手段。SNI是Transport Layer Security(TLS)协议的一部分,它允许客户端在与服务器建立加密连接时传输所需访问的网站域名信息。SNI域名阻断利用这一特性,通过检查网络传输中的SNI字段,阻止用户访问特定的网站。
SNI域名阻断通常由网络管理员、政府或互联网服务提供商(ISP)实施,目的是限制或屏蔽特定网站的访问。这可以用于防止用户访问敏感内容、限制言论自由、打击非法网站或控制互联网使用等目的。然而,SNI域名阻断也引发了一些争议,因为它可能影响用户隐私、言论自由和互联网开放性。
HTTPS(更准确来讲是TLS)有一个扩展,使得在Client Hello阶段,浏览器会向服务器明文发送要访问网站的域名。而GFW根据这一原理对特定的SNI进行阻断,这就是俗称的SNI阻断。更多的可以去看:维基百科,看完秒懂什么是SNI - 知乎 (zhihu.com)
解决方案:域前置(Domain Fronting)代理技术。
就是利用有的服务器不验证SNI的这一特点,给GFW和服务器一个假的SNI进行前置代理。因为GFW没有私钥,只能通过SNI和IP判断你要访问的网站,而假的SNI就能欺骗GFW。但服务器本身有私钥,解开后,服务器是通过HTTP请求头判断你要访问哪个网站的。(但注意,特殊的比如虚拟主机、Cloudflare免费版等能在一个IP上部署多个证书的,是一定要SNI的,否则会出错。这种唯一的绕过办法就是ESNI,如果有空的话,以后再讲)因此可以通过这种方式绕过GFW的SNI阻断。
重度黑洞级别
GFW针对特定的IP段直接进行路由黑洞处理(BGP路由劫持的最高形式)。
因为 BGP 是基于互连网络真实表述它们拥有的 IP 地址这一事实,所以 BGP 劫持几乎是无法停止的。
路由劫持
什么是 BGP 劫持?-腾讯云开发者社区-腾讯云 (tencent.com)
路由黑洞
一条路由无论是静态还是动态,都需要关联到一个出接口,在众多的出接口中,有一种接口非常特殊,即Null(无效)接口,这种类型的接口只有一个编号0,类似(交换机、路由器)的出接口Interface g或e 0/0/0; Null0是系统保留的逻辑接口,当转发网络设备在转发某些数据包时,如果使用出接口为Null0的路由,那么这些报文会被直接丢弃,就像直接丢进一个黑洞里,永远无法到达,因此出接口为Null0的路由被称为黑洞路由。
到了这一级别的最强黑名单,黑上黑级别的,那甚至不需要污染域名和sni了,根本连不上!(dns污染也经常是将被污染的域名直接指向这一类IP以达到污染的目的)。当然,这种方法封禁是最彻底的,成本也是最高的。需要在路由器上设置跳过路由的自动学习,手动添加黑名单IP段、出口。
解决方案
使用科学上网工具代理(代理的IP需要不在黑名单内,且可以访问目标IP)
使用工具绕过SNI阻断
下载和运行URenko/Accesser:
URenko/Accesser: 🌏一个解决SNI RST导致维基百科、Pixiv等站点无法访问的工具 | A tool for solving SNI RST (github.com)
需要先安装Python3.10及以上更高版本
1 | pip3 install -U accesser[doh,doq] |
如果我们不需要 DNS-over-HTTPS 和 DNS-over-QUIC,则可以不用带[doh,doq]
。
然后通过如下命令启动:
1 | accesser |
对于Windows系统,默认情况下(没有指定--notsetproxy
)会设置PAC代理为http://localhost:7654/pac/?t=<随机数>
,如果没有可以手动设置。
此外,对于Windows系统,默认情况下(没有指定--notimportca
)会自动导入证书至系统(第一次运行命令会弹框询问,选择是),如果没有可以手动导入,请看这里。
支持的站点列表:
编辑配置文件
编辑命令执行路径下的config.toml
我们一般只需要修改DNS部分即可,当然,如果你没有部署无污染的DNS服务器,或者说它预置的DNS服务器你(有其一)都可以访问也是不需要修改的。
1 | nameserver = [ |
因为我的内网有一台安全的DNS服务器,IP是192.168.31.53,所以这里我就把其它的dns全部注释了,使用内网dns服务器加快查询速度
保存设置,重启服务 Enjoy it!
附:在手机上使用:
确保手机与服务器同属于一个局域网。
编辑命令执行路径下的config.toml
找到[server]的address,改为
address = “0.0.0.0”
将pac_host = “127.0.0.1”设置为代理的局域网ip地址。
在手机上的WiFi进行如下设置: