Ubuntu 下 Shadowsocks 服务端的安装及优化

转载自 Ubuntu 16.04下Shadowsocks服务器端安装及优化 – Penguin

前言

本文旨在提供简明的 Ubuntu 下安装 Shadowsocks 服务端的教程,并包括常用的优化:包括 BBR、TCP Fast Open以及吞吐量优化。

文中使用了 Ubuntu 16.04 及之后的版本支持的 Systemd 管理 Shadowsocks 的启动与停止,显得更为便捷,但因此也仅适用于 Ubuntu 16.04 及之后的版本,基于 Python 3 ,支持 IPv6

文章测试的系统环境为最新的 Ubuntu 18.10

安装 Shadowsocks 服务端

安装 pip

本教程使用 Python 3 为载体,因 Python 3 对应的包管理器 pip3 并未预装,首先安装 pip3

sudo apt install python3-pip

如果提示 Unable to locate package ,很可能是系统刚配置完毕,软件源还来不及更新,所以无法找到包,一般会在新镜像配置完毕后短时间内出现,这个时候只需要输入:

sudo apt-get update

再执行安装 pip3 的指令就可以了

安装 Shadowsocks

因 Shadowsocks 作者不再维护 pip 中的 Shadowsocks (定格在了2.8.2),我们使用下面的命令来安装最新版的 Shadowsocks :

pip3 install https://github.com/shadowsocks/shadowsocks/archive/master.zip

安装完成后可以使用下面这个命令查看 Shadowsocks 版本:

sudo ssserver --version

目前版本会显示 “Shadowsocks 3.0.0” 。

创建配置文件

创建 Shadowsocks 配置文件所在文件夹:

sudo mkdir /etc/shadowsocks

然后创建配置文件,这一步可以用常用的编辑器 nano 完成,也可以用 WinSCP 连接服务器手动创建 (个人更喜欢后者一点,因为修改起来比较方便),以下为 nano 创建文件的命令 :

sudo nano /etc/shadowsocks/config.json

如果是单用户 (单端口) 使用,复制粘贴如下内容 (注意修改密码) :

{
    "server":"::",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"用户的密码",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

如果是多用户 (单端口) 使用,复制粘贴如下内容 (注意修改密码,并且注意端口冲突) :

{
	"server":"::",
	"local_address": "127.0.0.1",
	"local_port":1080,
	"port_password":
	{
		"8388":"端口A的密码",
		"9000":"端口B的密码",
		"9001":"端口C的密码"
	},
	"timeout":300,
	"method":"aes-256-cfb",
	"fast_open": false
}

如果使用了 nano 编辑,按 Ctrl + O 保存文件,下方会提示确认文件位置,按 回车 写入文件,按 Ctrl + X 退出。

配置 Systemd 管理 Shadowsocks

新建 Shadowsocks 管理文件 (这一步没有什么需要修改的,可以直接用 nano 完成) :

sudo nano /etc/systemd/system/shadowsocks-server.service

复制粘贴如下内容:

[Unit]
Description=Shadowsocks Server
After=network.target

[Service]
ExecStart=/usr/local/bin/ssserver -c /etc/shadowsocks/config.json
Restart=on-abort

[Install]
WantedBy=multi-user.target

Ctrl + O 保存文件。 回车 写入, Ctrl + X 退出。

启动 Shadowsocks :

sudo systemctl start shadowsocks-server

设置开机启动 Shadowsocks :

sudo systemctl enable shadowsocks-server

到这里, Shadowsock 服务器端的基本配置就已经全部完成了!

客户端测试连接

在你的 Shadowsocks 客户端添加服务器,地址填写 你的 VPS 的地址,端口号默认为 8388 ,加密方法默认为 aes-256-cfb ,密码为 你设置的密码。然后设置客户端使用全局模式,浏览器登录 Google 应该就能打开了。

优化

服务端优化尤其 BBR ,对 IPv4 的连接可以说有奇效,通常能使速度大幅提升。这部分属于进阶操作,但是也非常简单。

开启 BBR

BBRGoogle 最新开发的 TCP 拥塞控制算法,目前有着很好的带宽提升效果。

版本检测

BBRLinux kernel 4.9 引入,所以首先要检查服务器的 kernel 版本:

uname -r

如果其显示版本在 4.9.0 以下,则需要升级 Linux 内核 (建议直接更新系统) 。如果和本文一样使用最新的 Ubuntu 18.10 的话,会显示 4.18.0-10-generic。

开启 BBR

检查是否有 BBR

lsmod | grep bbr

如果结果中没有 tcp_bbr (大部分服务器都没有设置,目前使用过的只有 Vultr 的 VPS 会显示),则先执行:

modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf

确认出现 tcp_bbr 之后执行:

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

保存指令并使其生效:

sysctl -p

查看是否生效:

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

若均有 bbr ,则开启 BBR 成功。

成功开启 BBR 的情况

优化吞吐量

新建配置文件:

sudo nano /etc/sysctl.d/local.conf

复制粘贴如下内容:

# max open files
fs.file-max = 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
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# 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

net.ipv4.tcp_congestion_control = bbr

保存指令并使其生效:

sysctl --system

编辑之前的 shadowsocks-server.service 文件:

sudo nano /etc/systemd/system/shadowsocks-server.service

ExecStart 前插入一行,内容为:

ExecStartPre=/bin/sh -c 'ulimit -n 51200'

即修改后的 shadowsocks-server.service 内容如图所示:

shadowsocks-server.service 文件内容

Ctrl + O 保存文件。 回车 写入, Ctrl + X 退出。

重载 shadowsocks-server.service

sudo systemctl daemon-reload

重启 Shadowsocks

sudo systemctl restart shadowsocks-server

吞吐量优化就完成了。

开启 TCP Fast Open

TCP Fast Open 可以降低 Shadowsocks 服务器和客户端的延迟。实际上在上一步已经开启了 TCP Fast Open ,现在只需要在 Shadowsock s配置中启用 TCP Fast Open

nanoWinSCP 编辑 config.json

sudo nano /etc/shadowsocks/config.json

fast_open 的值由 false 修改为 true 。 Ctrl + O 保存文件。 回车 写入, Ctrl + X 退出。

重启 Shadowsocks

sudo systemctl restart shadowsocks-server

到这里, Shadowsocks 服务器端的优化就全部完成了!

机场除雾指南(。

如果某一天 Shadoowsocks 突然不能用了,那八成就是被GFW拦截了 。被拦截的原因就是电信运营商探测出了你的流量然后屏蔽了,诱因可能有以下几点:

  1. 使用的人很多(多地点连接)
  2. 特殊时期(8 * 8)
  3. 美国的 IP 容易被和谐
  4. 美国便宜服务商的 IP 尤其容易被和谐

判断是否被屏蔽

判断和谐很简单,直接 Telnet 一下端口就可以了。利用 ping.pe 这个网站可以很轻松的测试你的端口是否被屏蔽。点下面这个链接可以看看我的 Digital Ocean 服务器的 8388 端口有没有被屏蔽:

http://port.ping.pe/你的服务器地址:你的端口

测试结果如下图,应该还是正常的。如果红圈内即国内节点全部不通的话,你知道我想说什么233

ping.pe 测试结果
ping.pe 测试结果

真的挂了怎么办

首先判断你到底是被封端口还是被封 IP 了,封端口的话直接换端口即可,封 IP 的话也是换 IP 就可以了。

现在大部分国外 VPS 提供商都可以换IP,只需要 1-2 美元,不用多想直接换。但是在特殊时期或者遇到一些被玩坏的提供商,你可能换好几个 IP 还是被墙的,这个时候你只能要么继续碰运气,要么索性换提供商。

预算在 5$ / month 以上的话可以尝试一下 CN2 GIA 线路,高质量线路不但能带来更好的体验,还能降低被封的概率;或者换地区,比如香港的 VPS,延迟低而且不容易被封。要注意一点,高质量的线路换 IP 也会贵很多,一般换一次在 5 美元左右。

原文参考