V2Ray 訂閱格式詳解:base64 編碼、原生 JSON 與分享連結如何互相轉換

解析三種常見訂閱格式及適用用戶端:base64 聚合訂閱、原生 JSON 設定與單一分享連結,說明欄位意義、相容範圍與轉換方式,協助找出訂閱匯入失敗的原因。

本文速覽

本文適合正在排查訂閱匯入失敗、需要遷移節點或想了解設定結構的使用者。判斷順序是先識別回應內容,再區分節點分享資訊與完整執行設定,最後依欄位能力進行轉換;讀完即可判斷一段文字屬於 base64 聚合訂閱、原生 JSON,還是 VMess、VLESS、Trojan、Shadowsocks 分享連結。

先判斷取得的是哪種格式

「訂閱」不是單一檔案規範,而是一種發布方式。用戶端存取訂閱網址後,伺服器可能回傳經過 base64 編碼的多行分享連結,也可能直接回傳逐行文字、JSON 節點清單,甚至是針對特定用戶端定義的設定物件。網址以 https:// 開頭只能說明傳輸方式,無法表示回應本文的結構。

單一分享連結描述一個出站節點,常見前綴包括 vmess://vless://trojan://ss://。通常包含伺服器位址、連接埠、驗證資訊、傳輸方式與 TLS 參數。聚合訂閱則將多個分享連結放在同一份回應中,用戶端更新時會重新下載並覆寫對應的訂閱群組。

原生 JSON 設定的範圍更廣。它可以同時包含 inboundsoutboundsroutingdnslog,因此不只描述遠端節點,也能指定本機監聽連接埠、路由規則與 DNS 行為。將完整 JSON 當作一般訂閱匯入,用戶端不一定會接受。

3 類
聚合訂閱、原生 JSON、分享連結
4 個前綴
VMess、VLESS、Trojan、Shadowsocks
36 個字元
含連字號的標準 UUID 長度
10808
常見本機 SOCKS 監聽連接埠
觀察到的內容 較可能的格式 適合的匯入入口
長串字母、數字,結尾可能有一或兩個等號 base64 聚合訂閱 訂閱群組或訂閱設定
以大括號開頭,包含 inbounds、outbounds 原生 JSON 設定 自訂設定或核心設定入口
以 vmess://、vless:// 等前綴開頭 單一分享連結 從剪貼簿匯入或掃描 QR Code
多行內容,每行都是協定前綴 未整體編碼的聚合清單 取決於用戶端的訂閱解析能力

結論:先看本文,不要根據網址副檔名猜格式

訂閱網址即使以 .json 結尾,也可能回傳 base64 文字;沒有檔案副檔名的介面也可能回傳 JSON。排查時應查看實際回應的前幾十個字元、HTTP 狀態與回應類型,再決定使用哪個匯入入口。

如何拆解 base64 聚合訂閱

最常見的傳統訂閱結構,是先用換行字元連接多個分享連結,再將整段文字進行一次 base64 編碼。base64 只是字元編碼,不負責加密,也不會驗證欄位是否正確。成功解碼只代表字元層面可以還原,不表示其中每個節點都能被目前的核心識別。

標準 base64 字元表包含大小寫英文字母、數字、加號與斜線,結尾可能使用等號補齊。部分服務採用 URL-safe 變體,將加號替換為減號、斜線替換為底線,並省略結尾補位。若用戶端只接受標準字元表,就可能出現「訂閱內容為空」或「格式無效」。

編碼前的聚合內容示意:

vmess://eyJ2IjoiMiIsInBzIjoiV00tMDEiLCJhZGQiOiJleGFtcGxlLmNvbSJ9
vless://[email protected]:443?encryption=none&security=tls&type=ws&path=%2Fedge#VL-01
trojan://[email protected]:443?security=tls&sni=example.com#TR-01

處理順序:
HTTP 回應本文 → 移除前後空白 → 整體 base64 解碼 → 依換行拆分 → 逐一解析協定連結

VMess 分享連結本身也經常採用「前綴加 base64 JSON」的結構,因此聚合訂閱可能形成兩層編碼:外層用來包裝節點清單,內層則屬於 VMess 分享格式。外層解碼後應停在逐行連結階段,再將每條 vmess:// 後面的內容個別解碼。VLESS 與 Trojan 通常採用 URI 查詢參數,不需要再將整條連結進行 base64 解碼。

為什麼原生 JSON 不能等同於節點清單

原生 V2Ray 或 Xray JSON 是核心執行設定。它描述資料從哪個本機入口進入、符合哪些路由規則、交給哪個出站連線,以及網域如何解析。一個出站節點只是 outbounds 陣列中的一項;完整設定還可能包含 directblock 等多個出站標籤。

以下縮減範例展示結構層級。監聽於 127.0.0.1:10808 的 SOCKS 入站接收本機流量,名為 proxy 的 VLESS 出站連線至遠端 443 連接埠。實際使用時,傳輸層、TLS 或 REALITY 參數還會放在 streamSettings 中。

{
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "example.com",
            "port": 443,
            "users": [
              {
                "id": "11111111-1111-4111-8111-111111111111",
                "encryption": "none"
              }
            ]
          }
        ]
      }
    }
  ]
}

分享連結或訂閱

推薦

由用戶端產生本機入站、記錄檔與基本路由,節點只提供遠端連線欄位,遷移成本較低。

適合:在 v2rayN、v2rayNG、v2flyNG 中管理日常節點

原生 JSON

可以完整控制入站、出站、DNS、路由與策略,但不同核心支援的欄位集合可能不同。

適合:需要自訂路由鏈路或精確控制核心行為

用戶端備份

除了節點外,還可能儲存訂閱群組、介面選項與本機資料庫資訊,通常只適合在相同用戶端中還原。

適合:在相同用戶端版本之間遷移設定

從 JSON 擷取分享連結時,不能只複製 addressportid。還要讀取 streamSettings.networksecurity、WebSocket 路徑、HTTP Host、gRPC serviceName、TLS serverName,以及 REALITY 的 publicKey、shortId 和 fingerprint。遺漏其中任何關鍵欄位,都可能得到語法正確但握手失敗的連結。

反向轉換也會遺失資訊。單一分享連結通常無法完整承載複雜的 routing.rules、DNS hosts 對應、多個入站連接埠、負載平衡器或鏈式代理。匯入分享連結後,用戶端會依自身範本重新產生這些本機部分,而不是還原原始 JSON 的全部行為。

結論:轉換時以遠端出站為界線

需要在不同用戶端之間遷移節點時,只轉換伺服器出站所需欄位;需要保留 DNS、路由分流與多個入站時,應遷移原生 JSON,並確認目標核心支援其中每個設定段。

VMess、VLESS 與其他分享連結的欄位差異

VMess 常見分享格式會將 JSON 物件編碼後接在 vmess:// 後方。常見欄位包括版本 v、備註 ps、位址 add、連接埠 port、使用者識別碼 id、額外 ID aid、加密方式 scy、傳輸網路 net、偽裝類型 type、Host、路徑、TLS、SNI、ALPN 與指紋。此格式由用戶端生態長期擴充,部分新增欄位在舊版用戶端中可能會被忽略。

VLESS 更接近標準 URI:使用者資訊位置放 UUID,主機與連接埠放伺服器位址,查詢參數描述傳輸與安全層,井號後的片段則是節點備註。VLESS 的 encryption 通常為 none;這不是 TLS 開關,TLS、REALITY 等安全方式由 security 參數表示。

分享欄位 意義 常見錯誤
address / add 遠端伺服器網域或 IP 複製時混入協定前綴或路徑
port 遠端監聽連接埠,例如 443 誤填成本機 10808 連接埠
id VMess 或 VLESS 使用者 UUID 缺少字元、含空格或使用錯誤使用者
type 傳輸類型,例如 tcp、ws、grpc 與伺服器傳輸設定不一致
security 傳輸安全方式,例如 tls、reality、none 與協定本身的加密欄位混淆
sni / serverName TLS 握手使用的伺服器名稱 填入 IP 或遺漏伺服器要求的網域
path WebSocket HTTP 路徑 斜線或百分比解碼層級錯誤
flow VLESS 流控方式,例如 xtls-rprx-vision 將一般 TLS 節點誤設為 Vision
pbk / sid REALITY 公鑰與 shortId 將伺服器私有參數寫入用戶端欄位
VLESS 連結結構示意:

vless://UUID@伺服器:連接埠
?encryption=none
&security=reality
&type=tcp
&sni=握手網域
&fp=chrome
&pbk=REALITY公鑰
&sid=shortId
&flow=xtls-rprx-vision
#節點備註

Trojan 連結會將密碼放在使用者資訊位置,後方同樣可以攜帶 securitysnitypepath 等查詢參數。Shadowsocks 分享連結則主要表達加密方法、密碼、位址與連接埠,擴充傳輸參數的相容程度取決於具體格式。若轉換工具只識別基本欄位,可能保留節點驗證資訊,卻遺失外掛程式或傳輸設定。

URI 中的節點備註、路徑與 Host 可能經過百分比編碼。例如空格可表示為 %20,斜線在查詢參數中可能表示為 %2F。正確的處理方式是依 URI 規則解析各個組成部分,而不是對整條連結反覆執行字串替換。過早解碼井號、問號或連接符號,可能改變欄位邊界。

三種格式互相轉換的穩妥流程

轉換的首要目標是保留連線所需欄位,而不是追求文字外觀一致。先確認來源格式,再建立統一的節點資料模型,至少記錄協定、位址、連接埠、驗證資訊、傳輸、安全層與備註。最後由目標用戶端或產生器依目標格式輸出。

  1. 識別來源內容

    查看回應開頭、協定前綴與 JSON 頂層鍵。若是訂閱網址,先確認 HTTP 狀態為 200,並判斷回應是否需要整體 base64 解碼。

  2. 拆分節點

    將聚合訂閱依 LF 或 CRLF 分行並篩除空行;每條連結依協定前綴選擇對應解析器,不要將 VLESS 參數套用到 VMess。

  3. 統一欄位

    統一儲存伺服器、連接埠、使用者識別碼、傳輸類型、TLS 或 REALITY 參數,並分別保留 WebSocket path、gRPC serviceName 與 SNI。

  4. 核對核心

    在 v2rayN 中檢查「設定」→「參數設定」→「Core 類型」,確認所選核心支援節點使用的協定、REALITY 或 XTLS Vision 欄位。

  5. 匯入並測試

    先只匯入一個節點,查看核心記錄是否出現 unknown field、failed to find an available destination 或 TLS handshake 等訊息,再進行批次轉換。

在 v2rayN 中,訂閱通常放入訂閱群組,再執行更新所有訂閱;單一分享連結則更適合透過剪貼簿匯入。若需要載入完整 JSON,應使用用戶端提供的自訂設定功能,而不是將 JSON 檔案網址直接放入一般訂閱網址欄位。匯入後還需選擇作用中的伺服器,並啟用系統代理或所需的 TUN 模式。

在 v2rayNG 與 v2flyNG 中,訂閱設定負責儲存遠端位址與更新結果,剪貼簿匯入則負責處理單一分享連結。v2rayNG 使用 Xray 核心,v2flyNG 使用 v2fly 核心;兩者對常見 VMess、VLESS、Trojan、Shadowsocks 的支援範圍,以及對較新傳輸欄位的接受程度並不完全相同。遷移後應進入節點詳細資料逐項核對,而不是只看節點名稱是否出現。

結論:先轉換一個節點,再處理整份訂閱

用單一節點完成匯入、啟動核心與實際連線三項驗證,可以快速找出欄位對應問題。若直接轉換數十個節點,節點重名、部分協定不相容與記錄交錯都會增加排查成本。

訂閱匯入後為空的排查順序

匯入後清單為空,不代表訂閱中沒有節點。問題可能發生在網路請求、回應解碼、逐行識別、協定相容性或群組顯示的任一階段。有效的排查應從最前面的環節開始,避免反覆刪除用戶端設定。

先確認訂閱請求確實回傳本文,而不是登入頁面、流量限制提示或 HTML 錯誤頁。一個頁面即使回傳 200,也可能因存取權杖失效而輸出提示文字。回應若以 <html<!doctype 開頭,base64 解碼與協定解析自然不會產生節點。

訂閱更新提示逾時怎麼辦?

先確認裝置可以存取訂閱網域。若直接連線路徑不可用,可先連線至一個現有的可用節點,再到訂閱設定中啟用透過代理更新;同時檢查系統時間與訂閱網址是否完整複製。

更新成功但節點清單為空?

查看更新記錄中的新增數量,並檢查回應解碼後是否出現 vmess://vless:// 等前綴。若只看到 JSON,確認它是節點陣列,還是包含 inbounds、outbounds 的完整核心設定。

只有部分節點被匯入?

依未匯入節點的協定與傳輸類型分類,重點檢查 URL-safe base64、REALITY 參數、gRPC serviceName 以及備註中的特殊字元。舊版用戶端可能會略過無法識別的欄位或整筆記錄。

節點存在但啟動核心失敗?

在 v2rayN 開啟「設定」→「參數設定」→「Core 類型」核對核心,再查看核心記錄中的第一個錯誤。若連接埠被占用,檢查本機 10808 等監聽連接埠;若是欄位錯誤,回到節點編輯頁核對傳輸與安全層。

更新後手動修改被覆寫?

訂閱節點通常由遠端內容管理,再次更新可能覆寫本機欄位。需要長期保留修改時,請將節點複製到獨立群組,或直接修正來源訂閱中的對應參數,不要只修改訂閱群組中的暫存副本。

如果訂閱可以解碼、分享連結也能單獨匯入,但批次更新仍然為空,常見原因是回應格式與用戶端訂閱解析器的預期不同。例如伺服器直接回傳 JSON 陣列,而用戶端只依 base64 多行連結處理。此時應調整訂閱輸出格式,或選擇明確支援該 JSON 結構的匯入方式。

如果節點可以匯入但連線失敗,應停止繼續研究 base64。此時編碼階段已經完成,問題更可能出在位址、連接埠、UUID、密碼、SNI、WebSocket path、gRPC serviceName、REALITY publicKey、shortId 或 flow。依核心記錄中的第一個握手錯誤逐項核對,比重複更新訂閱更有效。

格式選擇與長期維護建議

日常在 v2rayN、v2rayNG 或 v2flyNG 中維護多個節點時,訂閱搭配分享連結更方便更新。用戶端負責產生本機入站、系統代理與基本路由,訂閱來源只維護遠端節點。需要調整某個節點時,應優先修正訂閱來源,避免下次更新覆寫本機修改。

需要複雜 DNS、依網域或 IP 路由、多個入站連接埠或鏈式出站時,原生 JSON 更合適。這類設定應記錄目標核心及支援版本,並在切換 Core 類型後重新檢查欄位。Xray 與 v2fly 的設定結構有許多相同部分,但 REALITY、XTLS Vision 與部分擴充能力不能只憑欄位名稱推斷相容性。

使用目的 建議格式 維護重點
定期更新多個節點 聚合訂閱 群組、更新時間、回應格式
臨時傳送一個節點 分享連結 協定欄位、URI 編碼、備註
精確控制路由與 DNS 原生 JSON 核心相容性、設定層級、出站標籤
跨用戶端遷移 標準分享欄位 先驗證單一節點,再批次產生

儲存設定時也應區分「節點資料」與「用戶端狀態」。節點資料包括位址、連接埠、驗證資訊與傳輸參數;用戶端狀態包括目前選取的節點、訂閱群組、系統代理模式、TUN 設定與路由規則。只匯出分享連結不會帶走後者,這是格式的界線,並非匯出失敗。

最後可以用一條簡單規則選擇:需要自動更新一組節點,就使用訂閱;需要傳遞一個節點,就使用分享連結;需要重現完整核心執行行為,就使用原生 JSON。發生轉換時,先列出目標格式無法表達的欄位,再決定接受遺失、改由用戶端重建,或保留原始設定。

前往用戶端安裝套件 Windows、macOS、Android、Linux