什么是 Shadowsocks?
Shadowsocks(简称 SS)是一种基于 Socks5 代理方式的加密传输协议,也可以指实现这个协议的各种开发包。目前包使用 Python、C、C++、C#、Go 语言、Rust 等编程语言开发,大部分主要实现(iOS 平台的除外)采用 Apache 许可证、GPL、MIT 许可证等多种自由软件许可协议开放源代码。Shadowsocks 分为服务器端和客户端,在使用之前,需要先将服务器端程序部署到服务器上面,然后通过客户端连接并建立本地代理。
在中国大陆,本工具广泛用于突破防火长城(GFW),以浏览被封锁、遮蔽或干扰的内容。2015 年 8 月 22 日,Shadowsocks 原作者 Clowwindy 称受到了中国警方的压力,宣布停止维护此计划(项目)并移除其个人页面所存储的源代码。
为了避免关键词过滤,网民会根据谐音将 ShadowsocksR 称为“酸酸乳”(SSR),将 Shadowsocks 称为“酸酸”(SS)。另外,因为 Shadowsocks(R)的图标均为纸飞机,所以专门提供 Shadowsocks(R)或类似服务(如 V2Ray 和 TROJAN)的网站则就被称为了“机场”。
历史
Shadowsocks 最早由 V2EX 用户“clowwindy”2012 年 4 月发布在该论坛。
项目转手
2015 年 8 月 22 日,其作者 Clowwindy 在 GitHub 上称,警察在两日前要求他停止开发 Shadowsocks 项目并删除其所有代码。之后,作者停止维护 Shadowsocks,其 GitHub 项目页面已被清空。消息传出后,许多中国大陆和外国开发商,以及 Shadowsocks 用户,在 GitHub 中对作者表示了致谢,对已清空源代码的项目页面加星标,因此在当时 Shadowsocks 反而成为了 GitHub 上的“热门项目(Trending)”。本以为是当局主动出击,但另有消息据称,原作者曾作出的“透露中国社会现状”的发言可能遭到某些中华人民共和国政府支持者的检举,从而为后来被要求撤下项目源代码的事件埋下伏笔,而类似的因个人网络发言而被检举的事件在中国大陆也“时有发生”。
8 月 25 日,另一个用于突破网络审查的 GoAgent 项目也被作者自行删除。删除后几小时之内,GitHub 遭到了来自中国大陆的 DDoS 攻击。据报这次攻击与中华人民共和国政府有关,因为中国政府此前曾要求 GitHub 移除两个对抗网络审查的项目但没有被接受。
2015 年 8 月 28 日,电子前哨基金会针对 Shadowsocks 和 GoAgent 被删除一事发表评论,对中华人民共和国政府针对翻墙软件作者的打击表示“强烈谴责”。
Git 仓库的日志显示该项目被移除以前就有大量的复刻副本,不少副本仍然有用户维护。所以尽管 Shadowsocks 项目页经过此次打击,也陆续恢复了内容,甚至本身并转交由多人维护成不同版本,各大 Linux 包的软件仓库均有各式 Shadowsocks 的实现的包仍持续更新可用,目前的 Shadowsocks 更新基本上来自这些作者执行。
运行原理
Shadowsocks 的运行原理与其他代理工具基本相同,使用特定的中转服务器完成数据传输。例如,用户无法直接访问 Google,但代理服务器可以访问,且用户可以直接连接代理服务器,那么用户就可以通过特定软件连接代理服务器,然后由代理服务器获取网站内容并回传给用户,从而实现代理上网的效果。服务器和客户端软件会要求提供密码和加密方式,双方一致后才能成功连接。连接到服务器后,客户端会在本机构建一个本地 Socks5 代理(或 VPN、透明代理等)。浏览网络时,客户端通过这个 Socks5(或其他形式)代理收集网络流量,然后再经混淆加密发送到服务器端,以防网络流量被识别和拦截,反之亦然。
特点
- Shadowsocks 使用自行设计的协议进行加密通信。加密算法有 AES-GCM、ChaCha20-Poly1305、2022-BLAKE3-AES-GCM 等,除建立 TCP 连接外无需握手,每次请求只转发一个连接,无需保持“一直连线”的状态,因此在移动设备上相对较为省电。
- 所有的流量都经过算法加密,允许自行选择加密算法。
- Shadowsocks 通过异步 I/O 和事件驱动程序运行,响应速度快。
- 客户端覆盖多个主流操作系统和平台,包括 Windows、macOS、Android、Linux 和 iOS 系统和路由器(OpenWrt)等。
安全性
Clowwindy 称 Shadowsocks 的最初只是“自用”,用来“翻墙”,而不是提供密码学意义的安全,所以 Shadowsocks 自行设计的加密协议对双方的身份验证仅限于预共享密钥,亦无完全前向保密,也未曾有安全专家公开分析或评估协议及其实现。
一个用 Python 写的 socks 加密代理。加密方法很简单,不过欺骗 GFW 足够了。
——clowwindy
Shadowsocks 的目标不在于提供完整的通信安全机制,主要是为了协助上网用户在严苛的网络环境中突破封锁,不能替代 TLS 或者 VPN。
AEAD 加密方式(AES-GCM、Chacha20-poly1305)在 SIP004 提案提出并在 SIP007 提案实现,这些加密方式被认为可以提供密码学意义的安全(“保密性,完整性,可用性”),之前 AES CFB、AES CTR、RC4、Chacha20 等没有认证的加密方式仍在一部分实现中被允许存在。Shadowsocks-windows 已经移除了非 AEAD 加密方式的支持。
Shadowsocks 多次被提到协议设计问题,有被主动探测的风险:
- 2015 年,ShadowsocksR 的原开发者 breakwa11 提到原协议设计导致没有验证数据包完整性而被主动探测的风险,之后 Shadowsocks 的后继开发者 madeye 引入 One Time Auth(OTA)方案试图解决,但 breakwa11 指出还是不能避免主动探测风险,最终引入 AEAD 加密方式并放弃 OTA 方案。
- 2021 年 2 月 28 日,GitHub 用户 RPRX 提出 Shadowsocks AEAD 加密方式设计存在严重漏洞,无法保证通信内容的可靠性,随后开发者验证了本地 echo 自交思路的可行性。3 月 1 日,RPRX 又提出可利用服务端防重放机制使 Shadowsocks、Vmess 等未知流量代理实质性失效,随后 gfw-report(讨论串下的一个用户)验证了这一思路的可行性。
插件及流量混淆
算法检测 Shadowsocks 流量的方法,并自称可达到 85%的检测精度,虽然该论文的有效性遭到网友质疑。但是使用机器学习来识别网络流量特征的做法被认为是可行的,而且还适用于任何网络代理协议而不仅仅局限于 Shadowsocks。
Shadowsocks 在 SIP003 提案中支持了插件,插件让 Shadowsocks 的流量可以通过不同的插件进行混淆加密或其他处理。目前使用较多的插件有 v2ray-plugin、simple-obfs 等。
ShadowsocksR
ShadowsocksR(简称 SSR)是网名为 breakwa11 的用户发起的 Shadowsocks 分支,在 Shadowsocks 的基础上增加了一些资料混淆方式,称修复了部分安全问题并可以提高 QoS 优先级。后来贡献者 Librehat 也为 Shadowsocks 补上了一些此类特性,甚至增加了类似 Tor 的可插拔传输层功能。
ShadowsocksR 开始时曾有过违反 GPL、发放二进制时不发放源码的争议,使得原开发作者不满。不过后来 ShadowsocksR 项目由 breakwa11 转为了与 Shadowsocks 相同的 GPL、Apache 许可证、MIT 许可证等多重自由软件许可协议。
2017 年 7 月 19 日,ShadowsocksR 作者 breakwa11 在 Telegram 频道 ShadowsocksR news 里转发了深圳市启用 SS 协议检测的消息并被大量用户转发,引发恐慌。7 月 24 日,breakwa11 发布了闭源的 SS 被动检测程序,引发争议。7 月 27 日,breakwa11 遭到自称“ESU.TV”(恶俗 TV)的不明身份人士人身攻击,对方宣称如果不停止开发并阻止用户讨论此事件将发布更多包含个人隐私的资料,随后 breakwa11 表示遭到对方人肉搜索并公开个人资料的是无关人士,为了防止对方继续伤害无关人士,breakwa11 将删除 GitHub 上的所有代码、解散相关交流群组,停止 ShadowsocksR 项目。但项目已被多人 fork,并有人在其基础上继续发布新的版本,例如较为知名的 SSRR(ShadowsocksRR)。