EAimTY的博客
一个没什么技术的开源爱好者,一个苦逼的学生狗。

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

从2017年秋季开始,墙的升级速度不断变快,同时动用了不少手段,在现实中约谈了一些相关人士。

本文的上一个版本发布时间已经是一年半之前了,其中用PPTP翻越长城的方法已经彻底挂掉了。之前很多常用的ss加密算法也变得不再安全,所以是时候更新一下文章了。

关于系统

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

如果你的机器是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/[email protected]

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的screen被关闭后,这个screen内的进程也会被杀掉。
可以把ss的进程放进一个专用的screen中来解决这个问题。

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

# yum install screen

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

# screen -S shadowsocks

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

开机自启

CentOS7最大的变化应该就是把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.

已有 3 条评论
    liwl
    2018-02-28 15:17

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

    这段只能用systemctl enable shadowsocks吧。
    systemctl start shadowsocks
    报错:Unit etc-systemd-system-shadowsocks.service.mount could not be found.

      EAimTY
      2018-03-01 19:56

      ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json
      这句简单来说就是告诉systemd在执行启动操作是要执行的命令。
      systemctl enable说白了就是在系统启动时自动帮你systemctl start,效果类似于当年的rc.local。
      我这里使用start操作没有任何问题…可能是系统问题吧

    amen
    amen
    2019-06-30 02:49

    在别的大佬那里看到说unit那里加After=network.target会比较好0.0

    [Unit]
    Description=Shadowsocks Client Service
    After=network.target

    [Service]
    Type=simple
    User=root
    ExecStart=/usr/bin/sslocal -c /home/xx/Software/ShadowsocksConfig/shadowsocks.json

    [Install]
    WantedBy=multi-user.target

添加新评论