前言

本文章仅供用于学习研究,请勿用于不合规不合法用途,否则后果自负,与文章作者无关!!!

我最近搜索了一下GFW的工作原理,故写下这篇文章记录我对GFW的理解。

最新版Chrome已经移除了--host-rules标签,本文方法不再有效。

原理

目前,GFW主要通过三个方面进行屏蔽:IP黑洞、DNS污染、SNI阻断。

IP黑洞

假定google.com的IP是8.8.8.8,IP黑洞就是把所有8.8.8.8的流量指向0.0.0.0,这样就能起到屏蔽网站的作用。

DNS污染

机器只认识IP地址(例如8.8.8.8)而不认识google.com。DNS的作用就是把google.com转换成8.8.8.8。

那么,在你使用DNS(也就是通过google.com访问网站)的时候,把google.com指向0.0.0.0同样可以起到屏蔽作用。

SNI阻断

在现代的网页中已经广泛使用HTTPS,通信内容都会经过加密再发出。所以,GFW是无法通过查看网页具体内容来判断是不是google.com

但是,为了节约开支,8.8.8.8这个服务器可能不仅存有google这个网站,可能还存储了bilibili这个网站(我瞎编的😂)。所以,浏览器通信的时候就要告诉服务器:我想访问google.com,这段信息就是SNI。最重要的是,SNI一般是不加密的。所以,GFW就可以通过匹配关键字来阻止你的访问。

骗过GFW

既然知道了原理,那就可以对症下药。

省流

使用别人成熟的项目

Shader Cealer

Accesser

自己动手

分析

IP黑洞和DNS污染的原理其实很相近。找到一个没有被屏蔽的IP(7.7.7.7),然后告诉浏览器:你不用做DNS解析了,google.com就是7.7.7.7,你访问它就行。这样,我们就能规避IP黑洞和DNS污染。

如果很不幸,google.com的所有IP都被屏蔽,其实也有解决办法:中间人服务器。它的IP没有被屏蔽,我们假定它的IP是9.9.9.9吧。告诉浏览器:google.com就是9.9.9.9。9.9.9.9会帮我们访问8.8.8.8,然后将真正的网页传回给我们。这个过程中我们可没有私自建立信道,用的就是中国电信,因此没有法律风险。

对于SNI阻断,我们可以不向服务器发送“我想访问google.com”,发送“我想访问g.cn”。服务器还是知道你要访问google的,但是GFW匹配不到关键字了,那不就可以绕过监测了吗?或者更直接一点,发送“”,做谜语人,服务器你看着办吧。(如果服务器存了多个网页,这时候一般不会向我们发送任何数据😅)

要实现以上方法,要解决的问题就变成了:

我上哪去找中间人服务器?
我怎么修改SNI信息?
我怎么知道“g.cn”可以访问google?

解决

别急,这里就能解决上面的问题。

https://bulianglin.com/archives/snibypass.html

点击抓取数据后,会列出一大堆网站,你可以按需删减掉不用的网站。例如,如果你不需要images.prismic.io这个网站,把标红部分删除即可。

复制框选部分内容,然后在桌面新建文本文档,在里面粘贴。

1
2
3
@echo off
cd /d "C:\Program Files (x86)\Microsoft\Edge\Application\"
start msedge.exe --host-rules="MAP *google* g.cn,MAP *gstatic.com g.cn,MAP *youtube.com g.cn,MAP *youtu.be g.cn,MAP *.ggpht.com g.cn,MAP i.ytimg.com g.cn,MAP *youtube-nocookie.com g.cn,MAP *blogger.com g.cn,MAP *android.com g.cn,MAP external-content.duckduckgo.com CYFM1,MAP *duckduckgo.com CYFM2,MAP www.ecosia.org www.ecosia.org,MAP api.github.com CYFM4,MAP docs.github.com CYFM5,MAP support.github.com CYFM6,MAP resources.github.com CYFM6,MAP services.github.com CYFM7,MAP community.github.com CYFM8,MAP *github.com CYFM9,MAP objects-origin.githubusercontent.com CYFM10,MAP *githubusercontent.com CYFM11,MAP *greasyfork.org CYFM12,MAP *steamcommunity.com CYFM13,MAP store.steampowered.com CYFM14," --host-resolver-rules="MAP g.cn 34.49.133.3,MAP CYFM1 20.43.160.189,MAP CYFM2 20.43.161.105,MAP www.ecosia.org [2001:67c:2960:6464::ac40:9647],MAP CYFM4 20.205.243.168,MAP CYFM5 185.199.110.154,MAP CYFM6 185.199.108.133,MAP CYFM7 140.82.113.18,MAP CYFM8 140.82.114.17,MAP CYFM9 20.27.177.113,MAP CYFM10 140.82.113.22,MAP CYFM11 185.199.108.133,MAP CYFM12 96.126.98.220,MAP CYFM13 184.50.187.66,MAP CYFM14 23.46.197.62," --test-type --ignore-certificate-errors

我来解释一下,第二行的意思是使用Edge浏览器,应该不会有人电脑没有Edge吧😂。
第三行msedge.exe后面的内容,就是我们刚刚复制的内容。但是经过本人尝试,系统貌似不认太长的命令,所以我移除了部分网站。

保存,修改文件后缀为.bat,双击运行。不出意外的话,浏览器就会自动打开,并且应该可以访问google。

细心的你会注意到,浏览器会提示网页不安全,这是由于我们修改了SNI信息,导致证书不匹配。我们还使用了中间人服务器,谁知道它是不是真的安全呢?谨慎起见,不建议在网页输入密码。