使用 Nginx 反代 Shadowsocks 流量

1. Why

阿里云有一台闲置的ECS服务器,一直没有使用,于是想到可以部署个Socks5代理来利用它。一开始选择了danted作为Socks服务器软件,但是需要单独为其放行代理端口,本着能用Nginx反向代理,就绝不多放行一个端口的原则,考虑了使用Nginx反代shadowsocks-libev + v2ray-plugin的HTTP流量来实现端口复用。之所以不直接用Nginx反代danted,是因为Nginx只能代理HTTP流量而不能代理Socks5流量,而v2ray-plugin被设计用来将shadowsocks-libev的Socks5流量混淆成HTTP流量,正好可以被Nginx反代。

2. How

2.1 服务端

安装服务端所需软件包:

1
2
sudo apt update
sudo apt install shadowsocks-libev shadowsocks-v2ray-plugin

安装完成后使用 vim 编辑 /etc/shadowsocks-libev/config.json 文件,参考配置如下:

1
2
3
4
5
6
7
8
9
10
11
{
"server":["::1", "0.0.0.0"],
"mode":"tcp_and_udp",
"server_port":8388,
"local_port":1080,
"password":"mkbk",
"timeout":86400,
"method":"chacha20-ietf-poly1305",
"plugin":"ss-v2ray-plugin",
"plugin_opts":"server;path=/ss"
}

v2ray-plugin貌似不支持使用自签证书,尝试过相关证书选项,都不生效,因此这里使用acme.sh工具申请ssl证书,具体申请步骤参考我之前写的博客:https://blog.lololowe.com/posts/fdda/#1-%E4%B8%BA%E5%9F%9F%E5%90%8D%E7%94%B3%E8%AF%B7SSL%E8%AF%81%E4%B9%A6

申请到证书后再创建个Nginx Server块,引用证书并反代shadowsocks。使用vim编辑/etc/nginx/conf.d/ss.conf,参考配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 443 ssl;
server_name ss.lololowe.com;

ssl_certificate /root/.acme.sh/ss.lololowe.com/fullchain.cer; # 引用全链证书
ssl_certificate_key /root/.acme.sh/ss.lololowe.com/ss.lololowe.com.key; # 引用私钥

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

root /var/www/html;
index index.html;

location /ss {
proxy_redirect off;
proxy_pass http://127.0.0.1:8388; # 反代shadowsocks
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

2.2 客户端

下载上面2个文件并解压,再将插件重命名为v2ray-plugin并移动到shadowsocks目录,接着启动Shadowsocks客户端,参考下图添加自己的配置:

alt text

配置好客户端后点击应用生效,此时其他应用便可以使用 socks5://127.0.0.1:1080 代理上网了。

3. Deadpool

如果不想自行搭建Socks5代理的话,推荐使用开源工具Deadpool:https://github.com/thinkoaa/Deadpool

该工具可以利用360的quake api以及鹰图平台的hunter api自动从网上获取公开且可用的Socks5代理:

alt text