居然这么快就过年了。。。。Unbelievable。
初六就要开学。所以在春节期间我送给大家寒假的最后一福利。在AWS(Amazon Web Service)的EC2上用ShadowSocks(以下简称SS)搭梯子和梯子的优化(可以流畅播放Youtube 1080p高清视频)。
概述 & 申请
大家都知道AWS提供免费一年的EC2,我们可以利用这个打个梯子,然后“越过长城,走向世界”。
本教程以AWS为例,适用于除了OpenVZ之外(包括KVM,Xen)的VPS。(OpenVZ是积了几辈子的德?)
首先就是申请AWS,这我就不详细说了,需要大家用信用卡激活账户,然后会预授权两美元(并不真的收费)验证信用卡的有效性,然后就可以免费一年使用EC2了。
节点的选择
接下来的问题就是节点的选择了,一般节点的考虑需要地理位置,EC2共有:弗吉尼亚北部,俄勒冈,加利福尼亚北部,爱尔兰,法兰克福,新加坡,东京,悉尼,圣保罗(巴西)七个节点。从地理位置上来说,爱尔兰,法兰克福在欧洲,可以直接忽略,因为根据国际出口的状况,联通,移动这两个运营商会绕行美国到欧洲,而且欧洲的延迟也不是非常理想。南美洲的可以直接忽略,因为南美洲都是发展中国家,网络设施不是很发达。而在美国,弗吉尼亚在美国东海岸,相当于访问需要跨越一个大洋和一个大陆,所以基本也不用考虑了。而西海岸的俄勒冈和加利福尼亚,在我本地(福建)电信的ping为200和230,如果你访问的主要是美国站点,可以考虑。而亚太地区,悉尼不用考虑,中澳的网络状况并不是很好(没有直连光纤),日本和新加坡有直连光纤,但新加坡和中国间的网络貌似很复杂,有的运营商直接访问非常快(移动),而有的却要绕行美国(电信),而日本就不存在这个问题,所以请大家自己权衡。
我选择的是东京(日本)节点。
切换服务区域的地方在控制台右上角,见下图。
AWS的网络有一个安全组,默认是关闭ping的,如果需要ping,请在创建实例后,去控制台>EC2>Network & Security > Security Groups中编辑Inbound Rules,加入允许All ICMP从Anywhere访问,见下图:
然后就可以测试了。。。出于安全考虑,建议测试完之后关闭。
EC2用户需要注意的是,免费套餐每月只有15G免费流出流量(对于服务器为上传,对于客户端为下载),流入流量(对于于服务器为下载,客户端为上传)不计费。超出的流出流量,EC2东京节点为14美分/GB。
节点的选择就说这么多,接下来进入正题,也就是梯子的搭建及优化。
梯子的搭建
以下内容为EC2的教程,非EC2用户可以直接跳过。
首先我们要先创建一个实例,一个实例就是一台VPS,用户拥有完全的管理权限。
关于实例系统选择,Windows是绝对不建议的,因为免费套餐送的是t2.micro型的实例,仅有1GB内存,根本不够Windows使用,第二就是Windows对很多开源软件非常不友好(配置麻烦,安装麻烦,使用麻烦),而Linux的话,不建议选Cent OS和RHEL,因为这两个系统为了稳定性而过于保守,很多组件很旧,所以建议使用Debian和Ubuntu,而我最推荐Debian,Debian适合服务器使用(Ubuntu更适合桌面),SS也有专门针对Debian的优化指南(当然也适用于Ubuntu)。
亚马逊又有HVM和PV两种虚拟化模式,免费套餐HVM的资源会更多,所以一定要使用HVM的镜像。但是亚马逊官方的镜像市场没有HVM版的Debian,我们就需要去Community AMIs里找到debian-wheezy-amd64-hvm-XXXXXX这个镜像,一定要注意描述中Virtualization type是hvm而不是paravirtual。
注意:为了安全,EC2的Linux系统都是禁止直接使用root登录的,如果你用的是Debian,需要用admin登录,Ubuntu需要使用ubuntu登录,Cent OS需要使用centos登录,然后再使用sudo或su成root。
其他关于EC2使用的问题建议大家自己去网上查找,这里不详细写。
接下来就是搭梯子了,大家仔细看,跟着我做。
在Debian/Ubuntu上
然后编辑/etc/shadowsocks.json
如果你还要给小伙伴爬,那我建议开启多个端口而不是共用,这样网络会更加顺畅。SS支持开启多个端口,如果你需要开启多个端口,则将配置文件写成这样
EC2的用户需要注意,EC2使用的是NAT,你并不能直接绑定服务器的公网IP,所以服务器IP的一栏需要填0.0.0.0或服务器的内网IP(即eth0网卡的IP)。另外,服务器打开的端口,同时也是需要在服务器防火墙和EC2的安全组中打开。安全组用法与上述相似,只需将前面改为Cutsome TCP Rule即可。
然后运行指令:
梯子基本就搭好了,一般这样就已经可以使用了,关于使用,也请大家去搜索引擎查,不详细讲。
但是这样运行SS,缺点还是很大的,一来,系统重启之后还需要手动运行,非常麻烦,二来,如果SS进程意外退出,没有有效的自动重启机制,会影响到服务。
这时我们就需要将SS变为一个服务,来保证SS在大多数情况下都能够自动的应对突发情况,不需要人工干预。
将SS变为服务的方法有很多种,在Ubuntu上,可以使用非常简便的Upstart,在Debian/Ubuntu上则可以使用Supervisor,这里就介绍Supervisor。
Debian/Ubuntu上Supervisor运行SS
首先安装Supervisor
然后编辑 /etc/supervisor/conf.d/shadowsocks.conf
如果你想绑定的端口是小于1024的,则需要将user改为root
在 /etc/default/supervisor 最后加一行:
然后执行
SS就变成一个服务了,这样,SS将在开机时自动启动,而如果进程意外退出,Supervisor也会自动重启SS。
日常维护命令
运行SS:supervisorctl start shadowsocks
停止SS:supervisorctl stop shadowsocks
重启SS:supervisorctl restart shadowsocks
搭梯子就讲到这里,如果你有任何问题,欢迎在评论区提问,当然,我还是建议你多去搜索引擎查找。
梯子的优化
如果你只是这样把梯子搭好就开始用了,那么我保证,除非线路状况非常非常好,服务器性能非常非常牛逼,这样的梯子爬起来绝对是很卡的。这就需要我们对SS进行优化了,优化从几个层面进行:系统层面,加密层面和网络层面。
系统层面
这方面SS给出了非常详尽的优化指南,主要有:优化内核参数,开启TCP Fast Open
优化内核参数
这项主要是对内核的参数进行调优,以适应SS的服务环境,调优后速度会有显著提升。
编辑/etc/sysctl.d/local.conf
其中最后的hybla是为高延迟网络(如美国,欧洲)准备的算法,需要内核支持,测试内核是否支持,在终端输入:
如果结果中有hybla,则证明你的内核已开启hybla,如果没有hybla,可以用命令modprobe tcp_hybla开启。
对于低延迟的网络(如日本,香港等),可以使用htcp,可以非常显著的提高速度,首先使用modprobe tcp_htcp开启,再将net.ipv4.tcp_congestion_control = hybla改为net.ipv4.tcp_congestion_control = htcp,建议EC2日本用户使用这个算法。
开启TCP Fast Open
这个需要服务器和客户端都是Linux 3.7+的内核,一般Linux的服务器发行版只有debian jessie有3.7+的,客户端用Linux更是珍稀动物,所以这个不多说,如果你的服务器端和客户端都是Linux 3.7+的内核,那就在服务端和客户端的sysctl文件中再加上一行。
然后把服务器和客户端的的配置文件中"fast_open": false改为"fast_open": true。这样速度也将会有非常显著的提升。
加密层面
梯子之所以是梯子,那就是因为它可以爬,之所它可以爬,那就是对上面的人进行了伪装,而这个伪装就是加密了。
而加密的速度和质量也关系到爬梯子的速度,加密的越快,就能越快爬上梯子,加密的质量越好,过检查站(GFW)的速度就越快。
ShadowSocks提供了多种加密算法供选择,分别为:
aes-256-cfb aes-128-cfb aes-192-cfb aes-256-ofb aes-128-ofb aes-192-ofb aes-128-ctr aes-192-ctr aes-256-ctr aes-128-cfb8 aes-192-cfb8 aes-256-cfb8 aes-128-cfb1 aes-192-cfb1 aes-256-cfb1 bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb chacha20 rc2-cfb rc4-md5 salsa20 seed-cfb
这其中的算法,比如和rc4有关算法,虽然很快,但已经被检查站破解,无法伪装爬梯子的人,绝对 不建议 使用。
安装M2Crypto
这个可以提高SS的加密速度,安装办法:
Debian/Ubuntu
安装之后重启SS,速度将会有一定的提升
使用CHACHA20加密算法
上面提到的rc4非常的弱,但是速度又很快,那怎么把两者结合起来呢,于是人们就创造了salsa20这个算法,这个算法比起rc4,足足快了两倍,而安全性也大大加强了,而谷歌,作为手机系统的老大,又对salsa20进行了改造,创造了chacha20这一算法,这一算法在ARM平台上的速度是惊人的,而chacha20相对于他的前任在速度和安全性的方面又有了很大提升。
那么,我们就需要将SS的加密算法改为chacha20。
首先,安装libsodium,让系统支持chacha20算法。
然后,将SS配置文件中"method":"aes-256-cfb"改为"method":"chacha20",重启SS即可。
最后,我们要在客户端也将加密方式改为chacha20,现在桌面和移动平台上的SS最新版均支持chacha20。
使用chacha20后速度相对于AES算法有显著提升,特别是在移动平台上。
网络层面
端口
广大SS用户的实践经验表明,检查站(GFW)存在一种机制来降低自身的运算压力,即常用的协议端口(如http,smtp,ssh,https,ftp等)的检查较少,所以建议SS绑定这些常用的端口(如:21,22,25,80,443),速度也会有显著提升。
我们可以这样理解,检查站总共有65535个检查口,有的口很多人走,有的口基本没人走,那么很多人走的口检查自然要少些,要不然工作量就很大了,而很少人走的口突然有人走就会显得很可疑,当然就要多检查一下。
当然对于这一现象,也有“运营商说”,不过我们并不了解检查站和国际网络的运作方式,所以无从而知。
不过我们不一定要了解原理,我们只需要知道使用常用端口速度更快就行了。
总结
上述的优化办法,我虽然都说能提升速度,但是单单优化一个是没有用的,需要全部结合起来,目前我试验得来的最快的组合是:EC2东京+内核优化+HTCP堵塞优化算法+CHACHA20加密+443端口(https端口),Youtube视频传输速率最高可达7000Kbps!
搭梯子是一门技术活,需要大家有耐心,并且积极地去搜索相关资料,才能搭起一个安全又舒适的梯子。