Shadowsocks

通信協議和代理軟件,常用於翻牆

Shadowsocks(简称SS)是一种基于Socks5代理方式的加密传输协议,也可以指实现这个协议的各种开发包。目前有各种版本使用PythonCC++C#Go语言Rust等编程语言开发,大部分主要实现(iOS平台的除外)采用Apache许可证GPLMIT许可证等多种自由软件许可协议开放原始码。Shadowsocks分为伺服器端和客户端,在使用之前,需要先将伺服器端程序部署到伺服器上面,然后通过客户端连接并建立本地代理。

Shadowsocks
原作者Clowwindy
首次发布python 2012年4月20日,​12年前​(2012-04-20[1]
当前版本
  • 4.4.1.0(2022年2月8日;Microsoft Windows)[2]
  • 5.3.3(2023年2月7日;稳定版本;Android)[3]
  • 1.10.2(2023年3月29日;macOS)[4]
  • 1.18.3(2024年4月21日;稳定版本;Rust)[5]
编辑维基数据链接
原始码库 编辑维基数据链接
操作系统类Unix系统
Microsoft Windows
Android
IOS在维基数据编辑
类型通信协议
自由软件
突破网络审查在维基数据编辑
许可协议 编辑维基数据链接
网站shadowsocks.org 编辑维基数据
Android版本Shadowsocks应用程式的标志

在中国大陆,本工具广泛用于突破防火长城(GFW),以浏览被封锁、屏蔽或干扰的内容。2015年8月22日,Shadowsocks原作者Clowwindy称受到了中国警方的压力,宣布停止维护此计划(项目)并移除其GitHub个人页面所存储的原始码[6]

历史

Shadowsocks最早由V2EX用户“clowwindy”2012年4月发布在该论坛[1]

项目转手

2015年8月22日,其作者Clowwindy在GitHub上称,警察在两日前要求他停止开发Shadowsocks项目并删除其所有代码。[7]之后,作者停止维护Shadowsocks,其GitHub项目页面已被清空。[8][9]消息传出后,许多中国大陆和外国开发商,以及Shadowsocks用户,在GitHub中对作者表示了致谢,对已清空原始码的项目页面加星标,因此在当时Shadowsocks反而成为了GitHub上的“热门项目(Trending)”。[10]

此事件的插曲是,该起事件本以为是当局主动出击,但另有消息据称,原作者曾作出的“透露中国社会现状”的发言或是对其态度不满,可能遭到某些翻墙用户,向中华人民共和国政府检举,从而为后来被要求撤下项目原始码的事件埋下伏笔,而类似的因个人网络发言而被同业检举的事件在中国大陆也“时有发生”。[11]据网民整理,原作者更斥责自己的工作成果被他人挪用,也出现被许多冒名者修改后的自主版本,拿出更强的产品只为了专卖来替自己赚钱,后来原作主张,他以为那种大家一起不谋私的理想,做好SS社群的共享主义精神,在中国连出现的迹象都没有。据他原话:

最适合这个民族的其实是一群小白围着大大转,大大通过小白的夸奖获得自我满足,然后小白的吃喝拉撒都包给大大解决的模式。通过这个项目我感觉我已经彻底认识到这个民族的前面为什么会有一堵墙了。没有墙哪来的大大。所以到处都是什么附件回帖可见,等级多少用户组可见,一个论坛一个大大,供小白跪舔,不需要政府造墙,网民也会自发造墙。这尼玛连做个翻墙软件都要造墙,真是令人叹为观止。这是一个造了几千年墙的保守的农耕民族,缺乏对别人的基本尊重,不愿意分享,喜欢遮遮掩掩,喜欢小圈子抱团,大概这些传统是改不掉了吧。

他称多数用户也是以一种自立态度,谁都可以求,而利用完做到解决问题就直接走人来的,而我维护的过程中,感觉主动帮助项目的同学并不多,匿名提问还不想充分提供资讯。对比下国外的开源互助的社会体制差好远。他最后表示自己迟早要移民离开中国,在维护这些项目上,已经越来越艰难无趣,而以后也不会想再做了。

8月25日,另一个用于突破网络审查的GoAgent项目也被作者自行删除。删除后几小时之内,GitHub遭到了来自中国大陆的DDoS攻击。据报这次攻击与中华人民共和国政府有关,因为中国政府此前曾要求GitHub移除两个对抗网络审查的项目但没有被接受。[12]

2015年8月28日,电子前哨基金会针对Shadowsocks和GoAgent被删除一事发表评论,对中华人民共和国政府针对用于突破网络封锁软件作者的打击表示“强烈谴责”。[6]

不过Git仓库的日志显示该项目被移除以前就有大量的复刻副本,不少副本仍然有用户维护。所以尽管Shadowsocks项目页经过此次打击,也仍陆续恢复了内容,甚至本身并转交由多人维护成不同版本,各大Linux发行版的软件仓库均有各式Shadowsocks的实现的包仍持续更新可用,目前的Shadowsocks更新基本上来自这些作者执行。

运行原理

 
Android版本Shadowsocks应用程式

Shadowsocks的运行原理与其他代理工具基本相同,使用特定的中转伺服器完成数据传输。例如,用户无法直接访问Google,但代理伺服器可以访问,且用户可以直接连接代理伺服器,那么用户就可以通过特定软件连接代理伺服器,然后由代理伺服器获取网站内容并回传给用户,从而实现代理上网的效果。伺服器和客户端软件会要求提供密码和加密方式,双方一致后才能成功连接。连接到伺服器后,典型情况下客户端会在本机构建一个本地Socks5代理(但也有构建成VPN、透明代理等形式)。浏览网络时,客户端通过这个Socks5(或其他形式)代理收集网络流量,然后再经混淆加密发送到伺服器端,以防网络流量被识别和拦截,反之亦然。

特点

  • Shadowsocks使用自行设计的协议进行加密通信。[13]加密算法有AES-GCMChaCha20-Poly1305、2022-BLAKE3-AES-GCM等,除建立TCP连接外无需握手,每次请求只转发一个连接,无需保持“一直连线”的状态,因此在移动设备上相对较为省电。
  • 所有的流量都经过算法加密,允许自行选择加密算法。
  • Shadowsocks通过异步I/O事件驱动程式运行,响应速度快。
  • 客户端覆盖多个主流操作系统和平台,包括WindowsmacOSAndroidLinuxiOS系统和路由器(OpenWrt)等[14]

安全性

Clowwindy称Shadowsocks的最初只是“自用”,用来“翻墙”[1],而不是提供密码学意义的安全,所以Shadowsocks自行设计的加密协议对双方的身份验证仅限于预共享密钥英语Pre-shared key,亦无完全前向保密,也未曾有安全专家公开分析或评估协议及其实现。

一个用 Python 写的 socks 加密代理。加密方法很简单,不过欺骗 GFW 足够了。

——clowwindy[1]

Shadowsocks的目标不在于提供完整的通信安全机制,主要是为了协助上网用户在严苛的网络环境中突破封锁,不能替代TLS或者VPN

AEAD加密方式(AES-GCMChacha20-poly1305)在SIP004[15]提案提出并在SIP007提案[16]实现,这些加密方式被认为可以提供密码学意义的安全(“保密性,完整性,可用性”)[17],之前AES CFB、AES CTR、RC4Chacha20等没有认证的加密方式仍在一部分实现中被允许存在[17]。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的用户验证了这一思路的可行性。

插件及流量混淆

2017年9月21日,一篇名为《The Random Forest based Detection of Shadowsock's Traffic》的论文在IEEE发表,该论文介绍了通过随机森林算法检测Shadowsocks流量的方法,并自称可达到85%的检测精度[18],虽然该论文的有效性遭到网友质疑。但是使用机器学习来识别网络流量特征的做法被认为是可行的,而且还适用于任何网络代理协议而不仅仅局限于Shadowsocks。[19]

Shadowsocks在SIP003提案[20]中支持了插件,插件让Shadowsocks的流量可以通过不同的插件进行混淆加密或其他处理。目前使用较多的插件有v2ray-pluginsimple-obfs等。

实现

目前Shadowsocks有多个实现支持,以自由软件形式发布的主要有

等等,还有为数甚多的免费软件商业软件

ShadowsocksR

 
ShadowsocksR的标志
 
Android版本ShadowsocksR应用程式

ShadowsocksR(简称SSR)是网名为breakwa11的用户发起的Shadowsocks分支,在Shadowsocks的基础上增加了一些资料混淆方式,称修复了部分安全问题并可以提高QoS优先级。[27]后来贡献者Librehat也为Shadowsocks补上了一些此类特性,甚至增加了类似Tor的可插拔传输层功能。[28]

ShadowsocksR开始时曾有过违反GPL、发放二进制时不发放原始码的争议,使得原开发作者不满。不过后来ShadowsocksR项目由breakwa11转为了与Shadowsocks相同的GPL、Apache许可证、MIT许可证等多重自由软件许可协议。

2017年7月19日,ShadowsocksR作者breakwa11在Telegram频道ShadowsocksR news里转发了深圳市启用SS协议检测的消息并被大量用户转发,引发恐慌。7月24日,breakwa11发布了闭源的SS被动检测程序,引发争议[29]。7月27日,breakwa11遭到自称“ESU.TV”(恶俗TV)的不明身份人士人身攻击,对方宣称如果不停止开发并阻止用户讨论此事件将发布更多包含个人隐私的资料[30],随后breakwa11表示遭到对方人肉搜索并公开个人资料的是无关人士,为了防止对方继续伤害无关人士,breakwa11将删除GitHub上的所有代码、解散相关交流群组,停止ShadowsocksR项目。但项目已被多人fork,并有人在其基础上继续发布新的版本,例如较为知名的SSRR(ShadowsocksRR)。

参考资料

  1. ^ 1.0 1.1 1.2 1.3 clowwindy. 发一个自用了一年多的翻墙工具 shadowsocks. 2012-04-20. (原始内容存档于2014-07-19). 
  2. ^ Release 4.4.1.0. 
  3. ^ Release v5.3.3 · shadowsocks/shadowsocks-android · GitHub. 
  4. ^ Release v1.10.2 · shadowsocks/ShadowsocksX-NG · GitHub. 
  5. ^ Release 1.18.3. 2024年4月21日 [2024年5月5日]. 
  6. ^ 6.0 6.1 O'Brien, Danny. Speech that Enables Speech: China Takes Aim at Its Coders. 电子前哨基金会. [2016-05-28]. (原始内容存档于2016-06-24) (英语). 中文翻译
  7. ^ clowwindy. Adopting iOS 9 network extension points · Issue #124 · shadowsocks/shadowsocks-iOS. GitHub. [2015-08-22]. (原始内容存档于2015-08-22) (英语). Two days ago the police came to me and wanted me to stop working on this. Today they asked me to delete all the code from GitHub. I have no choice but to obey. 
  8. ^ clowwindy. remove · shadowsocks/shadowsocks@938bba3. GitHub. 2015-08-22 [2015-08-22]. (原始内容存档于2015-08-22). 
  9. ^ clowwindy. shadowsocks/shadowsocks. GitHub. 2015-08-22 [2015-08-22]. (原始内容存档于2015-08-22) (英语). 
  10. ^ percy. 中国开发者被警察要求删除软件. GreatFire. 2015-08-26 [2016-01-16]. (原始内容存档于2015-10-02) (中文). 
  11. ^ Vergil. 翻墙=犯法?从许东翻墙第一案说起. pao-pao.net. [2016-08-18]. (原始内容存档于2016-08-08). (中文)
  12. ^ Catalin Cimpanu. Recent GitHub DDOS Linked to Chinese Government and Two GitHub Projects. Softpedia. 2015-08-29 [2016-01-16]. (原始内容存档于2016-05-06) (英语). 
  13. ^ Shadowsocks - spec. [2015年12月11日]. (原始内容存档于2015年12月4日) (英语). 
  14. ^ Shadowsocks - Clients. [2015-09-05]. (原始内容存档于2015-09-04) (英语). 
  15. ^ Mygod. SIP004 - Support for AEADs implemented by large libraries. 2017-01-12 [2021-06-14]. (原始内容存档于2020-10-16). 
  16. ^ riobard. SIP007 - Per-session subkey. 3017-02-10 [2021-06-14]. (原始内容存档于2020-10-16). 
  17. ^ 17.0 17.1 AEAD Ciphers. Shadowsocks.org. [2021-06-14]. (原始内容存档于2021-02-26). 
  18. ^ Deng, Z.; Liu, Z.; Chen, Z.; Guo, Y. The Random Forest Based Detection of Shadowsock's Traffic. 2017 9th International Conference on Intelligent Human-Machine Systems and Cybernetics (IHMSC). August 2017, 2: 75–78 [2018-02-05]. doi:10.1109/IHMSC.2017.132. (原始内容存档于2018-02-06). 
  19. ^ VV, 特约撰稿人. 道高一尺,牆高一丈:互聯網封鎖是如何升級的. 端传媒. [2018-04-07]. (原始内容存档于2018-06-28) (中文(香港)). 
  20. ^ madeye. SIP003 - A simplified plugin design for shadowsocks. GitHub. 2017-01-04 [2021-06-14]. (原始内容存档于2020-10-03). 
  21. ^ Shadowsocks / GOST v2. [2022-12-02]. (原始内容存档于2022-12-02). 
  22. ^ Outline - Making it safer to break the news. getoutline.org. [2018-04-06]. (原始内容存档于2018-03-30) (英语). 
  23. ^ Shadowsocks · Project V 官方网站. v2ray.com. [2020-06-11]. (原始内容存档于2020-06-11). 
  24. ^ txthinking/brook. GitHub. [2018-06-05]. (原始内容存档于2018-06-17) (英语). 
  25. ^ trojan. trojan-gfw. trojan. [2021-02-15]. (原始内容存档于2021-05-30). 
  26. ^ Fndroid, Clash for Windows, 2022-11-17 [2022-11-17], (原始内容存档于2023-01-14) 
  27. ^ ShadowsocksR. breakwa11.github.io. [2017-03-24]. (原始内容存档于2017-02-07). 
  28. ^ Shadowsocks Plugin Spec. shadowsocks.org. [2017-03-24]. (原始内容存档于2017-03-25) (英语). 
  29. ^ breakwa11. SS被动检测1.0版 #868. GitHub. [2017-06-24]. (原始内容存档于2017-07-25). 
  30. ^ CK、吴晶、瑞哲. 国内网络青年开发翻墙软件遭“人肉”威胁. Radio Free Asia. 2018-01-25 [2019-03-31]. (原始内容存档于2019-03-31). 

注解

外部链接