基本库安装

以下命令均以root用户执行,或sudo方式执行

centos:
yum install m2crypto git libsodium

ubuntu/debian:
apt-get install m2crypto git

————–
如果要使用 salsa20 或 chacha20 或 chacha20-ietf 算法,请安装 libsodium :
centos:
yum -y groupinstall “Development Tools"
wget https://github.com/jedisct1/libsodium/releases/download/1.0.10/libsodium-1.0.10.tar.gz
tar xf libsodium-1.0.10.tar.gz && cd libsodium-1.0.10
./configure && make -j2 && make install
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig

ubuntu/debian:
apt-get install build-essential
wget https://github.com/jedisct1/libsodium/releases/download/1.0.10/libsodium-1.0.10.tar.gz
tar xf libsodium-1.0.10.tar.gz && cd libsodium-1.0.10
./configure && make -j2 && make install
ldconfig

如果曾经安装过旧版本,亦可重复用以上步骤更新到最新版,仅1.0.4或以上版本支持chacha20-ietf

================
获取源代码
git clone -b manyuser https://github.com/shadowsocksr-backup/shadowsocksr.git

执行完毕后此目录会新建一个shadowsocks目录,其中根目录的是多用户版(即数据库版,个人用户请忽略这个),子目录中的是单用户版(即shadowsocks/shadowsocks)。
根目录即 ./shadowsocks
子目录即 ./shadowsocks/shadowsocks

=================
服务端配置

进入根目录初始化配置(假设根目录在~/shadowsocksr,如果不是,命令需要适当调整):
cd ~/shadowsocksr
bash initcfg.sh

以下步骤要进入子目录:
cd ~/shadowsocksr/shadowsocks
####快速运行####
python server.py -p 443 -k password -m aes-256-cfb -O auth_sha1_v4 -o http_simple
#说明:-p 端口 -k 密码 -m 加密方式 -O 协议插件 -o 混淆插件

如果要后台运行:
python server.py -p 443 -k password -m aes-256-cfb -O auth_sha1_v4 -o http_simple -d start

如果要停止/重启:
python server.py -d stop/restart

查看日志:
tail -f /var/log/shadowsocksr.log
用 -h 查看所有参数

####使用配置文件运行####
如果你的ss目录是~/shadowsocksr,进入这里 修改user-config.json中的server_port,password等字段,具体可参见: https://github.com/shadowsocksr-backup/shadowsocks-rss/wiki/config.json
建立配置文件 vi /etc/shadowsocks.json

写入以下内容:

{
“server": “0.0.0.0″,
“server_ipv6″: “::",
“server_port": 8388,
“local_address": “127.0.0.1″,
“local_port": 1080,
“password": “mypassword",
“timeout": 120,
“method": “aes-256-cfb",
“protocol": “auth_sha1_compatible",
“protocol_param": “",
“obfs": “tls1.2_ticket_auth_compatible",
“obfs_param": “",
“redirect": “",
“dns_ipv6″: false,
“fast_open": false,
“workers": 1
}
各选项说明:

Name Explanation 中文说明
server the address your server listens 监听地址
server_ipv6 the ipv6 address your server listens ipv6地址
server_port server port 监听端口
local_address the address your local listens 本地地址
local_port local port 本地端口
password password used for encryption 密码
timeout in seconds 超时时间
udp_timeout in seconds UDP链超时时间
udp_cache cache size UDP链缓冲区大小
method default: “aes-256-cfb", see Encryption 加密方式
protocol default:"origin" 协议插件,默认"origin"
protocol_param default:"" 协议插件参数,默认""
obfs default:"tls1.2_ticket_auth_compatible" 混淆插件,默认"tls1.2_ticket_auth_compatible"
obfs_param default:"" 混淆插件参数,默认""
redirect default:"" 重定向参数,默认""
dns_ipv6 default:false 是否优先使用IPv6地址,有IPv6时可开启
fast_open use TCP_FASTOPEN, true / false 快速打开(仅限linux客户端)
workers number of workers, available on Unix/Linux 线程(仅限linux客户端)
verbose display verbose debug info 显示调试信息
connect_verbose_info display connection verbose info 显示连接信息
forbidden_ip forbidden IP set for outbound 阻止连接到此IP列表
forbidden_port forbidden port set for outbound 阻止连接到此端口列表
ignore_bind not bind the IP set 不绑定的IP列表
out_bind force bind this IPv4 IP 强制绑定此IPv4地址
out_bindv6 force bind this IPv6 IP 强制绑定此IPv6地址
additional_ports additional ports for multiuser mode 多用户模式下配置额外端口
speed_limit_per_con rate limit for each connection 单连接限速,单位KB
speed_limit_per_user rate limit for each user 单用户限速,单位KB
其中protocol有如下取值:

protocol 说明
“origin" 原版协议
“verify_simple" 带校验的协议
“verify_deflate" 带压缩的协议
“verify_sha1″ 带验证抗CCA攻击的协议,可兼容libev的OTA
“auth_simple" 抗重放攻击的协议
“auth_sha1″ 带验证抗CCA攻击且抗重放攻击的协议
其中obfs有如下取值:

obfs 说明
“plain" 不混淆
“http_simple" 伪装为http协议
“tls_simple" 伪装为tls协议(不建议使用)
“random_head" 发送一个随机包再通讯的协议
“tls1.0_session_auth" 伪装为tls session握手协议(不建议使用),同时能抗重放攻击
“tls1.2_ticket_auth" 伪装为tls ticket握手协议(强烈推荐),同时能抗重放攻击
各混淆插件的说明请点击这里查看:混淆插件说明

注:客户端的protocol和obfs配置必须与服务端的一致。

redirect参数说明:

值为空字符串或一个列表,若为列表示例如
“redirect":[“bing.com", “cloudflare.com:443″],
作用是在连接方的数据不正确的时候,把数据重定向到列表中的其中一个地址和端口(不写端口则视为80),以伪装为目标服务器。

dns_ipv6参数说明:

为true则指定服务器优先使用IPv6地址。仅当服务器能访问IPv6地址时可以用,否则会导致有IPv6地址的网站无法打开。

一般情况下,只需要修改以下五项即可:

“server_port":8388, //端口
“password":"password", //密码
“protocol":"origin", //协议插件
“obfs":"http_simple", //混淆插件
“method":"aes-256-cfb", //加密方式
多端口配置

如果要多个用户一起使用的话,请写入以下配置:

{
“server":"0.0.0.0″,
“server_ipv6″: “[::]",
“local_address":"127.0.0.1″,
“local_port":1080,
“port_password":{
“80″:"password1″,
“443″:"password2″
},
“timeout":300,
“method":"aes-256-cfb",
“protocol": “auth_sha1_compatible",
“protocol_param": “",
“obfs": “http_simple_compatible",
“obfs_param": “",
“redirect": “",
“dns_ipv6″: false,
“fast_open": false,
“workers": 1
}
按照格式修改端口和密码:

“port_password":{
“80″:"password1″, //端口和密码1
“443″:"password2″ //端口和密码2
},
如果要为每个端口配置不同的混淆协议,请写入以下配置:

{
“server":"0.0.0.0″,
“server_ipv6″:"::",
“local_address":"127.0.0.1″,
“local_port":1080,
“port_password":{
“8388″:{“protocol":"auth_simple", “password":"abcde", “obfs":"http_simple", “obfs_param":""},
“8389″:{“protocol":"origin", “password":"abcde"}
},
“timeout":300,
“method":"aes-256-cfb",
“protocol": “auth_sha1_compatible",
“protocol_param": “",
“obfs": “http_simple_compatible",
“obfs_param": “",
“redirect": “",
“dns_ipv6″: false,
“fast_open": false,
“workers": 1
}
按格式修改端口、密码以及混淆协议。也可以和以前的格式混合使用,如果某个端口不配置混淆协议,则会使用下面的默认"obfs"配置。

——————-
运行子目录内的server.py:
python server.py

如果要在后台运行:
python server.py -d start

如果要停止/重启:
python server.py -d stop/restart

查看日志:
tail -f /var/log/shadowsocksr.log

—————-
更新源代码

如果代码有更新可用本命令更新代码
进入shadowsocksr目录
cd shadowsocksr
执行
git pull
成功后重启ssr服务

================
启动脚本

以下启动脚本均假定shadowsocks-rss安装于/usr/local目录,配置文件为/etc/shadowsocks.json,请按照实际情况自行修改

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)

name=shadowsocks
PY=/usr/bin/python
SS=/usr/local/shadowsocks/server.py
SSPY=server.py
conf=/etc/shadowsocks.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
请将上述脚本保存为/etc/init.d/shadowsocks
CentOS执行chmod 755 /etc/init.d/shadowsocks && chkconfig –add shadowsocks && service shadowsocks start
Debian执行chmod 755 /etc/init.d/shadowsocks ; update-rc.d shadowsocks defaults ; service shadowsocks start

systemd脚本,适用于CentOS/RHEL7以上,Ubuntu 15以上,Debian8以上

[Unit]
Description=Start or stop the Shadowsocks R server
After=network.target
Wants=network.target
[Service]
Type=forking
PIDFile=/var/run/shadowsocks.pid
ExecStart=/usr/bin/python /usr/local/shadowsocks/server.py –pid-file /var/run/shadowsocks.pid -c /etc/shadowsocks.json -d start
ExecStop=/usr/bin/python /usr/local/shadowsocks/server.py –pid-file /var/run/shadowsocks.pid -c /etc/shadowsocks.json -d stop
[Install]
WantedBy=multi-user.target
请将上述脚本保存为/etc/systemd/system/shadowsocks.service
并执行systemctl enable shadowsocks.service && systemctl start shadowsocks.service
————以上为原版说明,下面的为克隆版说明
单用户版
[Unit]
Description=ShadowsocksR server
After=network.target
Wants=network.target

[Service]
Type=forking
PIDFile=/var/run/shadowsocksr.pid
ExecStart=/usr/bin/python /usr/local/shadowsocksr/shadowsocks/server.py –pid-file /var/run/shadowsocksr.pid -c /usr/local/shadowsocksr/user-config.json -d start
ExecStop=/usr/bin/python /usr/local/shadowsocksr/shadowsocks/server.py –pid-file /var/run/shadowsocksr.pid -c /usr/local/shadowsocksr/user-config.json -d stop
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

多用户版
[Unit]
Description=ShadowsocksR server
After=syslog.target
After=network.target

[Service]
LimitCORE=infinity
LimitNOFILE=512000
LimitNPROC=512000
Type=simple
WorkingDirectory=/usr/local/shadowsocksr
ExecStart=/usr/bin/python /usr/local/shadowsocksr/server.py
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target

将上述脚本保存为/etc/systemd/system/shadowsocksr.service 并执行systemctl enable shadowsocksr.service && systemctl start shadowsocksr.service
==============以上为克隆版说明
其它异常

如果你的服务端python版本在2.6以下,那么必须更新python到2.6.x或2.7.x版本

如果运行一段时间后,你发现服务器无法连接,同时ssh连上去后,执行
netstat -ltnap | grep -c CLOSE_WAIT
显示的数值很大(超过50是严重不正常),那么请修改服务器的最大连接数,如果是ubuntu/centos均可修改
/etc/security/limits.conf
添加两行:
* soft nofile 32768
* hard nofile 131072
然后重启机器生效

如果还是出现大量的too many open files错误,可以通过执行以下命令确定占用大量文件数的进程:

lsof -n |awk ‘{print $2}’|sort|uniq -c |sort -nr|more

针对centos,还需要于/etc/pam.d/login检查有没有session required pam_limits.so,没有就加上 保存后,重启操作系统生效

如果使用supervisor进程守护,需要修改文件/etc/default/supervisor,添加一行:
ulimit -n 512000
还可以在supervisord.conf的supervisord字段下添加minfds=512000来提升文件描述符限制 针对centos7,你还需要在/usr/lib/systemd/system/supervisord.service的service段添加
LimitNOFILE=512000
再启动你的服务

==================
PS:
https://web.archive.org/web/20160512191732/https://github.com/breakwa11/shadowsocks-rss/wiki/Server-Setup
https://github.com/shadowsocksr-backup/shadowsocks-rss/wiki/Server-Setup