Skip to content

实现完整 gRPC 客户端、服务端与 Xray 互操作#41

Draft
MiChongs wants to merge 1 commit into
codex/protocol-xhttp-fullfrom
codex/transport-grpc-full
Draft

实现完整 gRPC 客户端、服务端与 Xray 互操作#41
MiChongs wants to merge 1 commit into
codex/protocol-xhttp-fullfrom
codex/transport-grpc-full

Conversation

@MiChongs

Copy link
Copy Markdown
Owner

背景与目标

本变更为 WutherCore 增加完整的 Xray gRPC(gun)传输支持,覆盖真实客户端、真实服务端、Tun/TunMulti 流式 RPC、TLS/REALITY、安全校验、配置注册和现有代理协议承载。实现使用 tonic 与 prost,不以自定义占位帧、普通 HTTP/2 请求或仅配置映射代替 gRPC 协议。

Xray 26.7.11 已提示 gRPC 传输属于兼容性功能并建议新部署迁移到 XHTTP,但现有节点、订阅和服务端仍需要完整互操作,因此本实现保留严格、可测试、失败关闭的全功能支持。

分支与提交关系

  • 开发分支:codex/transport-grpc-full
  • 基线分支:codex/protocol-xhttp-full
  • 相对基线提交数:1
  • 提交:bfb441f1a3f5b5996f336184edcc9bdb8de5ec95
  • 使用独立 worktree 开发,没有修改主工作区。

本 PR 以 XHTTP 分支为基线,是因为 gRPC 复用该分支提供的统一 TLS/ECH/REALITY 传输抽象。这样可以避免在 gRPC 提交中重复复制基础设施,并确保 PR 差异严格只有一个 gRPC 实现提交。XHTTP 合并后,本分支可直接改基到 main

核心协议实现

  • 新增独立 core-grpc crate,使用 tonicprosthypertower 和 Tokio 实现实际 gRPC 数据面。
  • 按 Xray protobuf wire format 实现 HunkMultiHunk,并用固定金丝雀测试验证字段编号和重复字段编码。
  • 支持标准路径 /{service}/Tun/{service}/TunMulti,兼容空服务名、旧式默认方法和 Xray 自定义路径规则。
  • 客户端执行真实 tonic HTTP/2 握手与双向流式 RPC,不会把 gRPC 退化为普通 HTTP/2 隧道。
  • 服务端以真实 tonic service 接收 TunTunMulti,支持单连接服务、关闭通知和活动连接回收。

流、背压与关闭语义

  • 将 tonic 流式消息转换为实现 AsyncRead/AsyncWrite 的双向字节流,供现有代理协议直接承载。
  • flush 会等待消息被 tonic 发送侧实际消费,避免只写入本地队列就提前返回。
  • 对单消息大小、编码后 protobuf 大小、队列深度、连接数、并发流和空闲时间设置显式上限。
  • TunMulti 的聚合与向量写入不会超过编码后限制。
  • 正常 EOF、远端取消、请求体错误、未打开隧道、服务关闭和连接中止均有确定的资源回收路径。
  • 客户端允许在响应头返回前取得可写流,避免与 Xray 双向流的惰性响应语义形成死锁。

客户端与现有协议承载

  • VLESS、VMess、VMess Legacy 和 Trojan 均通过统一注册表使用真实 gRPC carrier。
  • 支持 VLESS TCP、UDP 数据报和 mux 请求。
  • VMess 覆盖 AES-GCM 与 ChaCha20-Poly1305 安全模式。
  • 支持 multiModeserviceNameauthorityuserAgent、自定义请求头、空闲超时、健康检查超时和初始窗口等 Xray 字段。
  • authority、Host、SNI 与目标地址具有明确优先级;冲突或头部注入会在建连前失败。

服务端与入站支持

  • 新增结构化 listen.grpc 入站配置,可启动 VLESS-over-gRPC 服务端。
  • 支持 TunTunMulti、TCP、UDP、VLESS mux、用户 UUID 校验和统一路由运行时。
  • gRPC 入站已接入主程序启动流程,不只是库级接口。
  • 支持明文 h2c、TLS 和 REALITY;TLS 强制协商 h2,不允许安全配置静默降级。
  • 监听器会校验地址、服务名、UUID、转发头、消息限制、并发限制、超时和安全字段。

配置字段与兼容性

  • 客户端和服务端字段均注册为强类型模型,覆盖 Xray 常用驼峰字段及项目兼容别名。
  • 注册 serviceNamemultiModeauthorityuserAgentidleTimeouthealthCheckTimeoutpermitWithoutStream、初始连接/流窗口、请求头以及资源限制。
  • TLS/REALITY 配置沿用统一的完整安全模型,包括 SNI、ALPN、证书固定、名称验证、客户端证书和 REALITY 密钥字段。
  • 未知字段、别名冲突、无界资源、非法 UUID、错误路径、非法头部和无法执行的安全组合均在配置阶段拒绝。
  • Cargo.lock 已包含 tonic、prost 及其传递依赖的固定版本,构建不依赖 CI 临时解析。

安全与资源治理

  • 客户端和服务端均设置有界消息大小和队列容量。
  • 入站连接数、每连接并发流、活动逻辑流和请求生命周期均受限。
  • 仅在显式信任时读取转发来源地址,并按 Xray 标记语义解析。
  • TLS 必须协商 HTTP/2 ALPN;REALITY 使用真实握手实现,不回退到普通 TLS。
  • 用户提供的 authority、User-Agent 和额外请求头经过严格语法与注入检查。

验证结果

  • cargo test -p core-grpc:18 项通过。
  • cargo test -p core-config grpc:7 项通过。
  • cargo test -p core-inbound grpc --lib:4 项通过。
  • cargo test -p core-outbound grpc --lib:11 项通过。
  • cargo test -p wuther-core:16 项通过。
  • cargo check --workspace --all-targets:通过。
  • cargo fmt --all -- --check:通过。
  • git diff --check codex/protocol-xhttp-full...HEAD:通过。
  • 官方 Xray 26.7.11(提交 50231ea)互操作:7 项全部通过。

官方互操作覆盖:

  • WutherCore tonic 客户端到官方 Xray 服务端的 TunTunMulti
  • 官方 Xray 客户端到 WutherCore tonic 服务端的 TunTunMulti
  • 官方 Xray 客户端到注册式 WutherCore VLESS/gRPC 入站。
  • WutherCore 与官方 Xray 之间的 TLS/gRPC 双向互操作。
  • WutherCore 与官方 Xray 之间的 REALITY/gRPC 双向互操作。
  • VLESS、VMess AES-GCM、VMess ChaCha20-Poly1305、Trojan 通过真实 gRPC carrier。
  • VLESS UDP 数据报通过真实 gRPC carrier。
  • 默认、空服务名、自定义服务名、转义旧式服务名以及单流/多流模式。

审阅说明

本 PR 保持草稿状态。建议先审阅 core-grpc 的 wire format、流背压与关闭语义,再审阅配置映射、协议注册和入站启动接线。

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