Skip to content

完整实现 Snell v1-v5 客户端与服务端#49

Draft
MiChongs wants to merge 1 commit into
codex/protocol-ssh-fullfrom
codex/protocol-snell-full
Draft

完整实现 Snell v1-v5 客户端与服务端#49
MiChongs wants to merge 1 commit into
codex/protocol-ssh-fullfrom
codex/protocol-snell-full

Conversation

@MiChongs

Copy link
Copy Markdown
Owner

变更背景

项目原有 Snell 出站仅覆盖基础握手,缺少官方各版本的认证记录层、连接复用、UDP、simple-obfs、入站服务端、严格配置校验和运行时注册。本次变更以 Mihomo v1.19.29 的 Snell 实现为互操作基准,补齐 Snell v1 至 v5 的客户端与服务端能力,并确保所有配置都进入强类型模型、运行时计划和实际执行路径。

主要变更

协议与密码学

  • 实现 Snell v1 至 v5 双向认证记录层。
  • v1 使用 ChaCha20-Poly1305,v2、v3 使用 AES-128-GCM,v4、v5 使用带自适应填充的 v4 记录格式。
  • 使用 Argon2id 派生每个方向的会话密钥,参数与互操作基准一致。
  • 使用独立随机盐和小端递增随机数,严格校验认证标签、帧长、填充长度、截断数据与协议结束帧。
  • 明确区分逻辑流结束和底层传输关闭,避免复用连接将零长度结束块误判为套接字关闭。

客户端

  • 实现 v1 至 v5 TCP 请求、响应确认和双向中继。
  • 实现 v2 自动连接复用,以及 v4、v5 可配置连接复用;复用池具有容量上限、空闲期限和健康状态筛选。
  • 实现 v3 至 v5 UDP 数据报,保持目标地址、源地址和数据报边界。
  • 实现 HTTP 与 TLS 两种 simple-obfs 客户端封装,支持碎片化读写和部分写入。
  • 严格校验版本、固定密码套件、UDP、复用和混淆组合,不接受无法执行或自相矛盾的配置。

服务端

  • 新增可事务预绑定、可显式关闭的 Snell 入站监听器。
  • 实现 v1 至 v5 TCP 入站、v2/v4/v5 顺序逻辑流复用,以及 v3 至 v5 UDP 入站。
  • UDP 入站支持同一会话访问多个目标,使用独立有界队列、目标数量上限和运行时路由,并保留实际响应源地址。
  • 支持 HTTP 与 TLS simple-obfs 服务端解封装。
  • 接入统一入站路由、连接计数、流量统计、握手超时、并发连接上限和有序停机。
  • 多监听器启动失败时回滚已启动监听器,避免部分配置生效。

配置、订阅与注册

  • 在监听配置中注册单个或数组形式的 snell,覆盖启用状态、监听地址、端口、预共享密钥、版本、UDP、混淆、握手超时、最大连接数和标签。
  • 对未知字段、空密钥、非法端口、版本范围、UDP 版本约束、混淆模式、超时、并发上限、重复套接字和重复标签执行失败关闭校验。
  • 在出站注册表中完整注册 Snell 密钥、版本、固定密码套件、UDP、复用、混淆模式和混淆主机。
  • Clash 订阅解析保留 Snell 的密钥、版本、UDP、复用和嵌套混淆字段。
  • 主程序启动路径预绑定 Snell 监听器,并将其纳入宿主资源冲突检查和逆序停机。

文档

  • 新增完整 Snell 中文配置文档。
  • 更新功能矩阵、配置索引和文档入口,说明各版本能力、限制、默认值和安全行为。

兼容性与安全性

  • 线格式、命令号、密钥派生参数、密码套件和 v4 填充行为对齐固定的 Mihomo 互操作基准。
  • 错误预共享密钥、认证标签损坏、截断帧、超长帧、非法填充、非法命令和不支持的版本组合均会被拒绝。
  • 所有网络队列、连接数和 UDP 目标表都有明确上限,不使用无界缓冲。
  • simple-obfs 只作为 Snell 原生可配置的 HTTP/TLS 混淆层;其他独立插件传输不在本提交中混入 Snell 协议实现。

验证

  • cargo test -p core-config
  • cargo test -p core-feeds
  • cargo test -p core-outbound
  • cargo test -p core-inbound
  • cargo test -p wuther-core
  • cargo test --workspace --all-targets
  • git diff --cached --check

新增测试覆盖:

  • v1 至 v5 碎片化双向记录层往返。
  • v1 至 v5 错误预共享密钥拒绝。
  • 截断认证帧拒绝。
  • v2 与 v4 在同一认证传输上连续承载两个逻辑会话。
  • v1 至 v5 真实 TCP 入站与出站互通。
  • HTTP 与 TLS simple-obfs 的碎片化读写及真实 Snell 会话。
  • v3 与 v5 多目标 UDP 数据报往返。
  • 配置单项、数组形式、全部字段、非法组合、订阅保真、启动预绑定和资源声明。

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