ShadowSocks的原理和使用

引子

ShadowSocks,简称ss,相信很多小伙伴都在用。至于它是干啥的,我就不多解释了,大家可自行 google,哦不,自行百度~

在本文开始之前,先做一个简短声明:本文提到的所有与 ShadowSocks 有关的知识点和使用,都只是纯粹的探讨技术实现和学习!!!

本文目录如下:

         

一、ShadowSocks 的原理

有关于 ShadowSocks 的原理部分,打算用几张图来解释下,争取做到每个人都能看懂!

1.1 缘起

故事,还要从 2010 年以前说起。

在 2010 年以前,客户端(Client)是可以直接通过 PC 端的浏览器访问境外网站的,如 Google(谷歌)、Youtube(油管)、FaceBook(脸书)等,整个过程呢,也很简单,就是C/S模型,如下图所示:

这个时候,大家玩得很愉快。但后来,由于不可抗力,我们受到了来自一座高墙(WALL)的阻挠,连接突然中。断。。了。。。

所谓"道高一尺魔高一丈",这话用在这里貌似也很合适,不信接着往下看~

1.2 突围

再后来,随着对称加密、数字签名、SSH隧道等技术的出现和更新换代,一个新的角色——代理服务器出现了。它的角色呢,有点儿像现在的农夫山泉公司。为何这么说呢?因为农夫山泉那洗脑的广告语是"我们不生产水,我们只是大自然的搬运工",对于代理服务器也是一样,若它也有宣传口号,可以套用为:"我们不生产网络请求,我们只是墙外资源的搬运工"。

好了,我们言归正传。

这里先解释一个名词——SSH,全称是 Secure Shell,由芬兰人于 1995 年设计出来。SSH 原本是 Linux 里的一套规范,但目前已广泛使用在各个领域。它做了什么事情呢?一句话概括,就是:让两台通过公网连接在一起的电脑能够安全的传输数据,即使数据在中间被截获,也只是拿到了它的密文而已,无法解析未明文,这也就确保了通信的安全性。类似 SSH 功能的技术也有很多,如 STUNNEL、VPN,这里就不再一一展开了,感兴趣的同学可自行查询相关文档。

代理服务器的出现,让一些人的脸上又恢复了春光灿烂的笑容,如下图这种:

不好意思,放错了,是下面这个图:

通过 SSH 通道的方式,从功能上解决了被限制访问或对请求做重定向的问题。因为 Wall 拦截到的都是基于 RSA 加密之后的密文,无法通过对请求内容的关键字分析来做筛选。但这并不意味着可以一劳永逸。因为这种 SSH 类型的数据传输和 SSH 的隧道创建,其本身的请求中 Header 字段会含有特殊信息,是可以检测出来了,所以特征明显,Wall 依然可以通过分析这种请求 header 来达到定向干扰访问的问题。

这支技术创新的火苗被掐灭了,是不是我们就无路可走了呢?当时很多人的心情是这样的:

1.3 涅槃

再到后来,有个牛人分享开源了自己的作品——ShadowSocks 出现了,整个访问体系变成如下图这样:

那么,问题来了,面对这高墙铁壁,ShadowSocks 是怎么做到悄么声的呢?

1.4 原理的通俗解析

shadowsocks 的实现基于了 SOCKS5 协议,将数据传输分为了两个阶段,一个是SS 本地机器(SS-Local),一个是SS 服务器(SS-Server),其中SS 本地机器是需要安装一个 ShadowSocks 的客户端,SS 服务器需要安装在代理服务器上。SS 本地机器可以是自己的主机,也可以是路由器,SS 服务器则是境外的代理服务器。

还是以访问 google 站点为例,用户在浏览器输入 google 网址的时候,首先会将原始请求代理给SS 本地机器,原始请求被加密之后作为 TCP 报文的 body 发送给境外的SS 服务器,由其解密后得到明文的请求信息,然后该代理服务器再去通过 DNS 来得到真正的请求数据,同样的,加密之后返回给本地机器。这就是整个的请求/响应信息传输过程。

当然,SS-Local与SS-Server之间的通信,也会有权限校验和加密方式的约定。比如我们需要在 SS-Server 上配置用户、密码以及加密方式,之后也要在 SS 客户端设置同样的用户、密码和加密方式,才能完成正常通信。对应加密方式,最常用的就是 aes、rc4、des 等,默认一种就 ok,只是加密方式不同而已,对于我们一般用户来讲,区别不大。

Wall 拦截不到的原因在于,请求数据通过 Wall 时就是普通的 TCP,和一般的请求没啥区别,它也无法拆开每个 TCP 来看真实的请求信息,所以就自然的避开了 Wall 规则的触发。

二、ShadowSocks 的使用

本部分,将主要来实践。如何从无到有的手动搭建一套 ShadowSocks。

从前面的描述,我们可以了解到,ShadowSocks 分为两个部分:a)  本地机器(SS-Local),也就是 ShadowSocks 客户端;b)  在代理服务器上安装 SS-Server

那么我们的操作,也分别从这两部分开始。

2.1 客户端安装

下载一个 ShadowSocks 客户端,具体链接我就不放出来了,大家可自行搜索。其 logo 是一个纸飞机的样子,如下:

安装好打开之后,界面中一般会出现如下几项内容:

服务器地址:即代理服务器的 IP 地址;端口:在代理服务器安装好 SS-Server 之后的 TCP 监听端口,下文会讲到;密码:该密码会在安装 SS-Server 后设置,下文会讲到;timeout:连接超时的上限,单位为"秒"。

2.2 代理服务器

安装好 ShadowSocks 客户端后,需要配合代理服务器的使用。当然,若想省事,也可以直接花钱购买账号,不过没有自己租代理服务器来的划算和灵便。

下面以在代理服务器上安装 SS-Server 为例。

常见的服务器租赁平台有搬瓦工(这个最有名)、DigitalOcean。

我们以DigitalOcean为例,其可在注册后赠送免费的 10 美刀,这可以免费使用两个月,以后有可能还会转战到搬瓦工上。

购买之后,SS-Server 的搭建就是傻瓜式操作了,几行代码就可以搞定。这里不具体贴出来了,只给一个链接吧:传送门。

部署完,剩下就是密码、端口等的设置。digitalocean的官网上给了个网页版的终端入口,反应较慢,部署过程可自行搜索,不再给出。

2.3 流量监控

我们在DigitalOcean租的代理服务器是有流量限制的,1000G/月,但是 droplets 的 graphs 上面没有给出统计流量,只有实时流量的监控,万一流量超了咋办?如何知道自己当前使用了多少流量呢?

可使用一个工具,vnstat,这是一个轻量级的用于 linux 的网络流量监控工具,那么就可以在代理服务器上安装此工具,方便查询使用的总流量。

安装非常简单,跟一般的软件安装没有区别,可以先通过wget命令下载 tar.gz,然后解压,自己安装,也可以使用如下语句安装。

sudo apt-get install vnstat

vnstat的语法也非常简单,可以使用vnstat --help来查看帮助。

一般地,常用的也就是以下几个命令:

vnstat -l # 实时流量监控,按Ctrl + c停止vnstat -m # 按月查询,这个较为试用,看本月总共使用了多少流量vnstat -w # 最近一周的流量使用vnstat -d # 当天流量的使用情况vnstat -h # 最近一个小时的流量使用vnstat -t # 流量使用最多的top 10 天

eg:

上图显示了 2 月份的流量使用情况。rx是下载(recieve),tx是上传(transmit)。第二行是实际的监测流量,第三行是估计流量,看到网上的解释,是根据你实际的使用量来估计你每天/月的使用量,仅做参考。

仔细看上图的 estimated,会发现当月的估计使用量是 640M,但刚安装了两天就已使用了四百多兆,是不是也太不准了啊?

这个疑问也有人在网上问过(地址:vnstat-not-showing-correct-data),很多人都给出了解答。有人解释,因为 vnstat 是刚安装的,所以 estimated 的数值会不太准确,可正常的用几天之后再来查看此数值。

三、小结

本文主要讨论代理服务器与 ShadowSocks 的工作原理,仅仅是作为学习使用,这有助于我们更好的理解网络世界里一个请求是如何被层层转发的,希望能对你有所帮助。

如果本文对你有帮助,还请点个"在看"和转发,谢谢~

历史文章推荐:

HashMap 面试题,看这一篇就够了!linux 常用命令用法汇总你了解 Referer 吗?