Shadowsocks 流量混淆

墙越来越高,单纯的 Shadowsocks 流加密 + OTA 流量已经能够被 GFW 识别。SIP004 草案提出使用 AEAD 算法替换原来的 流加密 + OTA

即便是如此,非常时期仍有 Shadowsocks 代理被封,疑似 GFW 能检测出使用了 AEAD 算法的 Shadowsocks 流量。因此,有必要混淆 Shadowsocks 流量,使之更像正常的 HTTP 流量,以绕过 GFW 检测。

Shadowsocks 组织下的 simple-obfs 项目就是用于混淆 Shadowsocks 流量的工具,思路是在原来的 Shadowsocks 流量上叠加一层加密,使得 GFW 无法判断是否正常的网站流量。它支持以插件的模式和 Shadowsocks 配合使用,也支持单独运行,还能与 web 服务器同时共存。由于条件限制,所以选择插件模式来运行 simple-obfs

安装

官方教程提供了编译安装的方式,这里就不赘述。Debian/Ubuntu 官方源里也提供了 simple-obfs,直接安装即可。

1
$ sudo apt-get install simple-obfs

配置

Server

更改 Shadowsocks 配置文件 /etc/shadowsocks-libev/config.json,新增以下内容,需要注意原来的配置文件最后一行没有逗号,需要补上逗号这样才符合 JSON 语法。

1
2
"plugin":"/usr/bin/obfs-server",
"plugin_opts":"obfs=tls;failover=127.0.0.1:8443"

pluginobfs-server 的执行文件路径,一般可以直接用 obfs-server
plugin_opts:混淆参数,obfs 有 tlshttp 两种类型。

Local / Client

更改 Shadowsocks 配置文件 /etc/shadowsocks/config.json,新增以下内容:

Linux:

1
2
"plugin":"/usr/bin/obfs-local",
"plugin_opts":"obfs=tls;obfs-host=www.amazon.com"

OpenWrt:
去到修改服务器配置页面,填相应参数:
插件名称obfs-local
插件参数obfs=tls;obfs-host=www.amazon.com

Android:GitHub | Google Play
下载混淆插件,Shadowsocks Android 客户端配置文件下选取 simple-obfs 插件,配置项:

1
2
Obfuscation wrappper: tls
Obfuscation hostname: www.amazon.com

启动

Server

Systemd:

1
2
3
4
# 启动
sudo systemctl start shadowsocks-libev
# 查看启动状态
sudo systemctl status shadowsocks-libev

如果 Shadowsocks 使用特权端口,可能出现 [simple-obfs] ERROR: bind() error 问题,只要授权给 simple-obfs 即可。

1
setcap cap_net_bind_service+ep /usr/bin/obfs-server

相关资料

https://github.com/shadowsocks/simple-obfs
https://blessing.studio/why-do-shadowsocks-deprecate-ota/