Shadowsocks 是一种加密代理协议。你的设备把每条连接发给 Shadowsocks 服务器,并用只有你和服务器知道的密钥加密,再由服务器替你连接网站。它轻量,同时承载 TCP 和 UDP,而且没有可识别的握手,所以在线路上看起来只是一串随机字节。
本文讲解 Shadowsocks 是什么、如何工作、该用哪种加密方式、插件有什么用、怎么看懂 ss:// 链接,以及 Shadowsocks 与 VPN 有何不同。已经有服务器了?直接看 iPhone 怎么用 Shadowsocks。
Shadowsocks 是什么?
Shadowsocks 由两部分组成:设备上的客户端,以及由你或服务商运行的服务器。双方共享同一种加密方式和密码(最新的加密方式则使用密钥)。每当某个 App 发起连接,客户端就将其加密后发给服务器。服务器解密后连接真正的目标,并在两端之间双向转发数据。
这个协议是开放的,其规范以一系列“SIP”文档的形式发布在 shadowsocks.org 上。这也是它随处可见的原因:服务端有 Rust、C 和 Go 等多种实现,sing-box、Xray、Mihomo 等大多数多协议工具也都内置了它。几乎每家代理服务商都能提供 Shadowsocks 服务器。
发展简史
- 2012 年:一位名叫 clowwindy 的开发者以一个小型 Python 项目的形式发布了 Shadowsocks。它是为身处网络审查环境、需要比完整 VPN 更简单轻便方案的人设计的。
- 2015 年:原作者停止维护项目,并从 GitHub 上删除了代码。社区通过 shadowsocks-libev 等分支延续了它,后来又有了 shadowsocks-rust。
- 2017 年:AEAD 加密(SIP004)取代最初的流加密成为推荐方案,修复了旧设计中的完整性问题。
- 2022 年:Shadowsocks 2022 版(SIP022)引入了固定长度密钥和重放保护。
Shadowsocks 的工作原理
当 iPhone 上的某个 App 通过 Shadowsocks 服务器加载网页时,会发生以下过程:
- 客户端 App 接管这条连接。在 iOS 上,它借助 VPN 配置做到这一点。
- 客户端用共享密钥加密目标地址(例如
example.org:443)和最初的数据,发往服务器的地址和端口。 - 服务器解密。如果因为密码或加密方式不对而无法解密,服务器会直接断开连接。
- 服务器连接
example.org:443,并双向转发数据,发回给你的所有内容都会加密。 - UDP 数据包(例如语音通话的数据)会逐个加密,发往同一个服务器端口。
iPhone ──(encrypted Shadowsocks)──▶ ss.example.com:8388 ──(normal connection)──▶ example.org
这里没有问候,也没有证书交换。最先发出的字节是一段随机盐值,后面紧跟密文。这让 Shadowsocks 建立连接很快,但也意味着密码错了永远不会有错误提示:连接只会超时。
Shadowsocks 加密方式:2022、AEAD 与流加密
加密方式决定了流量如何被加密。Shadowsocks 的加密方式分为三类:
| 类别 | 示例 | 建议 |
|---|---|---|
| 2022(SIP022) | 2022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm、2022-blake3-chacha20-poly1305 |
服务器支持时的最佳选择 |
| AEAD(SIP004) | aes-256-gcm、aes-128-gcm、chacha20-ietf-poly1305 |
可靠,支持非常广泛 |
| 流加密 | aes-256-cfb、chacha20-ietf、rc4-md5 |
已过时,仅在服务器别无选择时使用 |
AEAD 加密会对每一块数据进行认证,因此服务器会拒绝在传输途中被篡改的内容。老旧的流加密只负责加密:数据被改动后双方都察觉不到,使用它的服务器也更容易被探测。
2022 加密更进一步。它使用随机密钥而不是密码,因此不存在弱密码。它加入了时间戳和重放保护,录下来的连接无法简单地重新发送。它还允许多个用户共用一个端口,每人使用自己的密钥(SIP023)。2022 密钥是固定长度的 Base64,可以这样生成:
openssl rand -base64 16
这是 2022-blake3-aes-128-gcm 所需的 16 字节,其他 2022 加密需要 32 字节。Potatso 支持的完整加密方式列表见 Shadowsocks 参考。
Shadowsocks 插件
插件(SIP003)会给 Shadowsocks 连接再包一层,让它看起来像别的东西:
- simple-obfs 让连接看起来像普通 HTTP,或 TLS 会话的开头。
- v2ray-plugin 和 gost-plugin 通过 WebSocket 承载连接,可选配 TLS。这样它就能经过 CDN 或 Web 服务器。
- ShadowTLS、Restls 和 JLS 会先与一个掩护网站完成真正的 TLS 握手,再交给 Shadowsocks。
插件也有代价。每种插件都会增加开销,而且大多只承载 TCP,所以 UDP 要么绕过插件,要么无法使用。Cloak 和 kcptun 等插件是独立的程序,iOS App 无法在客户端旁边运行它们。
ss:// 链接长什么样
服务商通常以 ss:// 链接(SIP002)的形式分享服务器,也就是常说的 SS 链接,并且常以二维码展示:
ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:8388#Tokyo
YWVzLTI1Ni1nY206c2VjcmV0是aes-256-gcm:secret的 Base64 编码,即加密方式和密码。ss.example.com:8388是服务器地址和端口。#Tokyo是 App 中显示的名称。
2022 服务器会以明文(百分号编码)写出加密方式和密钥,插件则放在 plugin 参数中:
ss://2022-blake3-aes-128-gcm:MTIzNDU2Nzg5MDEyMzQ1Ng%3D%3D@ss.example.com:8388#2022
ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:443/?plugin=simple-obfs%3Bobfs%3Dtls%3Bobfs-host%3Dcdn.example.com#Obfs
服务器很多的服务商通常会改为提供一个订阅 URL,其中列出所有服务器。见订阅链接是什么?
Shadowsocks 和 VPN 的区别
很多人把 Shadowsocks 叫作 VPN,但它的工作方式与 WireGuard、OpenVPN 或 IPsec 不同:
| Shadowsocks | 传统 VPN | |
|---|---|---|
| 承载的内容 | 单独的 TCP 连接和 UDP 数据包 | 通过虚拟网络传送的所有 IP 数据包 |
| 握手 | 没有可见的握手,看起来像随机字节 | 有可识别的握手 |
| 路由 | 客户端可以用规则按网站选择 | 通常是全部流量,或按 IP 范围 |
| 在 iPhone 上 | 需要客户端 App | iOS 内置 IKEv2,其他协议需要 App |
| 服务器能看到什么 | 你访问的网站 | 你访问的网站 |
在 iPhone 上,两者的界线变得模糊:Shadowsocks 客户端借助 iOS 的 VPN 配置来接管流量,所以你会看到 VPN 图标。但从手机发出的是 Shadowsocks,而不是某种 VPN 协议。
两者都不是匿名工具。服务器运营者能看到你连接了哪里,所以请选择你信任的服务商,或者自己搭建服务器。
优点和缺点
优点
- 简单轻量,开销很小。
- 承载 UDP,通话、游戏和 QUIC 都能用。
- 几乎所有客户端、服务端和服务商都支持。
- 现代的 2022 和 AEAD 加密设计良好。
缺点
- 看起来完全随机的流量本身就可能成为一种信号。研究人员已经证明这种特征可以被检测出来,这也是基于 TLS 的协议流行起来的原因。
- 不加插件就没有 TLS 伪装,而插件大多会丢掉 UDP。
- 老旧的服务器可能仍在使用弱的流加密。
- 设置错误时不会报错,问题更难排查。
Shadowsocks 与其他协议的比较
| 协议 | 看起来像 | UDP | 需要证书 |
|---|---|---|---|
| Shadowsocks | 随机字节 | 是 | 否 |
| Trojan | HTTPS | 是,在 TLS 之内 | 是,或使用 REALITY |
| VLESS + REALITY | 访问某个借用网站的 HTTPS | 是 | 否 |
| Hysteria 2 | HTTP/3(QUIC) | 是 | 通常需要 |
想了解更全面的情况,请阅读代理协议对比。
在 iPhone 上使用 Shadowsocks
iOS 本身不支持 Shadowsocks,所以你需要一个客户端 App。Potatso 是一款免费的 iPhone 和 iPad 代理客户端,可以导入 ss:// 链接、二维码和订阅,支持 2022 和 AEAD 加密,并内置了常用插件。按照分步教程操作:iPhone 怎么用 Shadowsocks。
常见问题
- Shadowsocks 是 VPN 吗?
- 不是。Shadowsocks 是一种加密代理协议:它把 App 的连接逐条经服务器转发,而 VPN 会通过隧道传送所有网络数据包。在 iPhone 上,客户端 App 借助 VPN 配置来接管流量,但它发往服务器的是 Shadowsocks。
- Shadowsocks 安全吗?
- 使用 2022 或 AEAD 加密时,设备与服务器之间的流量是加密的,也能防篡改。但服务器仍能看到你访问了哪些网站,所以只使用你信任的服务器,并避免 rc4-md5 这类老旧的流加密。
- Shadowsocks 用哪种加密方式最好?
- 服务器支持的话,用 2022 加密,例如 2022-blake3-aes-128-gcm;否则用 aes-256-gcm 或 chacha20-ietf-poly1305。客户端必须使用与服务器设置完全相同的加密方式。
- Shadowsocks 支持 UDP 吗?
- 支持。Shadowsocks 既转发 TCP,也转发 UDP,所以语音通话、游戏和 QUIC 都能经过它。大多数插件只承载 TCP,因此带插件的服务器通常会绕过插件转发 UDP,或者干脆不转发。
- Shadowsocks 会被识别吗?
- 它没有可见的握手,比很多 VPN 协议更难被识别出特征,但并非无法识别。完全随机的流量本身就可能显得异常,这也是插件和 Trojan 等基于 TLS 的协议出现的原因。