搭建shadowsocks服务

前言

由于国内恶劣的网络环境,作为一名频繁访问外网的Web开发者,不得不自建一个VPN服务,以下简单介绍Shadowsocks的搭建过程。

单纯的ss流量会迅速被gfw识别到并屏蔽,因此使用ss时需要增加obfs用以混淆欺骗gfw,可以极大程度减小被屏蔽的风险。当然,如果你用的是比较出名的服务器供应商,如bandwagon的服务器,那么被屏蔽的机会也很大。

服务端使用的一键安装脚本twist由于开发者已经放弃维护长时间,目前只有参考作用,如果你有耐心,也可以自己修改后再使用,也就跟下面的服务端搭建教程一样。搞完是真的累,太渣了,太需要提高自己的编程水平,写一个一体化的软件包才行

服务端

twist脚本

服务端使用的是twist脚本,里面集成了Shadowsocks+simple-obfs+fail2ban以及相关依赖包,使用shell编写,感兴趣的可以看看源代码,下载地址如下

1
https://github.com/forestbat/Twist

下载后,脚本添加执行权限

1
chmod +x twist

切换到root账户,twist执行需要

1
su - root

修改twist

twist文件里面有一些软件需要删掉/更换,有些则需要手动安装,先手动执行一遍twist脚本./twist install,确认有哪些错误,然后选择执行下面的命令

  1. 修改dependenciesinstall函数
1
2
3
4
5
6
7
# 不同的系统不一样,不要全改
# 1. 新增依赖包,如libcork-dev
# 2. 名称更换,如python-pip改为python3-pip
apt install python3-dev python3-pip python3-setuptools python3-m2crypto libcork-dev

# 将pip改为pip3,可能需要使用pip安装m2crypto
pip3 install qrcode
  1. 修改sslibevinstall函数
1
2
# github的包命名改了,解压后变成了libsodium-stable
tar zxf libsodium-${libsodiumver}.tar.gz && mv libsodium-stable libsodium-${libsodiumver}

或者删掉libsodium这段,直接手动编译安装,如下

1
2
3
4
5
wget https://github.com/jedisct1/libsodium/releases/download/1.0.19-RELEASE/libsodium-1.0.19.tar.gz
tar zxf libsodium-1.0.19.tar.gz
cd libsodium-1.0.19
./configure
make && make install
  1. 修改sslibevinstall函数
1
2
3
4
5
6
7
# 在 tar zxf ${ssobfsver}.tar.gz 这一行后面修改添加代码,因为obfs也有很长时间没有更新,导致在新的编译器下报错
if [ "$ssobfstag" == "v0.0.5" ]; then
# patch
sed -i -e "249s/$/ else {result = OBFS_ERROR;}/" /tmp/${ssobfsver}/src/obfs_http.c
sed -i -e '246d' /tmp/${ssobfsver}/src/obfs_http.c
# patch end
fi
  1. 修改sslibevinstallerrsslibevinstall函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# sslibevinstallerr函数如下
# 删掉mbedtls相关包,与libsodium类似,因为命名问题我直接绑定版本了
rm -rf libsodium-${libsodiumver}.tar.gz libsodium-${libsodiumver} ${mbedtlsver}.tar.gz ${mbedtlsver} ${sslibevver}.tar.gz $sslibevver ${ssobfsver}.tar.gz $ssobfsver

# sslibevinstall函数如下
# 搜索与mbedtlstag有关的代码段,修改绑定版本v2.28.1
# ldconfig
[ -z "$mbedtlstag" ] && mbedtlstag="v2.28.1"
mbedtlsver="mbedtls-$(echo ${mbedtlstag} | sed -e 's/^[a-zA-Z]//g')"
wget -t 3 -T 30 -nv -O ${mbedtlsver}.tar.gz https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/${mbedtlstag}.tar.gz
[ "$?" != "0" ] && sslibevinstallerr "mbedtls-$(echo ${mbedtlstag} | sed -e 's/^[a-zA-Z]//g')"
[ -d ${mbedtlsver} ] && rm -rf "${mbedtlsver}"
tar zxf ${mbedtlsver}.tar.gz
pushd $mbedtlsver
make SHARED=1 CFLAGS=-fPIC "-j$((MAKECORES+1))" && make DESTDIR=/usr install || sslibevinstallerr "mbedtls-${mbedtlstag} | sed -e 's/^[a-zA-Z]//g'" err
popd
ldconfig
rm -rf libsodium-${libsodiumver}.tar.gz libsodium-${libsodiumver} mbedtls-${mbedtlsver}.tgz mbedtls-${mbedtlsver}

安装完毕

执行修改后的twist脚本

1
./twist install

如果twist安装成功,此时命令行下将会展示ss服务的二维码以及url,手机端可以用小火箭扫描,桌面端可以复制url导入

客户端

安装软件

1
2
# obfs混淆ss流量;privoxy将http流量转换为socks5流量
sudo apt install shadowsocks-libev simple-obfs privoxy

ss配置

修改ss配置,配置文件可以是/etc/shadowsocks-libev/config.json,也可以是/etc/shadowsocks-libev/config-obfs.json

1
sudo vi /etc/shadowsocks-libev/config.json

按下方模板配置:

1
2
3
4
5
6
7
8
9
10
11
{
"server":["server_ip"],
"mode":"tcp_and_udp",
"server_port":443,
"local_port":1080,
"password":"server_password",
"timeout":86400,
"method":"xchacha20-ietf-poly1305",
"plugin":"obfs-local",
"plugin_opts":"obfs=tls;obfs-host=mzstatic.com;obfs-uri=/"
}

执行下面的命令,确认软件可正常运行

1
2
3
4
5
6
7
8
# 查看输出确认无异常报错
sudo ss-local -c /etc/shadowsocks-libev/config.json

# 1080端口
sudo netstat -tnlp | grep 1080

# 如果发现ss服务未能正常启动,查看status信息
sudo systemctl status shadowsocks-libev.service

修改systemd配置文件

1
sudo vi /usr/lib/systemd/system/shadowsocks-libev.service

ss-server改为ss-local,因为我们修改的是shadowsocks-libev.service,配置文件就是config.json,这里就不需要再修改什么

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
27
#  This file is part of shadowsocks-libev.
#
# Shadowsocks-libev is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This file is default for Debian packaging. See also
# /etc/default/shadowsocks-libev for environment variables.

[Unit]
Description=Shadowsocks-libev Default Client Service
Documentation=man:shadowsocks-libev(8)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
DynamicUser=true
EnvironmentFile=/etc/default/shadowsocks-libev
LimitNOFILE=32768
ExecStart=/usr/bin/ss-local -c $CONFFILE $DAEMON_ARGS

[Install]
WantedBy=multi-user.target

重启ss服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart shadowsocks-libev

privoxy配置

修改配置文件/etc/privoxy/config

1
sudo vi /etc/privoxy/config

修改listen-address,因为有时我会将地址共享出来给局域网其他设备使用,所以我一般会将127.0.0.1改为0.0.0.0。在末尾添加forward-socks5指令,将所有http流量转发到1080端口

1
2
listen-address  0.0.0.0:8118
forward-socks5 / 127.0.0.1:1080 .

重启privoxy服务

1
sudo systemctl restart privoxy

防火墙开放8118端口访问(可选,如果没有打算给局域网内的其他机器使用就不要打开)

1
2
sudo ufw allow 8118/tcp
sudo ufw reload

最后验证

配置环境变量http_proxy以及https_proxy,访问外网地址,只要有html数据流输出即可

1
2
3
export http_proxy=http://127.0.0.1:8118;export https_proxy=http://127.0.0.1:8118;

curl -i https://www.google.com/

参考文档

Twist脚本github地址
Debian11下编译安装Shadowsocks-libev
Linux中使用ShadowSocks+Privoxy代理