VPN 与 Shadowsocks 扫盲科普

很多人一提到 VPN 和 Shadowsocks,只是大概知道它们可以爱国上网,对于背后的原理并不太了解。本文也不会讲太多底层协议,主要是概述一下两者的区别,以及相关名词。

首先说结论,如果你租了一台境外的主机,能用 Shadowsocks 就绝对不要用 VPN,当然直接选购爱国上网的软件时也是如此,因为 VPN 不方便配置规则,也更容易被封。

所谓的配置规则是指,使用 Shadowsocks 时可以配置一个规则列表,只有满足规则的特定网址才走代理,对于百度/淘宝等一系列国内网站则直接连接。这样可以节省流量,加快访问速度,对用户完全透明。为什么 Shadowsocks 可以配置规则,VPN 就无法配置呢?带着这样问题,本文简单解释一下。

首先 VPN 的含义是指虚拟专用网络,一般来说如果我们在公网,需要访问企业内网,就需要一个 VPN 服务器做代理,所有指向企业内网的请求都由这台 VPN 服务器负责代理转发,这样无需我们的电脑能访问内网,只要 VPN 服务器可以访问内网即可。如果把这里的内网换成境外网站,就是 VPN 能用于爱国上网的原理。

VPN 只是一个概念,它的本意是建立虚拟私有网络,它可以通过多种协议来实现,比如 L2TP 协议或者 IPSec 协议,但在爱国上网范畴内,这些协议则是扮演了代理的作用。至于另一个很有名的协议,socks 协议(没错,就是 Shadowsocks 最后的 socks,因为是先有 socks 协议才有 Shadowsocks)则是一个标准的代理协议,它和前两者的区别在于,它是一个传输层的协议,能够利用 TCP/IP 协议。而 L2TP 和 IPSec 协议则是非常底层的协议,前者在数据链路层,后者在 IP 层。

接下来聊聊 Shadowsocks 协议,从它的名字就能看出来它是基于 socks 协议实现的,这里盗用冬瓜大神博客里的一张图来简单说明 Shadowsocks 协议的工作原理:

当我们在本地打开 GoAgentX 等应用时,实际上是启动了一个名为 sslocal 的本地进程,左侧绿色的 Socks5 Client 可以是浏览器,也可以是 git 或者 curl 命令等,它们之间的传输通过 socks 协议实现。sslocal 是一个实现了 socks 协议的代理服务器,并对标准 socks 协议做了一些改造:当 sslocal 进程获取请求后,它会将请求加密,发送到 ssserver 上,这样就不会被防火墙识别。ssserver 拿到数据后会解密,发送原始请求到目的地址,再将请求结果加密返回。

因此,整个 Shadowsocks 方案由 socks 代理 加上 sslocal 到 ssserver 加密通信 以及 ssserver 还原请求这三部分组成。注意 Shadowsocks 是没有配置规则这个概念的,它对于 Client 来说是透明的,只要 Client 选择了使用 socks 代理,并把地址指向本地的 sslocal 进程,就会走到 Shadowsocks 的这套流程(当然 Client 还是以为自己只用了 socks 协议)。

我们平时接触到的带规则配置一般只有两种场景,一个是系统的 PAC 文件,另一类则是 Chrome 之类的 App。

先说说 PAC 文件,它的全名叫 Proxy Auto Config,是一个系统级别的代理规则配置表,本质上就是一段用 JavaScript 写成的脚本,脚本中会列出一堆网址,并且指定这些网址的请求方式,比如:

var proxy = "SOCKS5 127.0.0.1:1080; DIRECT;";

这里的 proxy 就表示先尝试用 SOCKS5 协议代理到 127.0.0.1:1080,不行再直接连接。一旦给系统配置了 PAC 文件,对于任意网络请求,系统都会调用 PAC 里的脚本,得到它的请求方式。

Chrome 之类的浏览器也是类似的原理,通过插件来判断请求的地址,然后选择代理方式。

再次强调,Shadowsocks 并不存在配置规则的概念,它只是一种对应用层透明,但进行过改造的 socks 协议,只有操作系统或应用程序能够支持配置规则,其实就是自行选择是否使用 socks 代理。

那么按照这个分析,理论上讲 VPN 也是可以配置的,只要应用程序可以选择是否使用 L2TP/IPSec 之类的协议就行了。然而,前文已经说过,这类协议非常底层,以 IPSec 为例,如果想用它,就得自己实现传输层的协议(TCP 或者 UDP),这个难度难如登天。在一个操作系统中,TCP/UDP 协议的实现都是系统自带的,因此对于运行在更底层的 L2TP/IPSec 这类协议而言,只有操作系统会提供默认实现,没有任何一个 App 会提供对它的支持。

打开网络设置我们就会看到,VPN 是独立于 Wi-Fi/有线连接的另外一种连接方式,而 socks 代理仅仅是诸多代理方式的一种。

希望通过本文,读者能了解 VPN、Shadowsocks、socks 等名词的含义以及简单的工作原理,下面两章会介绍如何在移动端和 Mac 平台上搭建完全透明的网络代理,享受最优雅的爱国上网体验。

results matching ""

    No results matching ""