突破 GFW 的原理
发一篇旧文, 介绍翻墙软件的最底层原理.
我以前经常被层出不穷的翻墙软件新名词整的一头雾水, 这也容易理解, 翻墙软件和墙是相互成就共同进化的. 但这也搞的我不知道该从 ss, ssr, v2ray, trojan, vmess, clash, clashx 等名词里选哪个. 于是我花了点时间研究了一下, 其实所有的翻墙软件最本质的东西都是一样的, 理解了最本质的东西, 各种花里胡哨的名词就不用管了.
首先我们要先明白互联网的本质, 互联网本质就是世界上的电脑相互连接而已, 这么多这么多的电脑连在一起组成的网络, 是需要有很多枢纽设备负责流量的分发 (就像道路需要有路标和交通灯一样) 的. GFW 之所以能够控制封锁流量, 唯一的原因就是它控制了枢纽设备(境内的).
当我们对境外网站的请求流量流经枢纽设备时, GFW 理所当然是知道这个请求的目的地的, 只要发现目的地不是自己所允许的, 就能够对请求加以封锁, 那么要绕过 GFW, 只需要让 GFW 不知道我们在访问什么或者让它认为我们访问的是 “好” 网站就行了. 是的, 所有的翻墙软件, 本质上都是在做这件事.
那具体怎么做呢? “加一层” 真是一个万能方案. 只需要在境外搞台 “好” 主机, 让这台主机帮我们请求 “坏” 网站就行了. GFW 控制不了境外枢纽设备, 所以只能看到我们的请求到了境外那台 ”好“ 主机上, 以为我们只是在跟 ”好“ 主机通信, 就不会再拦截我们的流量了.
然而事情也没有那么的简单, 这里面存在一个问题就是, 境外 ”好“ 主机怎么知道我们请它帮忙访问的是哪个网站呢? 这还是需要我们告诉, 只要我们告诉它帮我们访问什么网站, GFW 就仍然能截获这一信息然后拦截我们的流量. 更悲催的是, GFW 会发现这台境外 ”好“ 主机原来是我们翻墙的帮凶, 因此会把这台境外主机也给封锁了.
那么我们继续要做的就是加密和境外主机的通信, 让 GFW 只能看到流量去了境外主机, 但是无法理解这些信息. 无法理解他就不能随便封锁, 不然影响就太大了, GFW 还没有疯魔到那个程度. 所以 GFW 只能费尽心机的解密我们的通信, 而翻墙软件也在不断的改进加密机制, 让 GFW 无法解密. 二者就这么你高一尺我高一丈的螺旋上升, 相互成就.
至此, 你就已经跟上翻墙软件这个领域的最前沿研究方向了. 是的, 目前所有翻墙软件其实都只在研究一个事情: 设计出 GFW 无法破解的协议. 如果可能的话, 再在软件的性能效率方面锦上添花一些.
---
明白了理论, 下面我们再说说工程实现.
目前市面上所有的机场提供的软件, 本质上都是下面这个拓扑结构:
> local application <--> local proxy <--> remote proxy <--> target host
其中 local application <--> local proxy 这段只发生在你自己电脑上, 这之间通信一般是走 SOCKS5 协议, 这是 TCP/IP 协议族一直以来就存在的代理协议, 其存在时间非常长所以现在几乎所有的基础类库以及应用程序都支持这个协议, 当然它并不是为了对抗 GFW 而设计的, 实际上那时候 GFW 还没有诞生. 代理协议在 TCP/IP 协议栈本来就有其他隐私或者安全方面的用途.
local proxy <--> remote proxy 之间的通信是关键部分, 翻墙软件和 GFW 就是在这个部分斗气化马各显神通的, 所有的翻墙软件的核心区别也在这里, 目前这部分通信协议包括但不限于有:
* SHADOWSOCKS (by Shadowsocks)
* VMESS (by V2Ray)
* Trojan (by Trojan)
* ...
remote proxy <--> target host 就无须多言了.
Post #115
1.36K
- 👍 12
- ❤ 1