ShadowSocks搭梯子及优化方法

前言

居然这么快就过年了。。。。Unbelievable。

初六就要开学。所以在春节期间我送给大家寒假的最后一福利。在AWS(Amazon Web Service)的EC2上用ShadowSocks(以下简称SS)搭梯子和梯子的优化(可以流畅播放Youtube 1080p高清视频)。

概述 & 申请

大家都知道AWS提供免费一年的EC2,我们可以利用这个打个梯子,然后“越过长城,走向世界”。

本教程以AWS为例,适用于除了OpenVZ之外(包括KVM,Xen)的VPS。(OpenVZ是积了几辈子的德?)

首先就是申请AWS,这我就不详细说了,需要大家用信用卡激活账户,然后会预授权两美元(并不真的收费)验证信用卡的有效性,然后就可以免费一年使用EC2了。

节点的选择

接下来的问题就是节点的选择了,一般节点的考虑需要地理位置,EC2共有:弗吉尼亚北部,俄勒冈,加利福尼亚北部,爱尔兰,法兰克福,新加坡,东京,悉尼,圣保罗(巴西)七个节点。从地理位置上来说,爱尔兰,法兰克福在欧洲,可以直接忽略,因为根据国际出口的状况,联通,移动这两个运营商会绕行美国到欧洲,而且欧洲的延迟也不是非常理想。南美洲的可以直接忽略,因为南美洲都是发展中国家,网络设施不是很发达。而在美国,弗吉尼亚在美国东海岸,相当于访问需要跨越一个大洋和一个大陆,所以基本也不用考虑了。而西海岸的俄勒冈和加利福尼亚,在我本地(福建)电信的ping为200和230,如果你访问的主要是美国站点,可以考虑。而亚太地区,悉尼不用考虑,中澳的网络状况并不是很好(没有直连光纤),日本和新加坡有直连光纤,但新加坡和中国间的网络貌似很复杂,有的运营商直接访问非常快(移动),而有的却要绕行美国(电信),而日本就不存在这个问题,所以请大家自己权衡。

我选择的是东京(日本)节点。

切换服务区域的地方在控制台右上角,见下图。

EC2怎么搭梯子及优化(Using ShadowSocks) ss-1

AWS的网络有一个安全组,默认是关闭ping的,如果需要ping,请在创建实例后,去控制台>EC2>Network & Security > Security Groups中编辑Inbound Rules,加入允许All ICMP从Anywhere访问,见下图:

EC2怎么搭梯子及优化(Using ShadowSocks) ss-2

然后就可以测试了。。。出于安全考虑,建议测试完之后关闭。

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上

Shell
1
2
aptget install pythonpip
pip install shadowsocks

然后编辑/etc/shadowsocks.json

Shell
1
2
3
4
5
6
7
8
{
    "server":"服务器IP",
    "server_port":8388,
    "password":"连接密码",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

如果你还要给小伙伴爬,那我建议开启多个端口而不是共用,这样网络会更加顺畅。SS支持开启多个端口,如果你需要开启多个端口,则将配置文件写成这样

1
2
3
4
5
6
7
8
9
10
{
    "server":"服务器IP",
    "port_password": {
        "端口1": "连接密码1",
        "端口2" : "连接密码2"
    },
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

EC2的用户需要注意,EC2使用的是NAT,你并不能直接绑定服务器的公网IP,所以服务器IP的一栏需要填0.0.0.0或服务器的内网IP(即eth0网卡的IP)。另外,服务器打开的端口,同时也是需要在服务器防火墙和EC2的安全组中打开。安全组用法与上述相似,只需将前面改为Cutsome TCP Rule即可。

然后运行指令:

Shell
1
2
ssserver c /etc/shadowsocks.json d start //启动
ssserver c /etc/shadowsocks.json d stop //停止

梯子基本就搭好了,一般这样就已经可以使用了,关于使用,也请大家去搜索引擎查,不详细讲。

但是这样运行SS,缺点还是很大的,一来,系统重启之后还需要手动运行,非常麻烦,二来,如果SS进程意外退出,没有有效的自动重启机制,会影响到服务。

这时我们就需要将SS变为一个服务,来保证SS在大多数情况下都能够自动的应对突发情况,不需要人工干预。

将SS变为服务的方法有很多种,在Ubuntu上,可以使用非常简便的Upstart,在Debian/Ubuntu上则可以使用Supervisor,这里就介绍Supervisor。

Debian/Ubuntu上Supervisor运行SS

首先安装Supervisor

Shell
1
2
aptget update
aptget install supervisor

然后编辑 /etc/supervisor/conf.d/shadowsocks.conf

Shell
1
2
3
4
[program:shadowsocks]
command=ssserver c /etc/shadowsocks.json
autorestart=true
user=nobody

如果你想绑定的端口是小于1024的,则需要将user改为root

在 /etc/default/supervisor 最后加一行:

Shell
1
ulimit n 51200

然后执行

Shell
1
2
service supervisor start
supervisorctl reload

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

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# max open files
fs.filemax = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096
 
# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1
 
# for high-latency network
net.ipv4.tcp_congestion_control = hybla

其中最后的hybla是为高延迟网络(如美国,欧洲)准备的算法,需要内核支持,测试内核是否支持,在终端输入:

Shell
1
sysctl net.ipv4.tcp_available_congestion_control

如果结果中有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文件中再加上一行。

Shell
1
2
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3

然后把服务器和客户端的的配置文件中"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

Shell
1
aptget install pythonm2crypto

安装之后重启SS,速度将会有一定的提升

使用CHACHA20加密算法

上面提到的rc4非常的弱,但是速度又很快,那怎么把两者结合起来呢,于是人们就创造了salsa20这个算法,这个算法比起rc4,足足快了两倍,而安全性也大大加强了,而谷歌,作为手机系统的老大,又对salsa20进行了改造,创造了chacha20这一算法,这一算法在ARM平台上的速度是惊人的,而chacha20相对于他的前任在速度和安全性的方面又有了很大提升。

那么,我们就需要将SS的加密算法改为chacha20。

首先,安装libsodium,让系统支持chacha20算法。

Shell
1
2
3
4
5
aptget install buildessential
wget https://github.com/jedisct1/libsodium/releases/download/1.0.3/libsodium1.0.3.tar.gz
tar xf libsodium1.0.3.tar.gz && cd libsodium1.0.3
./configure && make && make install
ldconfig

然后,将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!

EC2怎么搭梯子及优化(Using ShadowSocks) ss

搭梯子是一门技术活,需要大家有耐心,并且积极地去搜索相关资料,才能搭起一个安全又舒适的梯子。

希望这篇文章能够帮助到大家,谢谢。

发布者

胡中元

《中原驿站》站长