tech/protocol · 集群 A · 主流协议原理 · 5/6

Shadowsocks 原理详解:AEAD 加密、SS2022 改进与轻量代理的取舍

发布时间 待核实核实日期 待核实最近更新 待核实测试状态 Not Tested
Answer First · 核心结论

Shadowsocks 是一种基于预共享密钥的轻量代理协议,流量从第一个字节起就经过加密,没有明显的握手阶段。现行实现应使用 AEAD 加密套件,旧的流加密方式已不建议使用;SS2022 进一步加入了时间戳与重放保护,但要求密钥为固定长度的 Base64 格式,客户端需支持对应版本。

Shadowsocks 的设计哲学

Shadowsocks 的设计哲学是「足够简单」:双方事先共享一个密钥,客户端把目标地址和数据一起加密发出,服务端解密后代为访问。没有证书、没有协商、没有多余的协议字段,这使它成为实现最广泛、开销最低的代理协议之一。

与 TLS 类协议相比,它最大的结构差异在于没有握手阶段。TLS 需要先交换 ClientHello、ServerHello、证书,再开始传输应用数据;Shadowsocks 发出的第一个包里就已经是密文。

TLS 类协议                     Shadowsocks
客户端 ── ClientHello ──▶      客户端 ── [盐 | 加密的地址头 + 数据] ──▶
      ◀── ServerHello ──             ◀── [盐 | 加密的响应数据] ──
      ── 握手完成 ──▶
      ══ 加密应用数据 ══

数据包里有什么

一个 Shadowsocks(AEAD 版本)TCP 连接的起始部分,由随机盐、加密的地址头和加密的数据块组成。地址头沿用了 SOCKS5 的风格:一个字节的地址类型,后接 IPv4、IPv6 或域名,再加端口。

组成 作用 说明
盐(salt) 每个连接随机生成 与主密钥一起派生出本连接的会话密钥
长度块 加密的数据长度 带认证标签,防篡改
地址头 目标地址与端口 SOCKS5 风格,加密传输
数据块 应用数据 分块加密,每块都有认证标签

这种结构保证了每条连接使用不同的会话密钥,即使主密钥相同,两条连接的密文也不会相同。每个数据块附带的认证标签,确保被篡改的数据会被直接丢弃。UDP 的处理方式类似,只是每个数据报独立加密。

从流加密到 AEAD

Shadowsocks 的加密方式经历过一次重要演进:从早期的流加密(stream cipher)转向 AEAD(带认证的加密)。这次演进的原因很直接:流加密只提供机密性,不提供完整性校验,数据被篡改时服务端无法识别,理论上存在被利用的空间。

AEAD 同时提供加密与认证,被篡改的密文在解密时会校验失败。现行推荐的套件包括:

套件 类型 理解要点
aes-128-gcm / aes-256-gcm AEAD 有 AES 硬件加速的设备上效率较高
chacha20-ietf-poly1305 AEAD 缺少 AES 加速的设备上表现较好
2022-blake3-aes-128-gcm 等 SS2022 加入时间戳与重放保护,密钥格式不同
rc4-md5、aes-cfb 等 旧式流加密 不建议使用

如果你在订阅里看到旧式流加密方式,可以向服务商询问是否有 AEAD 或 SS2022 节点可选。

SS2022 改进了什么

SS2022(Shadowsocks 2022 版本)是在 AEAD 版本基础上的一次较大改进,重点解决重放与密钥强度问题。它的主要变化包括:

  • 头部加入时间戳,服务端拒绝时间偏差过大的请求,配合盐值记录实现重放保护;
  • 密钥必须是固定长度、Base64 编码的随机字节,不再接受任意口令字符串,避免弱口令;
  • 头部结构调整,响应中包含请求盐的信息,使请求与响应能互相绑定。

时间戳的引入意味着 SS2022 与 VMess 一样,对设备时间有一定要求,时间偏差过大时可能连接失败,排查时应先确认系统时间是否开启自动同步,参考 故障排查。SS2022 与旧版不能直接互通,客户端需要支持 SS2022 的较新版本,mihomo、sing-box 等内核已支持,原版 Clash 内核的支持情况以其版本说明为准。

插件机制与传输扩展

Shadowsocks 本身只定义了加密与地址格式,传输层的扩展通过 SIP003 插件接口实现。插件运行在 Shadowsocks 与网络之间,可以把流量封装成其他形态,例如基于 WebSocket、基于 TLS 或简单的 HTTP 外观封装。

应用 → Shadowsocks 客户端 → 插件(封装)→ 网络 → 插件(解封装)→ SS 服务端

插件需要客户端与服务端成对使用,订阅中通常以 plugin 和 plugin-opts 字段出现。客户端对插件的支持差异较大,导入后无法连接时,应先确认客户端是否支持该插件。插件是部署层面的选择,本站不讨论针对任何网络管理系统的使用方法。

优势、局限与适用场景

Shadowsocks 的优势在于简单与兼容:几乎所有代理客户端都支持,资源占用低,在路由器等性能有限的设备上也能运行,适合作为通用兜底协议,相关场景可参考 路由器方案。

它的局限在于缺少证书体系:客户端无法像 TLS 那样通过证书确认服务端身份,安全前提完全依赖预共享密钥不泄露。此外,没有握手阶段的「全密文」流量,本身也是一种特征,协议识别领域对此有专门研究,可参考 协议识别的原理。

本站品牌库中,没有品牌资料标注 Shadowsocks;资料标注协议的品牌均为 VLESS,微风网络、飞猫云、星岛梦、灵猫网络、极连云五个品牌协议待核实,本站不推测其协议。实际节点协议以订阅内容为准。

订阅中的 Shadowsocks 字段怎么读

在机场订阅里,一个 Shadowsocks 节点通常只包含寥寥几个字段:服务器地址、端口、加密方式(cipher 或 method)、密码(password),以及可选的插件字段。字段少是它的优点,但也意味着任何一项不一致都会直接导致连接失败,而且失败时几乎没有可读的错误提示。

排查 Shadowsocks 节点问题时,可以按以下顺序核对:加密方式是否为客户端支持的套件,尤其是 SS2022 系列需要较新版本;密码是否完整,SS2022 的 Base64 密钥对长度有严格要求,复制时少一个字符就会失败;是否带有插件字段而客户端未安装对应插件;最后才考虑线路与节点状态。

如果是通过 ss:// 分享链接导入,链接内的加密方式与密码通常经过 Base64 编码,手动编辑容易出错,建议直接通过订阅更新获取配置,相关格式差异见 订阅管理 专题。

小结

Shadowsocks 用预共享密钥换来了没有握手的简洁结构,AEAD 解决了完整性问题,SS2022 进一步补上了重放保护与密钥强度。理解它,有助于理解为什么后来的协议会转向「借用 TLS」的思路:两种路线各有取舍,而不是简单的新旧替代。

想对比其他协议的设计思路,可以回到 代理协议 专题总览;查看品牌协议资料,可前往 机场品牌库 或 对比工具。

常见问题

Shadowsocks 的加密方式应该选哪个?

应使用 AEAD 套件,如 aes-128-gcm、aes-256-gcm、chacha20-ietf-poly1305,或 SS2022 系列。旧的流加密方式缺少完整性校验,不建议使用。具体以订阅下发为准。

SS2022 和旧版 Shadowsocks 能互通吗?

不能直接互通。SS2022 的加密方式名称、密钥格式与头部结构都不同,客户端和服务端必须同时支持并使用相同配置。

Shadowsocks 为什么没有握手?

它采用预共享密钥,双方事先已知密钥,客户端发出的第一个包就是加密数据,不需要像 TLS 那样协商密钥和交换证书。

Shadowsocks 插件是什么?

通过 SIP003 插件接口,可以在 Shadowsocks 外再加一层传输封装(例如基于 WebSocket 或 TLS 的插件),是否可用取决于服务端部署与客户端支持。

信息来源与更新时间

信息来源
品牌清单资料(品牌公开信息整理)
测试范围
本站未进行测速与解锁实测,所有能力描述均为资料声明或未测试状态。
发布时间
待核实
核实日期
待核实
最近更新
待核实

字段含义与数据状态见 字段说明;核查进度见 品牌动态与核查日志。