relaydrop:Rust 编写的文件中继工具
一个文件中继工具,核心特性是 支持通过 WebSocket over TLS(wss://)中转,让发送方与接收方可以经过任意 TLS 终结的反向代理或隧道访问中继,而中继本身不持有证书、不占用 443。
为什么
「房间配对 + 双向字节管道」协议默认承载在 TCP 上(中继默认 :9090)。relaydrop 额外把同一套协议承载到 WebSocket over TLS 之上,让发送方与接收方可以经过任意 TLS 终结的反向代理(如 nginx)或隧道(如 cloudflared)访问中继,而中继本身不持有证书、不占用 443。
架构
sender ─┐ ┌─ receiver
│ relay channel (relay_key) │
├──► relay (room) ◄──pipe──► relay ◄──┤
│ VPS, fronted by a TLS terminator │
wss://relay.example.com (nginx TLS 终结 + 代理 / cloudflared tunnel)
- 中继(relay):在「房间(room)」内把发送方与接收方配对,并在两端之间双向转发字节。本身 不持有 TLS 证书、不占用 443,由 nginx / cloudflared 在前端终结 TLS。
- 两把密钥(见
src/crypto.rs):
relay_key = HKDF(relay_password):保护客户端 ↔ 中继的控制通道(口令校验、房间名)。
file_key = HKDF(room_code):保护发送方 ↔ 接收方的文件内容。中继不知道 file_key,因此无法读取文件明文。
- 传输无关帧(见
src/framed.rs):TcpFramed(裸 TCP,4 字节长度前缀)与 WsFramed(WebSocket 二进制消息)实现同一个 FramedStream trait,中继管道无需关心每端用的是哪种传输。
注:用「由共享口令派生密钥」而非完整的 PAKE(口令认证密钥交换);两端本就输入同一共享口令,故可直接派生。安全权衡见 docs/security.md。
https://github.com/jetsung/relaydrop
https://relaydrop.ooos.top/