服务端安装

如果没有 root 权限,首先获取 root 权限

1
sudo su

Debian / Ubuntu

1
2
apt-get install python-pip
pip install shadowsocks

CentOS

1
2
yum install python-setuptools && easy_install pip
pip install shadowsocks

在 etc 目录下创建 shadowsocks.json 文件,并且配置如下

1
2
3
4
5
6
7
8
9
{
"server": "my_server_ip",
"server_port": 8000,
"local_address": "127.0.0.1",
"local_port": 1080,
"password": "mypassword",
"timeout": 300,
"method": "rc4-md5"
}

创建完成后,给文件相应的权限

1
sudo chmod 755 /etc/shadowsocks.json

安装所需的软件

1
sudo apt-get install python-m2crypto

后台运行 shadowsocks 服务

1
ssserver -c /etc/shadowsocks.json -d start

配置shadowsocks开机自启动

编辑 /etc/rc.local 文件

1
sudo vi /etc/rc.local

在 exit 0 这一行的上边加入如下

1
/usr/local/bin/ssserver –c /etc/shadowsocks.json

到此配置完成。重启服务器后,ss会自动启动。

TIPS

加密方式推荐使用rc4-md5,因为 RC4 比 AES 速度快好几倍,如果用在路由器上会带来显著性能提升。旧的 RC4 加密之所以不安全是因为 Shadowsocks 在每个连接上重复使用 key,没有使用 IV。现在已经重新正确实现,可以放心使用。更多可以看 issue。

加速优化

下面介绍几种简单的优化方法,也是比较推荐的几种。

安装 BBR 加速

输入如下的命令进行安装:

1
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

安装完成之后重启服务器

内核参数优化

首先,将 Linux 内核升级到 3.5 或以上。

第一步,增加系统文件描述符的最大限数

编辑文件 limits.conf

vi /etc/security/limits.conf

增加以下两行

1
2
* soft nofile 51200
* hard nofile 51200

启动shadowsocks服务器之前,设置以下参数

第二步,调整内核参数

修改配置文件 /etc/sysctl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fs.file-max = 51200
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
dev_max_backlog = 250000
net.core.somaxconn = 4096
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control = hybla

修改后执行 sysctl -p 使配置生效

net-speeder

net-speeder 原理非常简单粗暴,就是发包翻倍,这会占用大量的国际出口带宽,本质是损人利己,不建议使用。

Centos 下安装依赖包

1
2
rpm -ivh epel-release-7-5.noarch.rpm
yum repolist

然后安装依赖包:

1
yum install libnet libpcap libnet-devel libpcap-devel

下载官方的 tar.gz 压缩包。解压安装运行:

1
2
3
4
tar zxvf net_speeder-v0.1.tar.gz
cd net_speeder
chmod 777 *
sh build.sh -DCOOKED

首先你需要知道你的网卡设备名,可以使用 ifconfig 查看。假设是eth0,那么运行方法是:

关闭 net-speeder

pyenv 管理 python 版本

linux 中的 python 版本使用 pyenv 管理,如果 pyenv 失效了,可以通过以下命令恢复(更换 python 版本会导致 shadowsocks 不可用,因为安装的包找不到了)

1
2
3
4
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ exec $SHELL

常见错误处理

1.AttributeError: /usr/lib/x86_64-Linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup

最近在 Ubuntu 18.04 LTS 版本上安装编译 shadowsocks 之后无法启动,报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
NFO: loading config from ss.json 
2018-12-11 22:47:50 INFO loading libcrypto from libcrypto.so.1.1
Traceback (most recent call last):
File “/usr/local/bin/sslocal”, line 11, in
sys.exit(main())
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/local.py”, line 39, in main
config = shell.get_config(True)
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py”, line 262, in get_config
check_config(config, is_local)
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py”, line 124, in check_config
encrypt.try_cipher(config[‘password’], config[‘method’])
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py”, line 44, in try_cipher
Encryptor(key, method)
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py”, line 83, in init
random_string(self._method_info[1]))
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py”, line 109, in get_cipher
return m[2](method, key, iv, op)
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py”, line 76, in init
load_openssl()
File “/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py”, line 52, in load_openssl
libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)
File “/usr/lib/python2.7/ctypes/init.py”, line 375, in getattr
func = self.getitem(name)
File “/usr/lib/python2.7/ctypes/init.py”, line 380, in getitem
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/lib/x86_64-Linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup

这个问题是由于在 openssl1.1. 0版本中,废弃了 EVP_CIPHER_CTX_cleanup 函数,如官网中所说:

1
2
EVP_CIPHER_CTX was made opaque in OpenSSL 1.1.0. As a result, EVP_CIPHER_CTX_reset() appeared and EVP_CIPHER_CTX_cleanup() disappeared. 
EVP_CIPHER_CTX_init() remains as an alias for EVP_CIPHER_CTX_reset().

处理方法:

用vim打开文件(该路径请根据自己的系统情况自行修改,如果不知道该文件在哪里的话,可以使用find命令查找文件位置):

1
vim /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py
  1. 进入编辑模式, 跳转到52行( shadowsocks2.8.2版本,其他版本搜索一下 cleanup)
  2. 将第52行 libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,) 改为libcrypto.EVP_CIPHER_CTX_reset.argtypes = (c_void_p,)
  3. 再次搜索cleanup(全文件共2处,此处位于111行),将libcrypto.EVP_CIPHER_CTX_cleanup(self._ctx) 改为libcrypto.EVP_CIPHER_CTX_reset(self._ctx)
  4. 保存并退出,启动shadowsocks服务:
    1
    ssserver -c /etc/shadowsocks.json -d start

2.谷歌服务器启动之后无连接

这是因为在 shadowsocks.json 配置文件中将 server 配置成了公网ip,需要将这里配置为 内部ip即可。