作者: Anonymous, Anonymous
English version: Sharing a modified Shadowsocks
首次发布日期: 2022年10月15日, 星期六
最后修改日期: 2025年10月1日, 星期三
我们在这篇文章中发布和开源一个修改版的Shadowsocks。这个版本的Shadowsocks可以绕过当前GFW的检测以及封锁。我们首先介绍这个修改后的Shadowsocks的原理,再分享一个如何部署服务器和客户端的简单教程。我们还会介绍其他两种当前能够帮助Shadowsocks和VMess绕过当前GFW封锁的办法。
我们在此时发表这个版本有三个目的:
首先,我们想为中国网民提供一个(暂时)可行的翻墙方案。用增加翻墙协议多样性的方式,缓解10月3号以来的GFW对多种翻墙工具的大规模封锁。
其次,我们想抛砖引玉地引起研究者和开发者的讨论。我们实证性的研究显示,当前的GFW已经可以精准地识别Shadowsocks,VMess,以及Obfs4这类完全加密协议(full-encrypted protocol)。我们估算GFW当前的流量检测算法会误伤约0.6%
的非翻墙链接,而假阴性则低得几乎可以忽略不计。这迫切的需要我们群力群策地改进当前的协议。
最后,我们想把这次发布当作一场实验,同时观察审查者和反审查社区在面对新的(反)审查事件时的反应速度。
我们与其他研究人员合作发现,当前的GFW会利用多种不同的规则来识别Shadowsocks,VMesss,以及Obfs4这类完全加密协议。其中一条规则就利用了这些加密流量的0比特与1比特的比例接近1:1的特性。因此,如果我们在加密流量中加入更多的0或1,再对比特序列进行重排,就可以达到改变原有比例特征,绕过检测和封锁的目的。
这个修改版的Shadowsocks基于Shadowsocks-rust,我们还利用Shadowsocks-android编译了apk文件供安卓用户使用。所有的客户端和服务端软件都可以在这个branch和这个release找到。
安装修改版的服务器的过程与安装任何其他Shadowsocks-rust
服务器无异。
wget https://github.com/gfw-report/shadowsocks-rust/releases/download/v0.0.1-beta/shadowsocks-v1.15.0-alpha.9.x86_64-unknown-linux-gnu.tar.xz
tar xvf shadowsocks-v1.15.0-alpha.9.x86_64-unknown-linux-gnu.tar.xz
sudo nano server_config.json
将下面的配置文件复制粘贴。注意,你需要把里面的ExamplePassword
替换成一个更强的密码。你可以用以下命令在终端生成一个强密码:openssl rand -base64 16
。你也应该考虑更改服务器端口8388
。
{
"server": "0.0.0.0",
"server_port": 8388,
"password": "ExamplePassword",
"method": "aes-256-gcm"
}
将上方替换过密码的配置信息复制粘贴到配置文件后, 按Ctrl + x
退出。 退出时,文本编辑器将问你"Save modified buffer?"
,请输入y
然后按回车键
。
tmux
会话:tmux
然后再运行服务器:
./ssserver -c ./server_config.json
最后,按Ctrl + b
再按d
就可以脱离tmux会话了。
我们使用ufw
来管理Shadowsocks服务器的防火墙。
在基于Debian的服务器上,可以通过如下命令安装ufw
:
sudo apt update && sudo apt install -y ufw
然后开放有关ssh
和Shadowsocks-rust
的端口。 请注意,以下命令假设你在server_config.json
中的server_port
的值为8388
。 如果你的server_port
用了其他的值,请对以下命令作相应的修改:
sudo ufw allow ssh
sudo ufw allow 8388
现在我们启动ufw
:
sudo ufw enable
启动时如果弹出Command may disrupt existing ssh connections. Proceed with operation (y|n)?
,请输入y
并按回车键。
最后,请用sudo ufw status
检查一下你的配置是否和下面的一样:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
8388 ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
8388 (v6) ALLOW Anywhere (v6)
下面是桌面版客户端的配置文件,记得server
的值替换为你远程服务器的IP地址。如果你们是用了我们提供的安卓apk在手机上使用,那么配置就和往常的使用Shadowsocks-android
的办法一样。
{
"server": "ExampleServerIP",
"server_port": 8388,
"password": "ExamplePassword",
"method": "aes-256-gcm",
"local_address": "127.0.0.1",
"local_port": 1080
}
chacha20-ietf-poly1305
或者aes-256-gcm
。我们还知道两种目前可行的方案,他们都利用了另一种不同的GFW流量检测规则:
如果你是V2Ray用户,你可以开启ExperimentReducedIvHeadEntropy
选项来避免GFW的检测和封锁。这个方案的好处是你无须在服务器进行任何修改。
如果你是Shadowsocks用户,@database64128还实现了另外一种绕过审查的办法。因为对协议做了修改,所以需要同时更新客户端和服务端。
我们感谢David Fifield对文章初稿的反馈。
正如前文所说的,我们发帖的目的就是想引起用户,研究人员和开发者们的讨论。因此我们欢迎您或公开地或私下地与我们分享您的使用体验或想法。我们私下的联系方式可见GFW Report的页脚。