shadowsocks服务端搭建过程

写在前面

最近因为要科学上网,准备自己搭个shadowsocks做梯子。为了提高效率,于是直接求助于某资深工程师,他甩给我一篇自己的ss搭建攻略,信誓旦旦说跟着做一定成。没想到其中的坑还是很多,所以还是写篇东西记录一下,防止下次再装ss的时候又踩坑。

安装过程

主要:操作系统环境为Centos7

1.更新系统库并下载依赖包
1
2
3
4
yum update
yum upgrade -y
yum install epel-release -y
yum install -y gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto udns-devel libev-devel libsodium-devel mbedtls-devel git m2crypto c-ares-devel
2.切换目录至/opt,下载shadowsocks-libev模块
1
2
3
git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
git submodule update --init --recursive
3.安装(编译)shadowsocks-libev
1
2
3
4
./autogen.sh
./configure
make
make install

此处开始出现问题,首先是执行./autogen.sh时报如下错误:

1
2
configure.ac:4: error: Autoconf version 2.67 or higher is required
configure.ac:4: the top level

这个错误一目了然,就是autoconf版本过低,通过下述方式升级

1
2
3
4
5
6
7
rpm -qf /usr/bin/autoconf     查看当前版本
rpm -e --nodeps autoconf-2.63 卸载当前版本
wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz
tar zxvf autoconf-2.68.tar.gz
cd autoconf-2.68
./configure --prefix=/usr/
make && make install

接着./configure时报如下错误:

1
configure: error: mbed TLS libraries not found

显然是缺少依赖,处理之

1
2
3
4
5
6
7
8
9
# Installation of MbedTLS
export MBEDTLS_VER=2.4.2
wget https://tls.mbed.org/download/mbedtls-$MBEDTLS_VER-gpl.tgz
tar xvf mbedtls-$MBEDTLS_VER-gpl.tgz
pushd mbedtls-$MBEDTLS_VER
make SHARED=1 CFLAGS=-fPIC
sudo make DESTDIR=/usr install
popd
sudo ldconfig

处理完后运行./configure又报了如下错误:

1
configure: error: The Sodium crypto library libraries not found

看来还是缺少依赖,继续安装:

1
2
3
4
5
6
7
8
9
# Installation of Libsodium
export LIBSODIUM_VER=1.0.16
wget https://download.libsodium.org/libsodium/releases/libsodium-$LIBSODIUM_VER.tar.gz
tar xvf libsodium-$LIBSODIUM_VER.tar.gz
pushd libsodium-$LIBSODIUM_VER
./configure --prefix=/usr && make
sudo make install
popd
sudo ldconfig

配置shadowsocks服务端

1.为shadowsocks配置系统用户
1
adduser --system --no-create-home -s /bin/false shadowsocks
2.建立一个shadowsocks放配置文件的目录
1
mkdir -m 755 /etc/shadowsocks
3.创建一个配置文件
1
vim /etc/shadowsocks/shadowsocks.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{

"server":"XXX.XXX.XXX.XXX",

"server_port":PPPPP,

"local_address": "127.0.0.1",

"local_port":1080,

"password":"mypassword",

"timeout":300,

"method":"aes-256-cfb",

"fast_open": true

}

==从这里开始本次搭建过程最大的坑点出现了!!!==

上述是资深工程师提供的配置,按该配置无法启动服务,使用systemctl status shadowsocks命令查看到错误日志如下:

1
ERROR: failed to set TCP_FASTOPEN_CONNECT

说明目前不支持fast_open配置,需要在系统参数中开启,为了省事可以暂时拿掉该配置项,然而之后又报了错:

1
ERROR: connect: Invalid argument

一番资料查阅发现,新版本的shadowsocks服务端不再配置local_address和local_port项,删掉这两个配置项后终于是能够正常运行了。

==所以最终使用的正确配置是这样的:==

1
2
3
4
5
6
7
8
9
10
11
12
13
{

"server":"XXX.XXX.XXX.XXX",

"server_port":PPPPP,

"password":"mypassword",

"timeout":300,

"method":"aes-256-cfb"

}

注册shadowsocks为系统服务

为了便于使用,下述步骤还是需要做的

1.创建/etc/systemd/system/shadowsocks.service文件

服务端和客户端的配置分别如下,大部分都是一样的,区别仅在于server使用ss-server启动,client使用ss-local启动

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Shadowsocks proxy server
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/ss-server -c /etc/shadowsocks/shadowsocks.json -a shadowsocks -v start
ExecStop=/usr/local/bin/ss-server -c /etc/shadowsocks/shadowsocks.json -a shadowsocks -v stop
[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Shadowsocks proxy client
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/ss-local -c /etc/shadowsocks/shadowsocks.json -a shadowsocks -v start
ExecStop=/usr/local/bin/ss-local -c /etc/shadowsocks/shadowsocks.json -a shadowsocks -v stop
[Install]
WantedBy=multi-user.target
2.启用shadowsocks服务的命令
1
2
3
systemctl daemon-reload
systemctl enable shadowsocks
systemctl start shadowsocks

另外,使用systemctl status shadowsocks查看日志前文已经有提及,如果安装的时候还有别的问题应该也能在里面发现些什么。最后提一句,如果ss还是无法使用,可能是防火墙的问题,最简单粗暴的方式——直接关掉它:

1
systemctl stop firewalld.service