当我们在讨论Shadowsocks的时候我们到底在说什么_

long long ago…

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

when 寡妇网 comes

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

ssh tunnel

聪明的人们想到了利用境外服务器代理的方法来绕过寡妇网的过滤,其中包含了各种HTTP代理服务、Socks服务、VPN服务…

其中以 ssh tunnel 的方法比较有代表性

1.首先用户和境外服务器基于 ssh 建立起一条加密的通道

2.用户通过建立起的隧道进行代理,通过 ssh server 向真实的服务发起请求

3.服务通过 ssh server,再通过创建好的隧道返回给用户

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

shadowsocks

于是 clowwindy 同学分享并开源了他的解决方案(已“主动”删除源码)

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

客户端发出的请求基于 Socks5 协议跟 ss-local 端进行通讯,由于这个 ss-local 一般是本机或路由器或局域网的其他机器,不经过 寡妇网,所以解决了上面被 寡妇网 通过特征分析进行干扰的问题

ss-local 和 ss-server 两端通过多种可选的加密方法进行通讯,经过 寡妇网的时候是常规的TCP包,没有明显的特征码而且 寡妇网 也无法对通讯数据进行解密

ss-server 将收到的加密数据进行解密,还原原来的请求,再发送到用户需要访问的服务,获取响应原路返回 

Shadowsocks 的优劣

优势

支持远程 DNS 解析,防止 DNS 污染。由于 socks5 代理支持远程 DNS 解析,因此不用另外再去找国外的 DNS 服务器,DNS查询直接递给远程代理服务器,然后通过墙外 DNS 服务器查询得到结果再传回客户端。从而 DNS 污染鞭长莫及。

安全。所有数据流量全部经过加密,加密算法可选并支持自定义算法。另外,远程 DNS 解析也使得本地的 ISP 无法通过 DNS 查询获取你所访问的网站。

隐蔽。 OPENVPN 和 VPNgate 都是死在了特征检测上,通常来说基于证书的身份认证过程和密钥交换过程都会带来独特的协议指纹( OPENVPN 有着一套复杂完善的身份认证机制,估计 寡妇网就是识别出了这一机制的协议指纹从而成功干掉 OPENVPN 的),从而使得他们在 handshake 阶段就被 寡妇网 识别出来并阻断了;但 ShadowSocks 直接放弃了服务器端身份认证,也抛弃了密钥协商过程( TLS 连接就是在 handshake 阶段协商出随机密钥的),而是采取事先在服务器端设置好固定密钥的方式来应对加密连接的(设置shadowsocks客户端和服务器端的时候要填写同一个密码,这就是事先设置好的用于加密和解密的密钥)。这样做就大大减少了协议特征,再加上一般的 ShadowSocks 服务器端都是个人租用的专用服务器,流量很小,从而很难被 寡妇网 发现和封杀。

速度相对较快。由于其隐蔽性,只会有很少的数据包会被 寡妇网 丢弃,从而保证了连接速度。

连接稳定。同样由于其隐蔽性,较小的丢包率带来的是稳定的连接。

智能切换。 传统的 VPN 方式,在切换网络时非常不方便, 比如连上国外的 VPN 之后会发现访问国内的网站速度严重下降。 ShadowSocks 支持 PAC 列表,根据 PAC 中的规则,有针对性地选用恰当的网络访问方式,兼顾了访问速度与访问效率。移动客户端还支持针对不同应用设置单独代理。

去中心化。服务器端搭建方便快捷,每个人都可以自己动手搭建属于自己的服务器端。部分人以免费或者收费方式共享自己的服务器,即使不想动手搭建的也有很多的免费账号或购买渠道可以选择。

代码开源。不像某些蜜罐式的工具,开源的代码保证了无后门,从而为上网的隐私性与安全性提供保障。

客户端配置简单。配置时只需要填写 IP /域名、端口号,密码,然后选择加密方式即可。

客户端绿色小巧。Windows版本的客户端只有200多k,而且免安装,解压即可使用。

省电。在移动端上使用,电量管理中几乎看不到它的身影。

支持开机启动,断网无影响,无需手动重连,方便网络不稳定或者3G&Wi-Fi频繁切换的小伙伴。

跨平台。支持主流系统包括 Windows, Linux, Mac, Android, IOS,都有对应的客户端支持。

劣势

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

金钱成本。租用国外的服务器,需要价格不菲的费用。

时间精力成本。很多免费账号由于使用者众多,人均流量很小,导致网速慢,不稳定,需要不断寻找新的替代,且很多免费账号会定时更新密码,或者是有流量限制,或者是需要定时签到等等,这些都需要花费时间和精力去一一满足需求才能短暂使用。

安全成本。有一些人会将自己的 ShadowSocks 节点免费分享出来,这些人是非常值得肯定和称赞的!但是其中有一小部分人别有居心,例如在 ShadowSocks 的服务器端监听网络流量,进行中间人攻击等,这类钓鱼服务器会严重损害用户的个人信息安全。