提到翻墙(现在应该说“科学上网”或者“爱国上网”),有几个词很常见,即vpn、vps、Proxy和shadowsocks。我刚接触翻墙那会儿,对这个词的意思非常混淆,傻傻分不清。想必不仅是我,不少新手应该都有过这样的困惑。这里,我们就在尽可能忽略那些晦涩难懂的技术细节的情况下,简单地讨论下这个问题。
翻墙原理
在讨论vpn、Proxy这些之前,我觉得有必要先提一下目前主流翻墙手段的实现原理。
GFW实现网络封锁的手段主要有两种:dns劫持和ip封锁(除此之外,还有dns污染和关键词过滤,这里我们不讨论)。
Dns劫持:ip是网络上各主机的“地址”,要想访问“别人家”,当然得要有地址。但ip是一串数字,是给电脑看的,人记起来太麻烦,所以就有了域名(也就是我们常说的网址)和 dns(网域名称系统,Domain Name System)。域名是一串英文字符串,方便人记忆。dns将域名和ip关联起来,形成映射。用户访问域名所在的目标网站前,将域名发给dns服务器询问这对映射关系,拿到对应的ip后就可以在茫茫网海中找到那个“她”了。而GFW所做的就是站在用户和dns服务器之间,破坏它们的正常通讯,并向用户回传一个假ip。用户拿不到真正的ip,自然也就访问不到本想访问的网站了。
Dns劫持是GFW早期唯一的技术手段,所以那个时候的用户通过修改Hosts文件的方式就可以零成本突破封锁了。
ip封锁:dns劫持之后,GFW引入了ip封锁,直接锁住了访问目标网站的去路,用户发往被封锁ip的任何数据都会被墙截断。这个时候,依靠类似于修改Hosts文件这种低成本方法突破封锁就显得有些天方夜谭了。那么,解决办法是什么呢?答案是:在第三方架设翻墙服务器,中转与目标服务器间的来往流量。目前为止,GFW采用的是黑名单模式,像Google、Facebook这种在黑名单上的网站的ip无法访问,而不在黑名单上的第三方不记名ip可以。于是,一切就很明朗了,我们目前几乎所有的翻墙手段都是基于上述原理实现的,vpn是,shadowsocks是,还有一些比较冷门的(比如v2ray)同样如此,只不过它们的技术细节不同(这个我们不会深入)。
VPN
Vpn,全称“虚拟私人网络(Virtual Private Network)”,是一种加密通讯技术。vpn是一个统称,它有很多的具体实现,比如PPTP、L2TP、IPSec和openvpn。vpn出现远早于GFW,所以它不是为了翻墙而生的。我上面说了,vpn是一种加密通讯技术,它被设计出来的目的是数据传输安全和网络匿名。
而既然不是为翻墙而生,那从翻墙的角度上讲,vpn协议就存在诸多问题。最严重的一个就是流量特征过于明显。墙目前已经能够精确识别绝大部分vpn协议的流量特征并给予封锁,所以,vpn这种翻墙方式基本已经废了。
但即便如此,vpn作为过去很长一段时间最主流最热门最常用最为人所知的翻墙手段,已然成为翻墙的代名词。即便是vpn已不再常用的今天,当人们谈及翻墙的时候,说得最多的仍是:“你有什么好用的vpn吗?”。
Proxy(代理)
反向代理
Proxy(代理)又分为正向代理和反向代理。翻墙所用的代理都是正向代理。反向代理的作用主要是为服务器做缓存和负载均衡。这里不做过多讨论,感兴趣的朋友可以看这里。
顺带一提,shadowsocks里也有负载均衡的概念,但shadowsocks的负载均衡和反向代理的负载均衡不是一个概念。反向代理的负载均衡是指:在多个真正的服务器前架设一个代理服务器,用户所有的数据都发给代理服务器,然后代理服务器根据各个真实服务器的状态将数据转发给一个任务较少的服务器处理。这样,服务商既可以架设多个服务器分担任务、减轻压力,用户也只要记一个域名或ip就可以了。而shadowsocks的负载均衡是指:每隔一段时间更改一次翻墙服务器,将用户的数据平均发给多个不同的翻墙服务器,以避免发往某一个翻墙服务器的流量过多。
正向代理
正向代理主要有HTTP、HTTP over TLS(HTTPS)、Socks、Socks over TLS几种。其中,HTTP和Socks无法用于翻墙,HTTPS和Socks over TLS可以用于翻墙。不过,Socks over TLS几乎没人用,我们这里就不多说了。
Proxy的历史同样早于GFW,它最早被设计出来的目的当然也不是翻墙。正向代理最主要的目的和vpn差不多,都是用于匿名,但HTTP和Socks不能加密,只能匿名,HTTPS既可以匿名,也可以用于加密通信。
从理论上讲,四种代理协议都可以通过“用户先将数据发给代理服务器,再由代理服务器转发给目的服务器”的方法达到翻墙目的。但由于HTTP和Socks都是明文协议,GFW可以通过检查数据包内的内容得知用户的真实意图,进而拦截数据包。所以,HTTP和Socks一般只用作本地代理。而HTTPS协议是加密通讯,GFW无法得知数据包内的真实内容,类似于关键词过滤的手段无法施展。
不仅如此,HTTPS代理的流量特征和我们平时访问网站时所产生的HTTPS流量几乎一模一样,GFW无法分辨,稳定性爆表。
理论上讲,HTTPS代理无论是安全性,还是在隐匿性,都要比目前最为流行的shadowsocks好。事实上,在所有已知的翻墙协议中,无论是vpn协议,还是代理协议,它应该都是最好的。v2ray的vmess over tls也许能和HTTPS代理媲美。但v2ray存在的时间较短、使用者较少、社区也没有HTTPS代理活跃(从全球范围上看),故而,相比于HTTPS代理,vmess协议潜在的安全漏洞可能要多。
当然,HTTPS代理也有它的缺点,其中最大的缺点就是配置复杂。即便能用默认参数就用默认参数,用户自己只作最低限度的配置,对新手而言,这也是一个无比痛苦的过程。更别说,想要正常使用HTTPS代理,你还要购买域名和证书这些,非常麻烦。所以,即便是在shadowsocks出现之前,HTTPS代理也没在大陆流行起来。这也是造成v2ray的小众的主要原因之一(另一个是用户没有从shadowsocks迁移到v2ray的动力),它的配置同样相当复杂。除此之外,HTTPS代理只能转发tcp流量,对udp无能为力。
VPS
再来说说vps。
大家不妨想一个问题:我们平时上网浏览网页,我们访问的那些网页都是哪来的?答案很简单,从另一台电脑上下载下来的。无论是用户平时所使用的个人pc,还是用于搭载网站的服务器,本质上都是电脑。但与个人pc不同,被用作服务器的电脑必须做到24小时开机在线,以确保能在任何时候回应用户的请求。而vps,就是不会关机的电脑。
VPS(Virtual private server,虚拟专用服务器)是由vps提供商维护,租用给站长使用的“不会关机的电脑”。vps不是一台台独立的电脑,而是将一台巨型服务器通过虚拟化技术分割成若干台看似独立的服务器。这台巨型服务器不间断运行,被分割出来的小服务器也跟着不停的运作,站长租用其中一台小服务器,搭载上自己的站点,就可以等着用户访问了。
那么,个人电脑能不能做服务器呢?当然可以!我上面说,“与个人pc不同,被用作服务器的电脑必须做到24小时开机在线,以确保能在任何时候回应用户的请求。”这句话反过来看,如果个人pc能做到24小时在线,它同样也可以用作服务器。事实上,有不少个人网站就是搭载在家中闲置的电脑上的。同时,还有人选择用树莓派、个人NAS建站。但是,由于大陆的ISP运营商面向普通网民提供的是动态ip,绑定域名很不方便,再加上宽带上网上下行网速不对等、网络稳定性不高等问题,大部分人还是选择使用vps建站。(除此之外,前一段时间,政府下达了新政令,要求运营商封禁个人宽带网络的443端口和80端口,至此,个人pc建站几无可能)。
那么,vps和vpn、Proxy以及我们后面会说的shadowsocks有什么关系呢?很简单,vps可以用来搭建网站,当然也可以用来承载vpn服务器、代理服务器或是shadowsocks的服务器啦。建站固然是vps最主要的作用,但绝对不是它唯一的作用,既然vps本质上也是电脑,那电脑能做的事它当然也能做。
Shadowsocks
最后,就是我们的shadowsocks闪亮登场了。
介绍之前,我这里先附上shadowsocks的官网链接。英文比较好的同学建议看看官网上对shadowsocks的介绍。
在shadowsocks之前,墙内网民主要依靠寻找现成的技术实现翻墙。比如vpn、HTTPS、tor的中继网桥以及之后的meek插件等等,虽然也有自己的技术,比如一种依靠Google隐藏ip实现翻墙的技术(名字忘了),但毕竟难成大器,再加上GFW逐渐加大对VPN的干扰,人们迫切需要一种简单可靠的技术来抵御GFW的进攻。
于是,大概是在2013年吧(具体时间我也不太清楚),@clowwindy带着他的shadowsocks横空出世。
Shadowsocks同样是一种代理协议,但是作为clowwindy为国人设计的专门用于翻墙的代理协议,相对于vpn,shadowsocks有着极强的隐匿性;相对于HTTP代理,shadowsocks提供了较为完善的加密方案,虽然比不上HTTPS代理和vpn,但使用的也是成熟的工业级的加密算法,普通个人用户完全不用顾虑;相对于HTTPS代理,shadowsocks的安装配置更为简单,中文社区更为活跃,中文文档教程更完善,更符合中国国情。
Shdadowsocks最初的版本是由clowwindy使用Python(一种目前非常热门的脚本编程语言)实现的。所以clowwindy的版本被称为Python版。shadowsocks有点名气之后,不同的开发者使用不同的编程语言为其写了很多分支版本。比如,@cyfdecyf开发维护的Go版本,@madeye开发维护的libev版本(由纯C语言编写,基于libev库开发),由@librehat开发维护的c++版,由@zhou0开发维护的Perl版。这些版本的安装使用指南都可以在shadowsocks的官网上查阅。
2015年,clowwindy因喝茶事件被迫停止了shadowsocks的维护,并删除了其开源在GitHub上的代码,Python版就此停滞。但其它版本仍处于维护更新中。其中,更新最频繁,新技术跟进最快的是由@madeye维护的libev版本。这里有必要说明下,目前,shadowsocks协议(请区分“shadowsocks协议”和“shadowsocks协议的具体实现”这两者的区别)是由shadowsocks社区内的成员共同维护,协议上任何新改进都是社区成员共同商讨的结果。但对这些变化,不同的版本的shadowsocks跟进速度不同。而跟进速度最快的就是我上面说的libev版。无论是SIP007确认的ADEA Ciphers(一种同时进行认证和加密的算法),还是SIP003引进的simple-obfs(tor开发的一种混淆插件),shadowsocks-libev都是最早引入自己软件的。
上表是我从shadowsocks官网上直接搬下来的,显示了目前各版本的shadowsocks对协议新特性的支持情况。
当然,这里说的全是服务端的shadowsocks,客户端的没提,也没法提,因为实在太多了,比如比较出名的两个,surge和shadowrocket。这些客户端有好有坏,良莠不齐,对shadowsocks协议的支持程度也不一样,有的需要付费(iOS端基本都要付费,而安卓端则基本免费),费用也不一样。而且,这些客户端绝大部分都不是shadowsocks社区的“官方客户端”,而是第三方开发者制作的客户端。
以上,就是本文的全部内容了,希望对您有帮助。
不同意关于https代理部分的内容。https代理最大的问题是证书是明文,可以看见要访问的域名。
https://gist.github.com/clowwindy/5947691