搭建和配置SS服务器

搭建SS服务器较为简单,使用Pythonnodejs都可方便地搭建。不过二者冲突,选其一即可。

不必下载使用网络上的某些一键安装的sh或python脚本,因为可能链接已经失效或者版本太老。

以下说明以Ubuntu为例。

注意:以下指令执行时,若提示权限不足,则用sudo执行。

一、使用Python搭建

使用Python的搭建方法简述如下:

  1. 假定已有符合要求的服务器,通过SSH登录。

  2. 安装pip:

$ apt-get install python-pip
  1. 安装SS

$ pip install shadowsocks

解决 Command "python setup.py egg_info" failed with error code 1 问题

在执行 pip install -r requirements.txt 时遇到错误:

Command "python setup.py egg_info" failed with error code 1

解决方法是更新 setuptools 和 pip:

pip install --upgrade setuptoolspython -m pip install --upgrade pip



  1. 建立配置文件

$ vim /etc/shadowsocks.json

其中vim可以换成自己喜欢的编辑器,配置文件的位置也可自选。

  1. 编辑配置文件
    在配置文件中填入以下内容,并按需更改(可更改也即可不改)。

{"server":"0.0.0.0", # 服务器监听地址,不改"server_port":8388, # 监听端口,可更改"local_address": "127.0.0.1", # 本地地址,不改"local_port":1080, # 本地端口,可更改"password":"mypassword", # 密码,一定要更改"timeout":300, # 超时,可更改"method":"aes-256-cfb" # 加密方式,可更改
}

编辑完成后,保存。

  1. 启动服务
    在命令行中启动服务,并后台执行。

$ ssserver -c /etc/shadowsocks.json -d start &


本文适用于解决openssl升级到1.1.0以上版本,导致shadowsocks2.8.2启动报undefined symbol: EVP_CIPHER_CTX_cleanup错误。

最近将kali升级到了最新版本,编译之后shadowsocks无法启动,报错如下:

 

  1.  

    INFO: loading config from ss.json

  2.  

    2016-12-14 22:47:50 INFO loading libcrypto from libcrypto.so.1.1

  3.  

    Traceback (most recent call last):

  4.  

    File “/usr/local/bin/sslocal”, line 11, in

  5.  

    sys.exit(main())

  6.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/local.py”, line 39, in main

  7.  

    config = shell.get_config(True)

  8.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py”, line 262, in get_config

  9.  

    check_config(config, is_local)

  10.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py”, line 124, in check_config

  11.  

    encrypt.try_cipher(config[‘password’], config[‘method’])

  12.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py”, line 44, in try_cipher

  13.  

    Encryptor(key, method)

  14.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py”, line 83, in init

  15.  

    random_string(self._method_info[1]))

  16.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py”, line 109, in get_cipher

  17.  

    return m[2](method, key, iv, op)

  18.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py”, line 76, in init

  19.  

    load_openssl()

  20.  

    File “/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py”, line 52, in load_openssl

  21.  

    libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)

  22.  

    File “/usr/lib/python2.7/ctypes/init.py”, line 375, in getattr

  23.  

    func = self.getitem(name)

  24.  

    File “/usr/lib/python2.7/ctypes/init.py”, line 380, in getitem

  25.  

    func = self._FuncPtr((name_or_ordinal, self))

  26.  

    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打开文件:vim /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py (该路径请根据自己的系统情况自行修改,如果不知道该文件在哪里的话,可以使用find命令查找文件位置)

    2. 跳转到52行(shadowsocks2.8.2版本,其他版本搜索一下cleanup)

    3. 进入编辑模式

    4. 将第52行libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,) 
      改为libcrypto.EVP_CIPHER_CTX_reset.argtypes = (c_void_p,)

    5. 再次搜索cleanup(全文件共2处,此处位于111行),将libcrypto.EVP_CIPHER_CTX_cleanup(self._ctx) 
      改为libcrypto.EVP_CIPHER_CTX_reset(self._ctx)

    6. 保存并退出

    7. 启动shadowsocks服务:service shadowsocks start 或 sslocal -c ss配置文件目录

    8. 问题解决




配置文件的目录改为刚才保存的目录。末尾的&表示后台运行。也可用nohup指令不挂断地运行。

$ nohup ssserver -c /etc/shadowsocks.json -d start &

二、使用Nodejs搭建

使用Nodejs的搭建方法简述如下:

  1. 假定已有符合要求的服务器,通过SSH登录。

  2. 安装nodejs和npm:

$ apt-get install nodejs nodejs-legacy npm
  1. 安装SS

$ npm install shadowsocks
  1. 修改配置文件
    使用nodejs搭建时,配置文件会自动生成,所以无需新建。仍然按照前面介绍的方法修改配置文件。配置文件的位置在nodejs的shadowsocks安装目录下。可以根据安装过程的打印信息看到安装目录,或用find指令搜索config.json。

$ vim [directory]/config.json

其中vim可以换成自己喜欢的编辑器。编辑完成后,保存。

  1. 启动服务
    在命令行中启动服务,并后台执行。

$ ssserver &

末尾的&表示后台运行。也可用nohup指令不挂断地运行。

$ nohup ssserver &

三、常见问题
可能遇到的问题:
(1)启动服务时报错。
EADDRNOTAVAIL:地址无效。注意配置文件中的server写0.0.0.0。
EADDRINUSE:地址重复。不要重复开启服务。
(2)服务已启动但无法连接。
首先确认配置文件正确。
然后确认端口(即server_port)没有被使用。
通过以下命令查看临时端口范围:

$ cat /proc/sys/net/ipv4/ip_local_port_range

通过在另一台Linux计算机上执行以下命令查看端口是否打开:

$ telnet [Your Server IP] [Your Port]

作为参考,22号端口一般都是打开的。
如果端口没有打开,考虑是否在服务器上开启了防火墙。用以下指令查看防火墙状态。

$ ufw status

如果不是防火墙导致端口关闭,则可能是服务器后台管理系统进行了限制。
登录你购买服务器的网站,进入后台管理系统,查看服务器的端口配置。修改你想用的端口(写在配置文件里的)的配置,允许或启用TCP和UDP的进出。