Ubuntu 服务器安装shadowsocks


shadowsocks 服务器安装以及常见的错误处理

本教程仅供教育和科学使用,勿进行其他用途。

shadowsocks 服务器安装

首先更新软件源

sudo apt-get update

然后安装 PIP 环境

sudo apt-get install python-pip

接下来直接安装shadowsocks

sudo pip install shadowsocks

运行 shadowsocks 服务器

创建shadowsocks配置文件

使用如下命令创建并打开配置文件

sudo vi /etc/shadowsocks.json

在打开的界面里,输入i进入编辑模式,输入如下内容:

{
"server":"server_ip",
"server_port":443,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"password",
"timeout":300,
"method":"rc4-md5"
}

编辑完成后按esc并输入:x 退出编辑 其中各个字段的含义如下:

  • server 服务器 IP (IPv4/IPv6),注意这也将是服务端监听的 IP 地址
  • server_port 服务器端口
  • local_port 本地端端口
  • password 用来加密的密码
  • timeout 超时时间(秒)
  • method 加密方法,可选择 “bf-cfb”, “aes-256-cfb”, “des-cfb”, “rc4″, 等等。

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

如果需要配置多个用户,可以按照下面的配置修改配置文件:

{
"server":"server_ip",
"port_password": {
"端口1": "密码1",
"端口2": "密码2"
},
"timeout":300,
"method":"rc4-md5",
"fast_open": false
}

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

sudo chmod 755 /etc/shadowsocks.json

安装所需的软件

sudo apt-get install python-m2crypto

设置配置文件在后台运行

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

配置shadowsocks开机自启动

编辑 /etc/rc.local 文件

sudo vi /etc/rc.local

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

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

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

安装 BBR 加速

首先获取 root 权限

sudo su

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

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

安装完成之后重启服务器

安装和配置shadowsocks客户端

将上面配置文件中的ip地址、端口号、密码、加密方式填写到客户端点击连接即可。

常见错误处理

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

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

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 函数,如官网中所说:

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().

处理方法:

  1. 用vim打开文件(该路径请根据自己的系统情况自行修改,如果不知道该文件在哪里的话,可以使用find命令查找文件位置):
vim /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py
  1. 跳转到52行( shadowsocks2.8.2版本,其他版本搜索一下 cleanup)
  2. 进入编辑模式
  3. 将第52行 libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,) 改为libcrypto.EVP_CIPHER_CTX_reset.argtypes = (c_void_p,)
  4. 再次搜索cleanup(全文件共2处,此处位于111行),将libcrypto.EVP_CIPHER_CTX_cleanup(self._ctx) 改为libcrypto.EVP_CIPHER_CTX_reset(self._ctx)
  5. 保存并退出
  6. 启动shadowsocks服务:
sudo ssserver -c /etc/shadowsocks.json -d start

问题解决

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

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