隐匿于明处的传输协议。
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 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() }
小巧而稳定的连接形态。
自 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);会话恢复绝不会削弱身份认证。
rVPN 防御什么。
每一行将一种威胁对应到缓解它的机制。
动态的、可自愈的密码学状态。
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 主机密钥变更的处理方式完全一致。多服务器配置文件会分别固定每个出口服务器。
内置的先进路由引擎。
客户端内置路由引擎,决定哪些流量进入隧道、哪些保持本地直连、哪些被拦截。
IP CIDR 查找
IP 网络表以对数时间解析 CIDR 路由,用于分流绕过与强制隧道的网段。
域名规则
面向隧道、绕过与强制隧道域名列表的层级感知匹配。
广告与追踪列表
针对内置及用户自定义的广告/追踪列表进行快速的精确匹配与父域名查找。
延迟 DNS
零 DNS 泄漏,同时初始连接延迟接近于零。
多服务器路由
一个配置文件可以携带额外的出口服务器,每个出口都有自己的路由域名(后缀匹配:google.com 涵盖 *.google.com)与路由 IP/CIDR。匹配的流量经由该出口发出,绝不会静默回退到默认服务器。在移动端,解析器运行在隧道扩展内部:每个出口通过自己的 DNS-over-HTTPS 通道解析域名,每个应答都会连同其 TTL 记录到共享路由表中,因此后续到这些 IP 的连接会自动走同一个出口。各出口在首次使用时才惰性建立连接,并独立重连,每个出口都有自己固定的 TOFU 身份。
启动时快速加载规则。
客户端在启动时将内置的路由与拦截列表,以及可选的用户自定义列表加载到内存中,从而保证每条连接的查询都足够快。
工作原理
域名在 HashSet 集合中匹配,并附带父域名检查。IP 范围存储于最长前缀匹配表中。所有内容均在启动时加载到内存;针对超大型企业级规则集的零拷贝序列化与增量更新已在规划之中。
没有可被利用的管理接口。
暴露 HTTP/REST 管理 API、RPC 接口或管理套接字,会为凭据窃取、权限提升和零日漏洞利用制造攻击面。
rVPN 没有管理接口。所有参数、路由规则和密钥映射都在启动时读取的静态 TOML 文件中设定。不存在任何管理 API、仪表盘或控制套接字,因此攻击者无法改变运行时状态。
无管理 API
没有 HTTP 端点,没有 RPC 接口,没有管理套接字。运行时无可利用之处。
静态配置(TOML)
所有参数均在启动时定义。运行时不可变,不存在任何动态重配置接口。