今天,星连VPN 背后的团队 SingLinkLabs 在 GitHub 上以 Apache-2.0 许可证公开了 SingLink 开源协议 的完整源代码。从现在起,任何人都可以阅读协议规范、运行代码、检查它的安全性,并在此基础上继续开发。

启动星连VPN开源计划时我们说过,VPN 协议和 VPN 客户端会分阶段公开。今天就是这一步。与协议同时公开的,还有基于它开发的星连VPN App 初代原型,详见星连VPN App 初代原型正式开源。

代码仓库:SingLinkLabs / singlink-protocol · 版本:1.0.0-draft(协议标识 SingLink/1,规范第 2 稿) · 许可证:Apache-2.0 · 语言:Go,只用标准库

这次公开了什么

  • 协议规范。SPEC.md 逐字节说明了数据格式,任何人都可以据此独立实现。

  • Go 语言协议库。只使用 Go 标准库中的密码学实现,没有第三方依赖。

  • 命令行工具:生成密钥、签发通行证、生成连接链接、运行节点和客户端,并能在一台电脑上跑完整演示。

  • 给 App 用的本地代理(SOCKS5 与 HTTP)和 C 语言接口(libsinglink),让各个平台的 App 都能直接内嵌协议。

  • 部署示例:节点配置范例和加固过的 systemd 服务文件。

  • 内部安全审查报告,列出每一项发现和修复:SECURITY-AUDIT.md。

星连VPN 官方 App 使用的是我们的正式协议,包括 SingLink 2.0。SingLink 2.0 的核心源代码不在这次公开范围内,仍然保持闭源。

今天公开的 SingLink 协议(需要和 SingLink 2.0 区分时,我们称它为“SingLink 开源协议”)是 SingLinkLabs 为开放开发而从零设计的另一套协议,官方 App 目前并没有使用它。对现有用户来说一切照旧:App、账号和连接都不受影响。

为什么要开源

  • 安全说法应该可以被检验。抗量子密钥交换、设备绑定、抗主动探测,说起来都很容易;代码和规范公开后,任何人都能亲自验证。

  • 看的人越多,问题发现得越早。外部研究人员和工程师能看到内部团队容易忽略的问题。

  • 其他人可以在它之上开发。开发者可以测试它、把它嵌入自己的项目,并提出改进建议。

  • 兑现开源计划的承诺。公开 VPN 协议本来就是计划中承诺的阶段之一。

用白话说它怎么运作

一句话概括:从外面看,用户只是在浏览一个普通的 HTTPS 网站;里面藏着一份加密的访问请求,服务器只为持有有效通行证的人转发流量。

整个设计用到三把钥匙,可以把它想成一栋办公大楼的门禁:

  • 节点密钥,相当于大楼的门锁。每台服务器各有一把。只有这台服务器能打开用户的请求,这也同时证明用户连到的是真的服务器。

  • 签发密钥,相当于人事部的公章。它保存在账号后台,用来在每张通行证上盖章,写明套餐、到期时间、限速和设备数上限。

  • 设备密钥,相当于用户的指纹。它留在用户的手机或电脑上,每次连接都会“按一次指纹”,证明正在使用通行证的是它真正的主人。

服务器只需要认得公章的样子,就能自己核对通行证。所以节点上没有用户数据库,也不保存任何用户数据。

一次连接的过程

  1. App 先建立一条看起来和打开普通网站一模一样的 HTTPS 连接。

  2. 第一个数据包里带着:这次连接专用的一次性密钥、一段抗量子密文,以及一个封好的区块,里面是目的地址、通行证、最多前 8 KB 的真实数据,还有设备对整个请求的签名。不需要额外的往返。

  3. 服务器逐项检查:能否解开请求、公章是否真实、设备签名是否吻合、时间是否正确、是否为重放、是否已过期或被吊销。

  4. 全部通过才会回应并开始转发。只要有一项不通过,连接就会被原封不动地交给一个真实网站。来探测服务器的人只会看到一个普通网站,连响应时间都没有差别。

  5. 双方把各自的一次性密钥组合成这次连接的会话密钥。数据分块加密,前几块会加入随机填充,使用到一定量后会自动更换密钥。

安全特性

  • 两层加密。外层是 HTTPS,内层是协议自己的 AES-256-GCM 加密,即使经过会解开 HTTPS 的 CDN,对方也看不到内容。

  • 抗量子保护。密钥交换同时使用传统的 X25519 和 ML-KEM-768(FIPS 203),攻击者必须两者都破解才行。

  • 前向保密。每次连接都使用一次性密钥,即使服务器日后被攻破,过去的流量也无法解密。第一个数据包除外(见下方限制)。

  • 设备绑定。通行证就算被复制,没有当初签发时绑定的设备密钥也无法使用。

  • 防重放。截获数据包后重新发送不会成功,服务器重启后也一样。

  • 抗主动探测。过期、被吊销、重放或伪造的请求一律同样处理:交给真实网站。

  • 集中管控。账号或设备被停用后,它在所有服务器上的现有连接会在约 10 秒内被关闭。

  • 加固的服务器。限制单台服务器和单个 IP 的连接数,为握手设定 CPU 预算,并完整屏蔽私有及特殊用途地址。

设计参考了哪些协议

SingLink 开源协议借鉴了许多成熟设计:单次请求即带数据的做法来自 VLESS 与 Trojan,验证失败转交真实网站来自 Trojan 与 obfs4,握手模型参考 Noise NK,密钥派生与 0-RTT 处理参考 TLS 1.3,混合抗量子密钥交换参考 X-Wing 标准草案,分块加密参考 Shadowsocks AEAD,签名通行证参考 JWT 与 PASETO,设备绑定令牌参考 OAuth DPoP,另外还有 HAProxy PROXY 协议,以及 WireGuard 的防重放与负载保护。

这些都只是设计思路的参考。所有代码都是从零编写的,没有包含任何来自 Xray、V2Ray、sing-box 或 WireGuard 的代码。

目前状态与已知限制

  • 它还是草案。版本为 1.0.0-draft,数据格式仍可能调整。

  • 目前只做过内部安全审查。两位审查人员分别检查了密码学设计和程序实现,共记录 31 项发现:高风险 2 项、中风险 14 项,其余为低风险或提示。没有任何一项能破解用户流量的保密性或身份验证。所有高、中风险问题都已修复或缓解,每一项都有对应的回归测试,所有解析器也都做了模糊测试。

  • 还没有第三方审计。在完成独立审计之前,我们建议不要把它用于高风险场景;正式称为稳定版之前,我们计划先完成第三方审计。

  • 第一个数据包没有前向保密。它由服务器的长期密钥保护,所以服务器密钥应该定期更换,协议已支持密钥轮换。

  • 尚未在中国大陆实地测试。它的 TLS 指纹和第一个数据包的大小目前仍可被识别。中国大陆用户使用的星连VPN 官方 App,会继续使用我们现有的正式协议。

  • 服务器需要自己的域名、浏览器认可的证书,以及背后一个真实的网站。

动手试试,一起参与

安装 Go 1.24 或更新版本后,make test 运行测试,make cli 编译命令行工具,singlink demo 会在一台电脑上同时启动本地服务器和客户端。如何运行服务器,请看代码仓库里的 README。

欢迎在 GitHub 上提问、报告问题和提交 Pull Request。发现安全漏洞时,请私下报告,不要公开发 Issue,流程见 SECURITY.md。

许可证与商标

代码采用 Apache-2.0 许可证:在遵守许可证条款的前提下,你可以使用、修改和再发布,包括商业用途。“SingLink”“SingLinkVPN”名称和标志是 SingLinkLabs 的商标,除说明作品来源外,许可证并不授权使用这些名称。修改版和分支应使用自己的名称与图标发布。

延伸阅读