DigitalOcean 搭建 Shadowsocks 服务和优化方案

之前一直用着公司提供的梯子,过了个春节,公司的那个在日本的 VPS 跪了,虽然我有备用的 Lantern 可以勉强使用,不过这玩意也经常抽风,所以干脆自己买个 VPS 搭梯子吧。

做梯子用的 VPS 大家一般就是在 DigitalOcean 和 Linode 之间选择,而 Linode 的日本节点也差不多被国人玩坏了,在比较了 Linode 和 DigitalOcean 之后,我选择用 DigitalOcean,注册送10美刀,可以先用俩月试试。

p.s. 关于 Lantern 的一点小提示: 可以通过启动页右下角的设置按钮设置全局代理,也可以通过修改配置文件(lantern-2.0.x.yaml,Windows 在C:\Users\UserName\AppData\Roaming\Lantern\,Mac OS X 在/Users/YOUR_USER_NAME/Library/Application Support/Lantern)来自定义规则。

DigitalOcean 账号

DigitalOcean 注册地址(使用本链接注册的账户会立即到账10美元,可使用两个月)。现在DigitalOcean 新用户直接注册是没有10美元送的,只有通过推荐链接注册会送10美元,可以使用两个月,但需要自己绑定美元币种信用卡($0)或者使用 PayPal 充值($5)以激活账户。

注册步骤就不细说了,这里详细说一下 DigitalOcean 帐号解封的问题。

我的 DigitalOcean 账号是去年注册的,只不过当时只是上去看了一下,并没有购买任何服务。今天补充了信用卡信息后发现需要 Verify 账户,按照提示补全了个人信息,之后便转到了他们的 Support Center,提示如下:

Hello!
We are excited to have you as a DigitalOcean customer. Thank you for the information you have provided thus far.
To help us verify your identity, please send a photo or scan of your government-issued photo ID or passport, and a picture of you holding the ID up to the side of your face (like a selfie) to verify@digitalocean.com with the subject of “Ticket #940985”.
Once you have sent that please let us know by replying to this ticket.
Regards,
DigitalOcean Support

简单来说跟就是要提供证件信息,我把我的身份证照片和一张手持身份证的半身照通过邮件发了过去(为了安全请加水印),没过几分钟就收到邮件说已通过认证并已 unlock account,可以愉快的玩耍了。

如果不是用信用卡激活而是 PayPal 的话,验证会容易一点,不需要身份证明信息,只需要 PayPal 的付款验证信息就好了。

创建一个 VPS

  1. 进入 DigitalOcean 控制面板,点击右上脚 “Create Droplet”
  2. 选择系统(CentOS 7.1 x64)、套餐(最便宜的 $5/mo)、节点(San Francisco)
  3. “Select additional optins” 保持默认
  4. “Add your SSH keys” 根据自己需要,这里不添加的话可以在创建完之后自己手动添加
  5. 根据自己的需要修改 hostname
  6. 点击 “Create” ,VPS 就创建成功了。你的注册 Email 会收到VPS的IP和ROOT密码

配置 Shadowsocks 服务

第一次登陆 VPS 会被要求修改密码,之后便可愉快地敲命令了。

1
2
3
4
5
# yum -y install epel-release
# yum update
# yum -y install python-setuptools supervisor
# easy_install pip
# pip install shadowsocks

这样 Shadowsocks 和 Supervisor 就已经安装好了。(Supervisor 是一个进程管理工具,详情见Supervisor 基础

配置 Shadowsocks

复制以下内容到文件/etc/shadowsocks.json中(请自行修改server_portpassword

1
2
3
4
5
6
7
8
9
10
{
"server": "0.0.0.0",
"server_port": 5080,
"local_address": "127.0.0.1",
"local_port": 1080,
"password": "123456",
"timeout": 500,
"method": "aes-256-cfb",
"fast_open": true
}

配置文件说明:
server服务端监听的地址,服务端可填写 0.0.0.0
server_port服务端的端口
local_address本地端监听的地址
local_port本地端的端口
password用于加密的密码
timeout超时时间,单位秒
method默认 “aes-256-cfb”
fast_open是否使用 TCP_FASTOPEN, true / false(后面优化部分会打开系统的TCP_FASTOPEN,所以这里填true,否则填false)

配置 Supervisor

配置 Supervisor 是为了方便管理 Shadowsocks 进程

将以下内容保存到文件/etc/supervisord.d/shadowsocks.ini中:

1
2
3
4
5
[program:shadowsocks]
command=ssserver -c /etc/shadowsocks.json
autostart=true
autorestart=true
user=root

添加服务并启动 supervisord

1
2
3
# systemctl enable supervisord
# systemctl start supervisord
# supervisorctl reload

到此Shadowsocks已经在CentOS 7 x64下安装配置成功,重启服务器使服务生效。

1
# reboot

结束以上部分,就可以正常使用Shadowsocks服务了。

服务优化

优化的前提是需要 Linux 内核版本 3.7 以上,优化后速度会有显著提升的。

查看内核版本,执行命令会返回你的内核信息,接着我们要进行一些优化,这才是选择 CentOS 7.1 x64 系统的主要原因。

1
2
# uname -a
Linux do-sfo1 3.10.0-229.20.1.el7.x86_64 #1 SMP Tue Nov 3 19:10:07 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

首先我们要在系统中启用 TCP Fast Open

1
# echo 3 > /proc/sys/net/ipv4/tcp_fastopen

需要重启后也生效 TCP Fast Open ,要编辑sysctl.conf

1
# echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf

检查TCP Fast Open有没有生效运行

1
# sysctl net.ipv4.tcp_fastopen

得到net.ipv4.tcp_fastopen = 3,表示已经成功生效了。

增加 TCP 连接数量

1
2
3
4
5
# cat >> /etc/security/limits.conf << EOF
soft nofile 51200
hard nofile 51200
EOF
# ulimit -n 51200

接着我们要调整TCP拥塞控制算法为hybla,并且优化TCP参数

TCP拥塞控制算法:
中美之间的线路质量不是很好,rtt较长且时常丢包。TCP的设计目的是解决不可靠线路上可靠传输的问题,即为了解决丢包,但丢包却使TCP传输速度大幅下降。HTTP协议在传输层使用的是TCP协议,所以网页下载的速度就取决于TCP单线程下载的速度(因为网页就是单线程下载的)。丢包使得TCP传输速度大幅下降的主要原因是丢包重传机制,控制这一机制的就是TCP拥塞控制算法。
Linux内核中提供了若干套TCP拥塞控制算法,这些算法各自适用于不同的环境。

  • reno是最基本的拥塞控制算法,也是TCP协议的实验原型。
  • bic适用于rtt较高但丢包极为罕见的情况,比如北美和欧洲之间的线路,这是 2.6.8 到 2.6.18 之间的Linux内核的默认算法。
  • cubic是修改版的bic,适用环境比bic广泛一点,它是 2.6.19 之后的linux内核的默认算法。
  • hybla适用于高延时、高丢包率的网络,比如卫星链路——同样适用于中美之间的链路。
1
2
# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno

当前系统的TCP拥塞控制算法只能选择cubic或者reno算法,hybla算法并没有启用,我们就要启用hybla算法。

1
2
3
# /sbin/modprobe tcp_hybla
# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno hybla

这时表明hybla已经可以使用了。

修改sysctl.conf文件,优化TCP参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# cp /etc/sysctl.conf /etc/sysctl.bak
# cat >> /etc/sysctl.conf << EOF
fs.file-max = 51200
#提高整个系统的文件限制
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 3240000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range =10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control= hybla
EOF

使配置生效

1
# sysctl -p

至此,优化也完成了。你可以尽情使用。

搭建完成后进行速度测试,ping值在300左右,但是youtube看1080p视频可以流畅观看,缓冲到底!