CentOS 7 下搭建 Shadowsocks 服务器
2016-02-05

本文更新于 2017 年 11 月 10 日,0x13 大之后的几日

从 2017 年秋季开始,墙的升级速度不断变快,同时还动用了不少物理手段,约谈了一些相关人士。 上次更新本文已经是一年半之前了,其中用 PPTP 翻越长城的方法已经彻底挂掉。之前很多常用的 ss 加密算法也变得不再安全,所以是时候更新一下文章了。

关于系统

除非有特殊需要,建议使用的所有软件、系统的最新稳定版本并持续更新,来保证安全性。 这里选用 CentOS 7 作为系统。

如果你的机器是 KVM 或其它支持更换内核的架构,强烈建议把内核升级到 4.9 以上的版本,并开启 tcp bbr 拥堵控制算法,在多数网络情况下(特别是丢包率高时)可以大幅度提升连接速度和稳定性。开启 bbr 算法的方式可以参考这篇文章

安装软件包

这里我们选择 Shadowsocks 最正统的 Python 分支。 首先需要安装 pip,但 CentOS 官方的 yum 源中并没有 pip,所以我们需要先安装 EPEL 源:

# yum install epel-release

待安装完后,我们便可以安装 pip:

# yum install python-pip

虽然安装好了 pip,但 pip 源中的 Shadowsocks 的版本已经非常老了,查阅 Shadowsocks Wiki 后找到了正确的安装姿势:

# pip install git+https://github.com/shadowsocks/shadowsocks.git@master

Shadowsocks 可以使用多种加密算法,而现在安全性比较强的算法基本上都需要 libsodium 库:

# yum install libsodium

安装完成。

配置 Shadowsocks

这一步十分简单,因为我们使用的不是 Shadowsocks 多用户版,所以只需要一行命令即可解决:

# ssserver -p 端口号 -k 密码 -m 加密方式 -d start

在这里,端口号推荐使用最常用的几个(例如 443、8080 等)防止被防火墙特殊照顾,加密方式推荐 chacha20-ietf-poly1305,大多数其它算法现在都已经变得不安全了。

举个栗子,假如我们使用 443 端口,加密方式选 rc4-md5,就执行:

# ssserver -p 443 -k 密码 -m rc4-md5 -d start

但这样启动会出现一些问题,因为在 SSH 连接中断后,在这个连接内启动的进程也会被杀掉。 可以把 ss 的进程放进一个专用的 screen 中来解决这个问题。

首先我们需要 screen 这个软件包:

# yum install screen

然后新建一个名字叫 shadowsocks 的 screen:

# screen -S shadowsocks

进入新的 screen 后,我们可以按正常方式启动 shadowsocks,然后按 Ctrl+A 再按 D 键把 screen 放进后台。 这样 ss 就在后台跑起来了。 (想要重新调出这个 screen 窗口,执行 # screen -r shadowsocks 即可)

开机自启

CentOS 7 最大的变化应该就是把 init.d 换成了 systemd,所以不太推荐再使用 rc.local 脚本的方式让 ss 开机自启,正确姿势应该是用 systemctl 控制启动。

首先我们可以新建一个 ss 的配置文件已便于之后的操作,新建一个 /etc/shadowsocks.json,内容如下:

{
  "server": "0.0.0.0",
  "port_password": {
    "端口 1": "端口 1 密码",
    "端口 2": "端口 2 密码",
    "端口 3": "端口 3 密码"
  },
  "method": "chacha20-ietf-poly1305"
}

这是最简单的多用户配置文件,如果需要更多用户,就添加更多行,如果不需要多用户,把多余的两行删掉即可。 (注意除最后一行外每一行末必须要加英文的半角逗号)

之后我们新建一个 shadowsocks 的 systemd 配置文件,文件名为 shadowsocks.service,内容如下:

[Unit]
Description=Shadowsocks

[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json

[Install]
WantedBy=multi-user.target

把这个文件放进 /etc/systemd/system/ 目录下,给它运行权限(# chmod +x /etc/systemd/system/shadowsocks.service

把它设为开机启动项:

# systemctl enable shadowsocks

这样 shadowsocks 就可以开机自动运行了。 如果不放心可以先通过 systemd 启动 shadowsocks 测试一下:

# systemctl start shadowsocks

查看一下服务状态:

# systemctl status shadowsocks

如果显示没有问题,就用你的 shadowsocks 客户端尝试连接一下,能连上的话就说明搭建成功了。

写在最后

在 10 月底,ss 的流量特征已经能靠机器学习被检测到了,有关论文在这里,中文翻译版本在这里(请只关注这篇论文的技术部分)。近期 GFW 的动作是只封端口,遇到大流量且无法识别协议的情况就会封掉这个端口,解决方式只有换成常用端口或直接更换 IP。

纸是包不住火的,不论他们怎么建墙掩人耳目,到头来都会是自掘坟墓。

最后用 Shadowsocks 原作者 Clowwindy 的一句话结束:

I hope one day I’ll live in a country where I have freedom to write any code I like without fearing.