科学上网(1)--shadowsocks解读

什么是shadowsocks(影梭)

ShadowSocks是由@clowwindy所开发的一个开源 Socks5 代理。如其官网所言 ,它是 “A secure socks5 proxy, designed to protect your Internet traffic” (一个安全的 Socks5 代理)。其作用,亦如该项目主页的 wiki中文版) 中所说,“A fast tunnel proxy that helps you bypass firewalls” (一个可穿透防火墙的快速代理)。

不过,在中国,由于GFW的存在,更多的网友用它来进行科学上网。随着GFW的升级,Shadowsocks的流行度正日益上升,而其稳定性也获得了广泛的认可。

shadowsocks原理

这里推荐“写给非专业人士看的shadowsocks简介”,讲的很清楚。因为该网站已经偶尔无法访问,这个摘抄出来。

long long ago…

在很久很久以前,我们访问各种网站都是简单而直接的,用户的请求通过互联网发送到服务提供方,服务提供方直接将信息反馈给用户.

1.png

when evil comes

然后有一天,GFW 就出现了,他像一个收过路费的强盗一样夹在了在用户和服务之间,每当用户需要获取信息,都经过了 GFW,GFW将它不喜欢的内容统统过滤掉,于是客户当触发 GFW 的过滤规则的时候,就会收到 Connection Reset 这样的响应内容,而无法接收到正常的内容

2.png

ssh tunnel

聪明的人们想到了利用境外服务器代理的方法来绕过 GFW 的过滤,其中包含了各种HTTP代理服务、Socks服务、VPN服务… 其中以 ssh tunnel 的方法比较有代表性.

  1. 首先用户和境外服务器基于 ssh 建立起一条加密的通道
  2. 用户通过建立起的隧道进行代理,通过 ssh server 向真实的服务发起请求
  3. 服务通过 ssh server,再通过创建好的隧道返回给用户

3.png

由于 ssh 本身就是基于 RSA 加密技术,所以 GFW 无法从数据传输的过程中的加密数据内容进行关键词分析,避免了被重置链接的问题,但由于创建隧道和数据传输的过程中,ssh 本身的特征是明显的,所以 GFW 一度通过分析连接的特征进行干扰,导致 ssh存在被定向进行干扰的问题

shadowsocks

于是 clowwindy 同学分享并开源了他的解决方案

简单理解的话,shadowsocks 是将原来 ssh 创建的 Socks5 协议拆开成 server 端和 client 端,所以下面这个原理图基本上和利用 ssh tunnel 大致类似

  1. 客户端发出的请求基于 Socks5 协议跟 ss-local 端进行通讯,由于这个 ss-local 一般是本机或路由器或局域网的其他机器,不经过 GFW,所以解决了上面被 GFW 通过特征分析进行干扰的问题
  2. ss-local 和 ss-server 两端通过多种可选的加密方法进行通讯,经过 GFW 的时候是常规的TCP包,没有明显的特征码而且 GFW 也无法对通讯数据进行解密
  3. ss-server 将收到的加密数据进行解密,还原原来的请求,再发送到用户需要访问的服务,获取响应原路返回

4.png

shadowsocks的优劣势

1. 优势

  • 支持远程 DNS 解析,防止 DNS 污染。由于 socks5 代理支持远程 DNS 解析,因此不用另外再去找国外的 DNS 服务器,DNS查询直接递给远程代理服务器,然后通过墙外 DNS 服务器查询得到结果再传回客户端。从而 DNS 污染鞭长莫及。
  • 安全。所有数据流量全部经过加密,加密算法可选并支持自定义算法。另外,远程 DNS 解析也使得本地的 ISP 无法通过 DNS 查询获取你所访问的网站。
  • 隐蔽。 OPENVPN 和 VPNgate 都是死在了特征检测上,通常来说基于证书的身份认证过程和密钥交换过程都会带来独特的协议指纹( OPENVPN 有着一套复杂完善的身份认证机制,估计 GFW 就是识别出了这一机制的协议指纹从而成功干掉 OPENVPN 的),从而使得他们在 handshake 阶段就被 GFW 识别出来并阻断了;但 ShadowSocks 直接放弃了服务器端身份认证,也抛弃了密钥协商过程( TLS 连接就是在 handshake 阶段协商出随机密钥的),而是采取事先在服务器端设置好固定密钥的方式来应对加密连接的(设置shadowsocks客户端和服务器端的时候要填写同一个密码,这就是事先设置好的用于加密和解密的密钥)。这样做就大大减少了协议特征,再加上一般的 ShadowSocks 服务器端都是个人租用的专用服务器,流量很小,从而很难被 GFW 发现和封杀。
  • 速度相对较快。由于其隐蔽性,只会有很少的数据包会被 GFW 丢弃,从而保证了连接速度。
  • 连接稳定。同样由于其隐蔽性,较小的丢包率带来的是稳定的连接。
  • 智能切换。 传统的 VPN 方式,在切换网络时非常不方便, 比如连上国外的 VPN 之后会发现访问国内的网站速度严重下降。 ShadowSocks 支持 PAC 列表,根据 PAC 中的规则,有针对性地选用恰当的网络访问方式,兼顾了访问速度与访问效率。移动客户端还支持针对不同应用设置单独代理。
  • 去中心化。服务器端搭建方便快捷,每个人都可以自己动手搭建属于自己的服务器端。部分人以免费或者收费方式共享自己的服务器,即使不想动手搭建的也有很多的免费账号或购买渠道可以选择。
  • 代码开源。不像某些蜜罐式的翻墙工具,开源的代码保证了无后门,从而为上网的隐私性与安全性提供保障。
  • 客户端配置简单。配置时只需要填写 IP /域名、端口号,密码,然后选择加密方式即可。
  • 客户端绿色小巧。Windows版本的客户端只有200多k,而且免安装,解压即可使用。
  • 省电。在移动端上使用,电量管理中几乎看不到它的身影。
  • 支持开机启动,断网无影响,无需手动重连,方便网络不稳定或者3G&Wi-Fi频繁切换的小伙伴。
  • 跨平台。支持主流系统包括 Windows, Linux, Mac, Android, IOS,都有对应的客户端支持。

2. 劣势

若自己搭建 ShadowSocks 服务,需要

  • 技术成本。因为大部分服务端是基于运行 Linux 的 VPS(虚拟主机)搭建,因此需要学会使用 putty 等远程管理工具的使用方法,并掌握一定的Linux基本命令行操作。
  • 金钱成本。租用国外的服务器,需要价格不菲的费用。

若使用免费 ShadowSocks 账号,可能有一定的

  • 时间精力成本。很多免费账号由于使用者众多,人均流量很小,导致网速慢,不稳定,需要不断寻找新的替代,且很多免费账号会定时更新密码,或者是有流量限制,或者是需要定时签到等等,这些都需要花费时间和精力去一一满足需求才能短暂使用。
  • 安全成本。有一些人会将自己的 ShadowSocks 节点免费分享出来,这些人是非常值得肯定和称赞的!但是其中有一小部分人别有居心,例如在 ShadowSocks 的服务器端监听网络流量,进行中间人攻击等,这类钓鱼服务器会严重损害用户的个人信息安全。

若购买收费的 ShadowSocks 账号, 需要一定的

  • 金钱成本 由于很多 ShadowSocks 卖家都是以盈利为目的,需要花费一定的费用。

那么,自己想要有一个影梭账号的话,到底是选用哪种比较好呢?可以看到网上很多卖 ShadowSocks 账号的,有的价格很便宜,比自己搭服务器划算多了,是不是直接购买一个账号比较好呢?

在这里我建议大家自己搭服务器,或者找几个人一起租个服务器比较划算。不推荐购买商业出售的 ShadowSocks。

商业的出售 ShadowSocks 账号的行为绝大部分都是耍流氓。试着算一下,作为一个 ShadowSocks 出售者,他们的成本是服务器的租用费用,而收入是购买 ShadowSocks 账号人数 × 每人花费的 ShadowSocks 账号购买价格。

我们假设,一台服务器的租用成本,是 10 美元一个月,那么如果要想不亏本,且做到低价,假设现在卖给十个人,那么至少每个人每月要 1 美元。但是,服务器的带宽是有限的,假设是 100M 的带宽,那么平均分下来人均带宽只有 10M,而服务器的流量一般也是有限的,如果一共是 1000 M 的流量,那么每人每月只分到 100M 。如果超出流量,服务器的租用费用会增加,就好像我们手机流量超出后,额外的流量需要交钱一样。因此,购买的流量一般都会受限制。

从上面的例子可以看到,服务器资源是大家共享的,使用的人越多,人均分到的资源就越少。但是, ShadowSocks 的卖家需要赚钱,那么怎么办呢?当然是最小化成本,并最大化收入了。也就是说,尽量租用少量廉价的服务器,然后将它以尽可能高的价格卖给尽可能多的消费者。因此,对于 ShadowSocks 的商家而言,超售(即一台服务器原本最多10个人用的,可能最后卖了100个人)的现象非常严重,消费者最终所能享受到的流量和连接速度显然对不起自己的花费。

不如自己租个服务器,不仅能有一个稳定放心的服务器,还能顺便学习些 Linux 的相关知识。

如果嫌麻烦,我过几天发文章分享账号,而且最大的一个好处是,人数一般较少,最重要的是这是可能不需要你付费。

此处评论已关闭