Skip to content

feat: 完整实现 Shadowsocks 客户端与服务端协议支持 - #50

Merged
MiChongs merged 1 commit into
mainfrom
codex/protocol-shadowsocks-full
Jul 27, 2026
Merged

feat: 完整实现 Shadowsocks 客户端与服务端协议支持#50
MiChongs merged 1 commit into
mainfrom
codex/protocol-shadowsocks-full

Conversation

@MiChongs

Copy link
Copy Markdown
Owner

背景与目标

现有 Shadowsocks 出站仅维护少量自实现加密路径,缺少完整算法覆盖、标准 Shadowsocks 2022 行为、服务端入口、严格配置注册和双向互操作保证。本次变更以官方 shadowsocks-rust 为唯一协议与密码学实现来源,完整补齐客户端、服务端、TCP、UDP、SIP003 插件和 SIP022 EIH 多用户能力,避免继续维护不完整的自定义帧与加密实现。

依赖与工具链

  • 精确引入当前最新的 shadowsocks 1.24.0
  • 启用流加密、标准 AEAD、扩展 AEAD、Shadowsocks 2022、2022 扩展算法和重放攻击检测全部相关特性。
  • 依照该依赖声明的最低 Rust 版本,将工作区 rust-version 从 1.85 提升到 1.88;现有持续集成和发布流程继续使用满足要求的稳定工具链。
  • 锁文件已同步更新,保证依赖解析可复现。

客户端实现

  • 用官方实现替换原有仅覆盖三种算法的自定义 Shadowsocks 客户端。
  • 完整支持经典 AES、Camellia、RC4、ChaCha20 流加密,AES-GCM、ChaCha20-IETF-Poly1305,以及 AES-CCM、AES-GCM-SIV、XChaCha20、SM4 等扩展 AEAD。
  • 完整支持 BLAKE3 系列 Shadowsocks 2022 方法及 EIH 身份链,并保留 ss2022 协议标识和既有注册错误契约。
  • TCP 与 UDP 均通过官方代理流和代理数据报实现。
  • UDP 直接复用运行时已完成 VPN 保护、接口绑定、套接字标记和回环登记的原始套接字,不会因依赖库重新建套接字而绕过系统网络策略。
  • UDP 增加独立密文接收缓冲,正确处理加密开销大于调用方明文缓冲的场景。
  • SIP003 客户端插件支持内联选项、独立选项、命令行参数和 TCP、UDP、双栈载体模式;插件作为受管子进程惰性启动,并在模式不覆盖请求载体时明确拒绝。

服务端实现

  • 新增完整 Shadowsocks TCP 与 UDP 入站,并注册到核心启动和关闭生命周期。
  • TCP 在官方协议层完成认证、解密和目标头解析后才进入统一入站路由,支持握手超时和有界连接并发。
  • UDP 按客户端地址、SIP022 会话编号和目标地址隔离关联,保留真实响应源地址,提供有界关联数、有界队列和空闲回收。
  • Shadowsocks 2022 UDP 响应维护独立服务端会话编号与递增数据包编号,避免响应重放或编号重复。
  • 监听级共享官方上下文,使 TCP 连接与 UDP 数据包共享重放检测状态。
  • 支持 SIP022 EIH 多用户管理,严格校验用户名称、Base64 编码及解码后的精确密钥长度。
  • 支持 SIP003 服务端插件:插件监听公开地址,解密服务仅监听插件分配的回环地址;插件参数、载体模式和启动超时均可配置,插件随监听句柄关闭。
  • TCP 与 UDP 双载体采用事务式预绑定;任一载体失败时整体回滚,不留下半启动服务。
  • 支持 IPv4、原始 IPv6 与带方括号 IPv6 监听地址。

配置与注册

listen.shadowsocks 和别名 listen.ss 均支持单对象或数组,并严格注册以下字段:

  • enabled
  • addresshost
  • port
  • method
  • password
  • mode
  • plugin
  • plugin-optsplugin_opts
  • plugin-argsplugin_args
  • plugin-modeplugin_mode
  • plugin-startup-timeoutplugin_startup_timeout
  • users
  • handshake-timeouthandshake_timeout
  • udp-timeoutudp_timeout
  • max-connectionsmax_connections
  • max-udp-associationsmax_udp_associations
  • tag

配置编译阶段会拒绝未知字段、不支持的算法、无效或长度错误的 2022 密钥、非 2022 算法上的 EIH 用户、空或重复用户名、非法模式、零超时或零上限、缺失插件主体的插件选项、插件与监听载体不一致、重复标签,以及按传输层区分的监听地址冲突。

运行时与资源管理

  • 服务端入口已接入主进程启动、失败回滚和优雅关闭路径。
  • 主机资源预检按监听模式分别声明 TCP 与 UDP 独占资源,禁用的监听不会占用资源。
  • 连接、关联、子任务和插件进程均由取消令牌及监听句柄统一管理。
  • 上传、下载和连接指标继续进入现有观测体系。

文档

  • 新增完整中文 Shadowsocks 配置与安全语义文档。
  • 更新文档索引和功能矩阵,明确客户端、服务端、SIP003 与 SIP022 的支持范围。

验证结果

已执行并通过:

  • cargo search shadowsocks --limit 1,确认当前最新版本为 1.24.0。
  • cargo info shadowsocks@1.24.0,确认依赖最低 Rust 版本为 1.88。
  • cargo check --workspace --all-targets --locked
  • cargo test --workspace --all-targets --locked;全部可运行测试通过,依赖外部官方 Xray 二进制的既有测试按原条件忽略。
  • cargo doc --workspace --no-deps --locked
  • 官方客户端到本服务端的经典 AEAD、流加密、Shadowsocks 2022、EIH、经典 UDP 与 2022 UDP 互操作测试。
  • 本客户端到官方服务端的 TCP 与 Shadowsocks 2022 UDP 互操作测试。
  • SIP003 服务端受管子进程端到端转发与关闭测试。
  • 完整配置字段、别名、非法组合、资源声明和端口冲突测试。

兼容性与审阅说明

  • 本分支只包含一个 Shadowsocks 协议提交,符合单协议单提交要求。
  • 拉取请求基于 codex/protocol-snell-full,用于保持协议实现按独立分支顺序叠加;审阅时可直接查看该基线之后的唯一提交。
  • 工作区最低 Rust 版本提升到 1.88 是采用最新官方依赖的必要条件。
  • 构建中仍可见的未使用项警告来自既有模块,本次变更未新增协议实现警告或文档错误。

Base automatically changed from codex/protocol-snell-full to codex/protocol-ssh-full July 27, 2026 07:59
@MiChongs
MiChongs force-pushed the codex/protocol-ssh-full branch from a052dbe to 9e33989 Compare July 27, 2026 09:24
Base automatically changed from codex/protocol-ssh-full to main July 27, 2026 09:25
@MiChongs
MiChongs force-pushed the codex/protocol-shadowsocks-full branch from 2365c96 to e57bfc7 Compare July 27, 2026 09:34
@MiChongs
MiChongs marked this pull request as ready for review July 27, 2026 09:35
@MiChongs
MiChongs merged commit aded025 into main Jul 27, 2026
0 of 2 checks passed
@MiChongs
MiChongs deleted the codex/protocol-shadowsocks-full branch July 27, 2026 09:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant