// 文档编号:WP-0.6.0

技术白皮书

一种安全传输协议,采用 Double Ratchet 加密、X3DH 密钥协商与零管理面设计。

版本 0.6.0 日期 2026 年 9 月 状态 技术规范
01

隐匿于明处的传输协议。

rVPN 运行在 443 端口的 WebSocket/TLS 之上——与普通 HTTPS 使用相同的端口和协议。在网络观察者看来,这条隧道就是普通的网页浏览。

它以 Double Ratchet 算法取代静态密钥交换,提供前向保密 与后泄露安全性。所有流量都通过 443 端口上的一小组 WebSocket 连接进行多路复用。

桌面端、CLI 与 Android 客户端使用 BoringSSL 模拟 Chrome 的 TLS 1.3 ClientHello 指纹,以规避深度包检测。iOS 客户端使用纯 Rust 实现的 rustls;Apple 的 Network Extension 沙箱限制了 BoringSSL 的内存模型,因此 iOS 以牺牲指纹模拟换取稳定性。服务器同样使用 rustls 处理入站 WebSocket 连接,并在同一个 :443 监听器上通过 ACME TLS-ALPN-01 自动申请和续期自己的 Let’s Encrypt 证书,无需任何外部工具或续期定时任务。

tls_mimicry.rs
// TLS 1.3 Chrome fingerprint
fn build_chrome_connector() {
    let mut builder = SslConnector::builder();
    builder.set_min_proto_version(TLS1_3);
    builder.set_cipher_list(
        "TLS_AES_128_GCM_SHA256:
         TLS_AES_256_GCM_SHA384:
         TLS_CHACHA20_POLY1305"
    );
    builder.set_alpn_protos(b"\x08http/1.1");
    builder.build()
}
02

小巧而稳定的连接形态。

自 v1.3.5 起,CLI 与桌面客户端将所有的代理数据流多路复用到一组长期存活的 WebSocket/TLS 连接池上,而不再为每条流新建连接。移动端的直接 TUN 模式一直以来都在单条连接上多路复用;连接池把同样的特性带给了 SOCKS5/HTTP 模式,同时不牺牲并行能力。

2.1. 为什么使用连接池

每流一连接意味着每条数据流都要付出一次完整的 TCP、TLS 1.3、WebSocket 与 X3DH 握手。在高负载下,客户端会同时向同一台服务器维持数百个并行 TLS 会话:建立缓慢,而且这种连接形态在流量分析中十分显眼。连接池(默认每个出口服务器 4 条连接,可配置)使连接形态无论有多少活跃数据流都保持小巧而恒定。

2.2. 基于信用的流控

每条数据流在每个方向上都有一个字节信用窗口(初始 256 KiB)。发送方每发送一个负载字节就消耗一个信用,信用耗尽即停止读取,因此普通的 TCP 背压即可约束生产者;接收方则在消费数据时授予增量信用。一条流若在零信用状态下停滞 60 秒,将被关闭:这是一种防御性阀门,而非常规路径。控制帧经由独立的优先通道传输,因此批量数据永远不会延误流的生命周期消息。

2.3. 线上顺序即密码学顺序

Double Ratchet 在加密时为消息编号,并丢弃乱序到达的帧,因此共享连接绝不能在并发数据流之间重排帧。每个连接的发送锁会将整个加密→入队过程串行化,确保在竞争条件下线上顺序与 ratchet 顺序完全一致。ratchet 锁本身在任何发送等待之前就会释放,因此背压的连接永远不会阻塞解密。

2.4. 会话恢复与预热

每条连接都会缓存 TLS 1.3 会话票据,因此重连只需一个往返即可完成,无需证书传输;当连接断开时,连接池会在后台预先建立替补连接。每条新连接仍会针对已固定的服务器身份执行一次全新的 X3DH 握手(§4.4);会话恢复绝不会削弱身份认证。

03

rVPN 防御什么。

每一行将一种威胁对应到缓解它的机制。

威胁级别 攻击者能力 rVPN 的缓解措施
被动观察者 流量分析、流量时序 0–64 字节帧填充、恒定速率注入
网络分析 协议指纹识别 TLS 1.3 之上的 WebSocket,Chrome ClientHello 指纹模拟(桌面/CLI/Android 使用 BoringSSL;iOS 使用 rustls)
网络封锁 连接验证请求 伪装网站掩蔽:对未认证的探测返回 HTTP 200 OK
密钥泄露 未来密钥泄露 通过 Double Ratchet 实现后泄露安全性
量子攻击者 先存储后解密攻击 计划中的混合 PQC 模式:ML-KEM + X25519(当前版本使用 X25519/Ed25519)
04

动态的、可自愈的密码学状态。

rVPN 不像 OpenVPN 或 WireGuard 那样使用静态握手。它的密码学状态在整个会话期间持续演化。

4.1. X3DH 密钥协商

初始握手使用扩展三重 Diffie-Hellman(X3DH)。客户端获取服务器已签名的预密钥,计算四个 DH 共享秘密,并通过 HKDF-SHA256 派生根密钥。

4.2. Double Ratchet

握手完成后,连接由 Double Ratchet 算法接管。对称棘轮为每条消息推进链密钥,以实现前向保密;DH 棘轮则轮换非对称密钥,以实现后泄露安全性。

4.3. 乱序处理

TCP 流可能乱序投递消息。Double Ratchet 状态会保存被跳过的消息密钥,使迟到或乱序的帧无需推进链即可解密,无需单独的重排缓冲即可保持连接完整。

4.4. 服务器身份验证(TOFU)

仅靠密钥协商无法证明谁持有密钥。首次连接时,客户端会固定服务器的 Ed25519 身份指纹(规范形式为 ik:1:<base32>),即 SSH 风格的首次信任(TOFU)。此后每次握手都必须匹配该固定值,且验证独立于 TLS 证书链进行:被攻破的 CA 或被强制重新签发的证书都无法冒充已固定的服务器。指纹不匹配将拒绝连接;轮换服务器的身份密钥需要显式重新固定,与 SSH 主机密钥变更的处理方式完全一致。多服务器配置文件会分别固定每个出口服务器。

05

内置的先进路由引擎。

客户端内置路由引擎,决定哪些流量进入隧道、哪些保持本地直连、哪些被拦截。

最长前缀匹配

IP CIDR 查找

IP 网络表以对数时间解析 CIDR 路由,用于分流绕过与强制隧道的网段。

域名后缀匹配

域名规则

面向隧道、绕过与强制隧道域名列表的层级感知匹配。

哈希集合拦截列表

广告与追踪列表

针对内置及用户自定义的广告/追踪列表进行快速的精确匹配与父域名查找。

FakeIP 池

延迟 DNS

零 DNS 泄漏,同时初始连接延迟接近于零。

多服务器路由

一个配置文件可以携带额外的出口服务器,每个出口都有自己的路由域名(后缀匹配:google.com 涵盖 *.google.com)与路由 IP/CIDR。匹配的流量经由该出口发出,绝不会静默回退到默认服务器。在移动端,解析器运行在隧道扩展内部:每个出口通过自己的 DNS-over-HTTPS 通道解析域名,每个应答都会连同其 TTL 记录到共享路由表中,因此后续到这些 IP 的连接会自动走同一个出口。各出口在首次使用时才惰性建立连接,并独立重连,每个出口都有自己固定的 TOFU 身份。

06

启动时快速加载规则。

客户端在启动时将内置的路由与拦截列表,以及可选的用户自定义列表加载到内存中,从而保证每条连接的查询都足够快。

内置列表 已编译 随二进制文件分发;无需外部解析
自定义列表 启动时加载 启动时读取用户提供的域名或 CIDR 文件
运行时集合 O(1) 查找 基于哈希的集合与 IP 网络表,用于路由决策

工作原理

域名在 HashSet 集合中匹配,并附带父域名检查。IP 范围存储于最长前缀匹配表中。所有内容均在启动时加载到内存;针对超大型企业级规则集的零拷贝序列化与增量更新已在规划之中。

07

没有可被利用的管理接口。

暴露 HTTP/REST 管理 API、RPC 接口或管理套接字,会为凭据窃取、权限提升和零日漏洞利用制造攻击面。

rVPN 没有管理接口。所有参数、路由规则和密钥映射都在启动时读取的静态 TOML 文件中设定。不存在任何管理 API、仪表盘或控制套接字,因此攻击者无法改变运行时状态。

无管理 API

没有 HTTP 端点,没有 RPC 接口,没有管理套接字。运行时无可利用之处。

静态配置(TOML)

所有参数均在启动时定义。运行时不可变,不存在任何动态重配置接口。