Shadowsocks
Shadowsocks(简称 SS)是最具历史意义的代理协议之一,由中国开发者 @clowwindy 于 2012 年创建并开源。它以设计简洁、性能高效、生态成熟著称,时至今日仍是客户端支持最广泛的协议。
历史背景
2012 年,@clowwindy 在 GitHub 发布了 Shadowsocks 的第一个版本。其设计哲学非常明确:用最简单的方式,把本地的流量加密后转发到远端服务器。
2015 年,由于作者受到压力,原版仓库删除并停止维护。此后,社区接手了项目的维护工作,形成了 shadowsocks-libev、shadowsocks-rust、shadowsocks-go 等多个分支实现。这些实现至今仍在活跃开发中。
关于 Shadowsocks 2022
2022 年,协议进行了一次重大升级,引入了新的加密标准和更严格的安全设计,通常称为 "Shadowsocks 2022" 或 "SS-2022"。本页介绍原版 Shadowsocks 协议;2022 版本请参阅 Shadowsocks 2022 页面。
工作原理
Shadowsocks 的核心思路是在客户端和服务端之间建立一个加密的代理隧道:
本地应用
|
v
SS 本地客户端(socks5 监听)
| [对称加密]
v
SS 远端服务器
| [解密]
v
目标网站
具体流程如下:
- 本地客户端在本机启动一个 SOCKS5 代理监听端口
- 系统或应用将流量发送到这个本地 SOCKS5 端口
- 客户端使用预共享的密码和加密方式,将流量加密后发送至远端 SS 服务器
- 远端服务器解密流量,代为访问目标地址,将响应加密返回
- 客户端解密响应,转交给本地应用
与 Trojan 或 VLESS 不同,Shadowsocks 不依赖 TLS,它使用自定义的应用层加密协议。这既是它的优点(性能高、无需证书),也是它的弱点(协议指纹相对明显)。
加密方式
Shadowsocks 支持多种加密方式,不同方式的安全性和性能差异显著。
AEAD 加密(推荐)
AEAD(Authenticated Encryption with Associated Data)同时提供加密和消息认证,能有效防止数据篡改和重放攻击。
| 加密方式 | 密钥长度 | 说明 |
|---|---|---|
aes-256-gcm | 256 位 | 硬件加速支持好,推荐在服务器端使用 |
aes-128-gcm | 128 位 | 性能略优于 256 位版本,安全性足够 |
chacha20-ietf-poly1305 | 256 位 | 软件实现性能好,推荐在移动设备或无 AES 硬件加速的设备上使用 |
流加密(已弃用)
以下加密方式存在已知安全漏洞,不应继续使用:
| 加密方式 | 问题 |
|---|---|
aes-256-cfb | 无消息认证,容易遭受主动探测 |
aes-128-cfb | 同上 |
rc4-md5 | RC4 算法已被破解,MD5 认证强度不足 |
chacha20 | 无消息认证的旧版本 |
强烈建议
请只使用 AEAD 加密方式(aes-256-gcm、aes-128-gcm 或 chacha20-ietf-poly1305)。旧式流加密方式在实际网络环境中已被证明容易遭受主动探测攻击,使用它们会带来不可预期的安全风险。
混淆插件
原始的 Shadowsocks 协议没有针对深度包检测(DPI)的专门设计。为了提升抗检测能力,社区开发了多种混淆插件,通过将 SS 流量伪装成其他协议来规避检测。
obfs(simple-obfs)
最早也是最广为人知的混淆插件,将 SS 流量伪装为 HTTP 或 TLS 流量。由于伪装较为简单,对抗强力检测时效果有限,目前已逐渐被 v2ray-plugin 取代。
v2ray-plugin
使用 V2Ray 的 WebSocket 或 gRPC 传输方式对 SS 流量进行封装,可以搭配 TLS 证书使用,流量看起来像正常的 HTTPS WebSocket 连接。配置复杂度高于 obfs,但抗检测能力更强。
Cloak
提供更强的流量伪装,将 SS 流量隐藏在看似正常的 HTTPS 会话中,并支持多用户和流量统计。
xray-plugin
与 v2ray-plugin 类似,但基于 Xray 内核,支持更多传输方式。
关于插件的现实情况
在现代的代理实践中,如果需要强力的抗检测能力,通常会直接选用 VLESS + Reality 或 AnyTLS 等原生设计更安全的协议,而不是为 Shadowsocks 叠加插件。插件方案更多用于需要兼容老旧客户端的场景。
优缺点
| 优点 | 缺点 |
|---|---|
| 设计简洁,资源占用极低 | 原始协议流量特征较明显,容易被识别 |
| 性能高效,延迟低 | 不带混淆时抗检测能力弱 |
| 客户端支持最广泛 | 混淆插件增加配置复杂度 |
| 历史悠久,文档和社区资源丰富 | 安全性依赖加密方式的正确选择 |
| 无需域名和 TLS 证书 | 流加密方式存在已知漏洞(但 AEAD 版本没有此问题) |
| 支持 UDP 代理 | — |
与其他协议的对比
| 对比维度 | Shadowsocks | Trojan | VLESS + Reality |
|---|---|---|---|
| 是否需要域名 | 否 | 是 | 否 |
| 是否需要 TLS 证书 | 否 | 是 | 否 |
| 流量伪装 | 有限(需插件) | HTTPS | 任意目标网站 |
| 抗检测能力 | 中(插件后较高) | 较高 | 极高 |
| 协议复杂度 | 低 | 中 | 中 |
| 客户端支持广度 | 最广 | 广 | 较广(较新客户端) |
| 性能 | 高 | 高 | 高 |
适用场景
适合使用 Shadowsocks 的场景:
- 客户端兼容性要求高,需要支持老旧设备或系统
- 网络环境对检测力度较低,不需要强力伪装
- 作为多协议方案中的一个备选,用于兼容不支持新协议的设备
- 机场提供的订阅节点(很多机场仍以 SS 为主要协议)
不推荐单独依赖 Shadowsocks 的场景:
- 网络审查力度强的环境
- 需要长期稳定使用且不希望频繁切换节点的场景
- 新建自用节点(此时应优先考虑 VLESS + Reality 等现代协议)
服务端部署参考
以下以 shadowsocks-rust 为例,展示基本的服务端配置结构。部署前请确认服务器已开放对应端口的防火墙规则。
安装(以 Debian/Ubuntu 为例):
# 从 GitHub Releases 下载对应系统的预编译二进制文件
wget https://github.com/shadowsocks/shadowsocks-rust/releases/latest/download/shadowsocks-v1.x.x.x86_64-unknown-linux-musl.tar.gz
tar -xzf shadowsocks-v1.x.x.x86_64-unknown-linux-musl.tar.gz
mv ssserver /usr/local/bin/
服务端配置文件(config.json):
{
"server": "0.0.0.0",
"server_port": 8388,
"password": "your-strong-password",
"method": "aes-256-gcm",
"mode": "tcp_and_udp",
"fast_open": true
}
启动服务:
ssserver -c /etc/shadowsocks/config.json
关于端口选择
避免使用 8388 等广为人知的 SS 默认端口。建议选择 10000 以上的随机端口,减少被主动扫描探测的风险。
客户端支持
Shadowsocks 是目前客户端支持最广泛的代理协议,几乎所有代理软件都支持它:
| 平台 | 客户端 |
|---|---|
| Windows / macOS / Linux | Mihomo(Clash Meta)、sing-box、Xray、v2rayN |
| iOS | Shadowrocket、Stash、Quantumult X、Surge、Loon |
| macOS | Stash、Surge |
| Android | NekoBox、Husi、Exclave |
| Linux | dae、sing-box、Mihomo |
| 路由器 | OpenClash、ShellCrash |
延伸阅读
- Shadowsocks 2022 协议 — 了解对原版协议的现代化升级
- VLESS 协议 — 了解目前抗检测能力更强的现代协议
- 代理协议总览 — 回到协议总览页面