今天,星連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。
SingLink 2.0 與 SingLink 開源協議是兩套不同的協議
星連VPN 官方 App 使用的是我們的正式協議,包括 SingLink 2.0。SingLink 2.0 的核心原始碼不在這次公開範圍內,仍維持不公開。
今天公開的 SingLink 協議(需要和 SingLink 2.0 區分時,我們稱它為「SingLink 開源協議」)是 SingLinkLabs 為開放開發而從零設計的另一套協議,官方 App 目前並沒有使用它。對現有用戶來說一切照舊:App、帳號和連線都不受影響。
為什麼要開源
安全說法應該能被檢驗。抗量子金鑰交換、裝置綁定、抵抗主動探測,說起來都很容易;程式碼和規格公開後,任何人都能親自驗證。
看的人越多,問題越早被發現。外部研究人員和工程師會看到內部團隊容易忽略的問題。
其他人可以在它之上開發。開發者可以測試它、把它放進自己的專案,並提出改進建議。
兌現開源計畫的承諾。公開 VPN 協議本來就是計畫中承諾的階段之一。
用白話說它怎麼運作
一句話說明:從外面看,用戶只是在瀏覽一個普通的 HTTPS 網站;裡面藏著一份加密的存取請求,伺服器只替持有有效通行證的人轉送流量。
整個設計用到三把鑰匙,可以把它想成一棟辦公大樓的門禁:
節點金鑰,就像大樓的門鎖。每台伺服器各有一把。只有這台伺服器能打開用戶的請求,這也同時證明用戶連到的是真正的伺服器。
簽發金鑰,就像人資部門的印章。它保存在帳號後台,用來在每張通行證上蓋章,寫明方案、到期時間、限速和裝置數上限。
裝置金鑰,就像用戶的指紋。它留在用戶的手機或電腦上,每次連線都會「按一次指紋」,證明正在使用通行證的是它真正的主人。
伺服器只要認得印章的樣子,就能自己核對通行證。所以節點上沒有用戶資料庫,也不保存任何用戶資料。
一次連線的過程
App 先建立一條看起來和開啟普通網站一模一樣的 HTTPS 連線。
第一個封包裡帶著:這次連線專用的一次性金鑰、一段抗量子密文,以及一個封好的區塊,裡面有目的地、通行證、最多前 8 KB 的真實資料,還有裝置對整個請求的簽章。不需要額外的往返。
伺服器逐項檢查:能不能解開請求、印章是不是真的、裝置簽章是否相符、時間是否正確、是不是重送的封包、有沒有過期或被撤銷。
全部通過才會回應並開始轉送。只要有一項沒通過,連線就會被原封不動交給一個真實網站。來探測伺服器的人只會看到一個普通網站,連回應時間都沒有差別。
雙方把各自的一次性金鑰組合成這次連線的工作階段金鑰。資料分段加密,前幾段會加入隨機填充,使用到一定量後會自動更換金鑰。
安全特性
兩層加密。外層是 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 的商標,除了說明作品來源之外,授權並不允許使用這些名稱。修改版和分支應使用自己的名稱與圖示發布。
延伸閱讀
星連VPN App 初代原型正式開源,程式碼見 GitHub
SingLink 2.0 技術白皮書:官方 App 使用的正式協議
