此前写过一个「CentOS6零基础配置shadowsocks服务端完整教程」,但随着软件更新与完善以及某些干扰的加剧,原教程已不再适用,为避免原来那篇一些过时的操作影响需要教程辅助安装的朋友,在此做一些更新。此外,由于博主已从CentOS切换到Debian,以及CentOS操作对新手不甚友好,本教程以bandwagonhost最小安装的Debian8为例,同时补充CentOS对应步骤操作,因CentOS一些软件包的版本较旧可能会撞坑,欢迎在评论中提出以完善教程。

出于安全性考虑,本教程只基于官方教程补充一些细节帮助理解,不会涉及任何一键包
另外不建议使用一键脚本安装,除非你自己能维护其功能,否则安装时若出了问题很难查,而且现在有不少不明来历的一键脚本内嵌后门程序。
此教程为单用户版,配置最为简单,适合个人用户。本教程包含部分教程忽略的性能优化、自启动、更新服务端内容,欢迎有需要的用户浏览。

接下来开始正式开始教程了_(:з」∠)_
以下步骤均以root用户执行,非root用户可su root或在命令前加“sudo ”执行。

一、准备工作

1、从服务商获取服务器IP、SSH端口(默认为22,部分服务商如板瓦工为随机端口)、root密码(部分服务商如Azure不提供root用户登陆)。

2、下载SSH客户端如putty连接所购买VPS,具体操作可自行搜索。

3、执行以下命令(一行一行执行,复制命令后在putty窗口中鼠标右键即可粘贴)先更新一下以免出错,再安装git。

Debian/Ubuntu:

apt-get update
apt-get install git

CentOS/RHEL:

yum update all
yum install git

二、获取源代码

通过git获取ShadowsocksR源代码:

git clone -b manyuser https://github.com/shadowsocksr-backup/shadowsocksr.git

执行完毕后当前目录会出现一个shadowsocksr目录,其中根目录的是多用户版(即数据库版,个人用户请忽略这个),子目录中的是单用户版(即shadowsocksr/shadowsocks,即本次教程所讲的地方)。若当前在/root目录内,则根目录为 /root/shadowsocksr 子目录为 /root/shadowsocksr/shadowsocks。
如果不确定当前在什么目录的话可以通过“pwd”命令查看当前路径,比方说以下情况:

root@SS-LA5:~# pwd
/home/q1ngyang

大致界面如上,可得知当前在/home/q1ngyang目录,则根目录为 /home/q1ngyang/shadowsocksr 子目录为 /home/q1ngyang/shadowsocksr/shadowsocks

三、服务端配置

1、进入根目录初始化配置(假设根目录在/root/shadowsocksr,如果不是,命令需要适当调整):

cd /root/shadowsocksr  //进入根目录
bash initcfg.sh  //初始化配置

 

2、[可选]开启FastOpen性能优化

开启FastOpen可以获取更好性能,此步骤使用OpenVZ虚拟技术的VPS请忽略,上面列举服务商中Linode和DigitalOcean用户使用最新版本系统可考虑开启。

使用“uname -a”命令查看内核版本,需要Linux内核版本3.7.1以上,低于该版本无法开启。

root@SS-LA5:~# uname -a  //查看内核版本
Linux SS-LA5 4.9.0-x86_64-linode79 #1 SMP Mon Dec 12 13:17:30 EST 2016 x86_64 GNU/Linux

创建/etc/sysctl.d/local.conf文件并编辑

touch /etc/sysctl.d/local.conf  //创建文件
vi /etc/sysctl.d/local.conf  编辑文件

将以下内容粘贴到刚刚创建的文件中,vi按“i”进入编辑模式,编辑完成后按“Esc”退出编辑模式,按“Shift”和“:”键进入命令模式,输入“wq”即可保存退出(“q!”为不保存退出)。

# 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

# for high-latency network
# net.ipv4.tcp_congestion_control = hybla

# for low-latency network, use cubic instead
# net.ipv4.tcp_congestion_control = cubic

执行以下命令,使配置生效

sysctl --system

3、编辑配置文件

执行以下“ls”命令查看目录内文件,可以看到配置文件“user-config.json”

root@SS-LA5:~/shadowsocksr# ls
CHANGES          config.json      mujson_mgr.py   tail.sh
CONTRIBUTING.md  configloader.py  mysql.json      tests
Dockerfile       db_transfer.py   run.sh          user-config.json
LICENSE          debian           server.py       userapiconfig.py
MANIFEST.in      importloader.py  server_pool.py  usermysql.json
README.md        initcfg.bat      setup.py        utils
README.rst       initcfg.sh       shadowsocks
apiconfig.py     logrun.sh        stop.sh
asyncmgr.py      mudb.json        switchrule.py

使用vi编辑配置文件

vi user-config.json

参考//后注释编辑配置文件,vi按“i”进入编辑模式,编辑完成后按“Esc”退出编辑模式,按“Shift”和“:”键进入命令模式,输入“wq”即可保存退出(“q!”为不保存退出)。

{
    "server": "0.0.0.0",
    "server_ipv6": "::",
    "out_bind":"0.0.0.0",//输入服务器IPV4地址,只有一个可留空此行
    "out_bindv6":"::",//输入服务器IPV6地址,只有一个或没有IPV6地址可留空此行
    "server_port": 1984,//服务器端口,根据需要在1-65535之间选择即可
    "local_address": "127.0.0.1",
    "local_port": 1080,

    "password": "q1ngyang",//输入想要的加密密码
    "method": "rc4-md5",//推荐使用rc4-md5,速度较快
    "protocol": "auth_sha1_v4_compatible",//推荐,末尾“_compatible”为开启原版协议兼容
    "protocol_param": "",
    "obfs": "tls1.2_ticket_auth_compatible",//推荐,末尾“_compatible”为开启原版协议兼容
    "obfs_param": "",
    "speed_limit_per_con": 0,
    "speed_limit_per_user": 0,

    "additional_ports" : {}, // only works under multi-user mode
    "timeout": 120,
    "udp_timeout": 60,
    "dns_ipv6": false,//优先使用IPV6,若需要则改为true
    "connect_verbose_info": 0,
    "redirect": ["amazon.com", "incapsula.com:443"],//连接参数不正确时重定向,避免服务器被认证
    "fast_open": false//若通过之前步骤开启了fastopen,则改为true
}

以上为最基本的配置方式,如有更多需求,可以参照以下页面修改:
ShadowsocksR 协议插件文档:https://github.com/breakwa11/shadowsocks-rss/blob/master/ssr.md
配置文件各项说明:https://github.com/breakwa11/shadowsocks-rss/wiki/config.json

四、运行服务端

1、前往子目录/root/shadowsocksr/shadowsocks

cd /root/shadowsocksr/shadowsocks

2、操作ShadowsocksR命令

python server.py  //在前台运行(一般不这么用)
python server.py -d start  //后台启动
python server.py -d stop  //停止运行
python server.py -d restart //重新启动

五、更新服务端

ShadowsocksR会定期更新一些新特性或修复BUG,如果当前使用遇到问题或者想体验新功能,可以定期手动更新服务端。

cd /root/shadowsocksr //进入主目录
git pull  //更新文件,成功后重启服务端
python /root/shadowsocksr/shadowsocks/server.py -d restart  //重启服务端

至此,ShadowsocksR服务端部署常规部分完毕,通过以上教程可正常使用。如果觉得上述命令太麻烦或者每回都要开机启动不方便的话可进行以下步骤。

六、添加开机自启动

以下启动脚本均假定Python port of ShadowsocksR安装于/root/shadowsocksr目录,配置文件为/root/shadowsocksr/user-config.json,请按照实际情况自行修改。

先关闭ShadowsocksR,然后创建/etc/init.d/shadowsocks文件并编辑

python /root/shadowsocksr/shadowsocks/server.py -d stop  //关闭ShadowsocksR
touch /etc/init.d/shadowsocks  //创建文件
vi /etc/init.d/shadowsocks  //编辑文件

使用以下SysVinit启动脚本,适合CentOS/RHEL6系以及Ubuntu 14.x,Debian7.x以上版本。

#!/bin/sh
# chkconfig: 2345 90 10
# description: Start or stop the Shadowsocks R server
#
### BEGIN INIT INFO
# Provides: Shadowsocks-R
# Required-Start: $network $syslog
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Start or stop the Shadowsocks R server
### END INIT INFO

# Author: Yvonne Lu(Min) <min@utbhost.com>

name=shadowsocks
PY=/usr/bin/python
SS=/root/shadowsocksr/shadowsocks/server.py
SSPY=server.py
conf=/root/shadowsocksr/user-config.json

start(){
    $PY $SS -c $conf -d start
    RETVAL=$?
    if [ "$RETVAL" = "0" ]; then
        echo "$name start success"
    else
        echo "$name start failed"
    fi
}

stop(){
    pid=`ps -ef | grep -v grep | grep -v ps | grep -i "${SSPY}" | awk '{print $2}'`
    if [ ! -z $pid ]; then
        $PY $SS -c $conf -d stop
        RETVAL=$?
        if [ "$RETVAL" = "0" ]; then
            echo "$name stop success"
        else
            echo "$name stop failed"
        fi
    else
        echo "$name is not running"
        RETVAL=1
    fi
}

status(){
    pid=`ps -ef | grep -v grep | grep -v ps | grep -i "${SSPY}" | awk '{print $2}'`
    if [ -z $pid ]; then
        echo "$name is not running"
        RETVAL=1
    else
        echo "$name is running with PID $pid"
        RETVAL=0
    fi
}

case "$1" in
'start')
    start
    ;;
'stop')
    stop
    ;;
'status')
    status
    ;;
'restart')
    stop
    start
    RETVAL=$?
    ;;
*)
    echo "Usage: $0 { start | stop | restart | status }"
    RETVAL=1
    ;;
esac
exit $RETVAL

保存后执行以下命令:

Debian/Ubuntu:

chmod 755 /etc/init.d/shadowsocks ; update-rc.d shadowsocks defaults ; service shadowsocks start

CentOS/RHEL:

chmod 755 /etc/init.d/shadowsocks && chkconfig --add shadowsocks && service shadowsocks start

执行成功后可以开机自起,不用每次都手动启动服务端。

此外,还可以通过以下命令,在任意目录中操作ShadowsocksR

service shadowsocks start  //启动
service shadowsocks stop  //停止
service shadowsocks restart  //重启
service shadowsocks status  //查看状态