Clash 訂閱格式比較:YAML 設定、Base64 訂閱與 URI 連結轉換教學

比較三種常見訂閱格式的結構與適用用戶端,說明欄位對應、轉換時可能遺失的資訊,以及自架轉換服務的注意事項。

先辨識內容,再選擇匯入方式

優先使用服務提供者明確標示的 Clash 或 mihomo 訂閱入口。若取得的是完整 YAML 設定,通常可直接加入用戶端的設定檔清單;若是 Base64 文字或一組協定 URI,請先確認用戶端是否支援匯入這些格式。不要只改副檔名,也別把「訂閱下載成功」當成「核心已接受設定」。

先釐清兩個容易混淆的項目:訂閱網址是取得內容的入口,訂閱格式則是入口實際傳回的資料結構。同一個 HTTPS 網址可能依查詢參數或要求標頭傳回不同內容。網址以 .yaml 結尾,不代表回應一定是 YAML;沒有副檔名也不影響它傳回完整設定。

格式常見內容特徵通常包含的資訊匯入前檢查
Clash YAML出現 proxies、proxy-groups、rules 等鍵節點、策略群組、規則,也可能包含 DNS 與連接埠設定分辨完整設定與節點片段
Base64 訂閱一長串編碼文字,解碼後通常是多行 URI視原始內容而定;常見情況只包含節點資訊先解碼,再辨識內部格式
URI 連結以 ss://、vmess://、trojan:// 等開頭單一節點的協定、位址、驗證資訊與傳輸參數確認匯入工具支援相應協定與參數

YAML 設定:分辨完整設定與節點清單

先查看頂層欄位。YAML 只是資料表示格式,並非 Clash 專用格式。能由 YAML 解析器讀取,不代表符合 Clash 設定結構;符合某個核心的結構,也不代表其他核心支援其中所有協定與選項。

辨識三種常見的 YAML 內容

  • 完整設定:通常會同時包含 proxies、proxy-groups、rules,也可能設定監聽連接埠、DNS、TUN 等項目。
  • 節點集合:只包含 proxies。可供相容的代理集合提供者使用,但不能因此推斷策略群組與分流規則已設定完成。
  • 規則集合:常見的頂層欄位是 payload。這類內容供 rule-providers 引用,不是節點訂閱,也不能當作代理清單匯入。

以下設定僅用來說明結構。edge.example.com 和 demo-password 都是示範值,無法用於實際連線。範例將本機混合連接埠設為 7890,僅監聽迴路位址,並以手動選擇群組承接所有符合條件的流量。

mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule

proxies:
  - name: DemoTLS
    type: trojan
    server: edge.example.com
    port: 443
    password: "demo-password"
    sni: edge.example.com
    udp: true

proxy-groups:
  - name: Manual
    type: select
    proxies:
      - DemoTLS
      - DIRECT

rules:
  - MATCH,Manual

此處的 443 是遠端代理伺服器的連接埠,7890 則是本機應用程式連線到用戶端代理服務的連接埠,兩者不可互換。將 YAML 轉成節點 URI 時,必須保留遠端連接埠;本機監聽連接埠、策略群組與預設規則通常不會出現在節點連結中。

選擇與實際核心相容的設定

先在用戶端的「關於」或核心資訊頁面確認核心名稱,再查看該核心支援的協定。介面支援貼上連結,不代表執行中的核心支援連結使用的協定。Clash Meta 延續發展的 mihomo 與較早期的 Clash 核心,在協定與欄位支援方面有所不同,不能只憑檔名決定轉換目標。

Base64 訂閱:解碼不等於轉換

先在本機解碼並查看結果。Base64 是編碼方式,不是代理協定,也不是加密機制。常見訂閱會將多條節點 URI 逐行排列,再把整段文字編碼;也有服務會編碼其他資料結構,因此不能預設解碼後就能直接匯入 Clash。

留意兩層編碼:訂閱外層可能使用 Base64,內部的某條 vmess:// 連結也可能將 JSON 編碼成 Base64;部分 ss:// 連結也會編碼驗證資訊。正確順序是先還原訂閱外層,再交由能解析該協定的工具處理單一連結,而不是反覆解碼每一段字串。

使用 Python 在本機檢查編碼內容

將收到的編碼內容存成 subscription.txt,再使用 Python 3 執行以下程式碼。此腳本支援常見的 Base64 與 URL 安全字元集,會忽略空白並補齊末尾填充;輸出會寫入 decoded.txt,不會主動連線至網路。若輸入實際上是 YAML、網頁或一般 URI,應先依其實際格式處理。

from pathlib import Path
import base64
import binascii

source = Path("subscription.txt").read_text(encoding="utf-8")
compact = "".join(source.split())
compact += "=" * (-len(compact) % 4)

try:
    raw = base64.b64decode(compact, altchars=b"-_", validate=True)
    text = raw.decode("utf-8")
except (ValueError, binascii.Error, UnicodeDecodeError) as exc:
    raise SystemExit("無法將內容解碼為 Base64 UTF-8 文字,請檢查原始資料。") from exc

Path("decoded.txt").write_text(text, encoding="utf-8")
print("已寫入 decoded.txt;請在本機查看內容類型。")
  • 若看到逐行排列的 ss://、trojan:// 等內容:進入 URI 與設定欄位的對應步驟。
  • 若看到 proxies::先確認內容是否已是 YAML,不要再執行一次「節點轉換」。
  • 若看到 HTML 登入頁、錯誤提示或 JSON 錯誤物件:先排除訂閱請求問題,轉換器無法補出不存在的節點資料。

反過來說,將多行 URI 編碼成 Base64,只是重新包裝同一組連結。它不會自動產生 rules 或 proxy-groups,也無法補上遺漏的 TLS、WebSocket 或驗證參數。

URI 轉 YAML:逐項對應連線參數

先用一個節點核對欄位,再進行批次轉換。以下的 Trojan URI 對應前面的 YAML 節點。連結中的片段 #DemoTLS 是顯示名稱,不是驗證資訊;查詢參數 sni 用來指定 TLS 伺服器名稱。

trojan://[email protected]:443?sni=edge.example.com#DemoTLS
URI 部分YAML 欄位處理要點
trojan://type: trojan依協定對應,不要改成其他代理類型
demo-passwordpassword依 URI 規則還原百分比編碼
edge.example.comserver保留連線位址,不要用備註取代
443port填入連接埠數值,不要填本機代理連接埠
sni=edge.example.comsni與 server 分開儲存,兩者可能不同
#DemoTLSname還原名稱後,檢查是否重複及群組引用

這條 URI 沒有明確包含前述範例中的 udp: true,因此不能宣稱還原後可逐字重現原設定。轉換器可能使用自己的預設值;正式使用前,應依服務能力與目標核心的要求,明確確認 UDP 設定。

分別處理協定與傳輸層

  • Shadowsocks:保留加密方式、密碼、伺服器與連接埠;若連結包含外掛程式,也要檢查外掛程式名稱與選項。只儲存主機與密碼可能無法建立連線。
  • VMess:常見分享連結內含編碼後的 JSON,需要解析 UUID、連接埠、傳輸類型、TLS 等欄位;不能把整段解碼結果當成 YAML。
  • VLESS 與其他協定:先確認目標核心與轉換器都支援,再核對 flow、TLS、Reality 等協定相關參數,不要只因欄位名稱相近就直接替換。
  • WebSocket 或 gRPC:也要保留路徑、Host 要求標頭或服務名稱等參數。即使代理協定相同,傳輸設定不同也可能完全無法連線。

不要用「依冒號切割字串」的方式手寫通用解析器。IPv6 位址本身就含有冒號,密碼可能含有跳脫字元,節點名稱也可能包含中文。應使用 URI 解析工具,並依各協定規範處理編碼,避免重複解碼而改動密碼中的字面內容。

YAML 轉 URI:釐清哪些資訊會遺失

URI 只適合作為單一節點的交換格式。完整 YAML 涵蓋的內容更廣,匯出節點連結通常無法攜帶整套執行環境。若要更換用戶端並保留分流邏輯,應優先遷移相容的完整設定,而非先匯出 URI 再重新匯入。

檢查四類無法完整隨節點遷移的設定

  1. 策略群組:select、url-test、fallback 的群組成員、探測網址與切換邏輯,通常不屬於節點 URI。
  2. 分流規則:DOMAIN-SUFFIX、GEOIP、MATCH 與規則提供者引用,不會因為匯出節點而自動保留。
  3. 本機環境:監聽連接埠、系統代理、TUN、DNS、外部控制介面等設定,都需要在新設定或新用戶端中另行安排。
  4. 擴充參數:特殊傳輸、憑證處理、多工及核心擴充欄位可能沒有通用的 URI 表示方式,或只有部分匯入工具能辨識。

即使兩端都支援相同協定,分享連結的參數名稱也可能因實作而異。轉換後應逐項比對伺服器、連接埠、驗證資訊、TLS 名稱與傳輸設定。不要為了成功匯入就刪除無法辨識的參數,更不要把略過憑證驗證當成通用修復方式。

自架轉換:限制入口並固定輸出範本

優先在本機執行,或部署於僅自己能存取的環境。自架轉換的重點不只在產生 YAML,還包括保護來源訂閱憑證、限制遠端擷取範圍,以及固定可供檢查的轉換範本。

  1. 選擇實作:確認轉換器明確支援來源協定、目標核心與所需擴充欄位。記錄部署版本與範本修訂,更新前保留一份可正常運作的輸出。
  2. 限制監聽:本機服務可只監聽 127.0.0.1。例如使用本機連接埠 25500 時,不要直接將該連接埠開放至公網;實際連接埠請以所選實作的設定為準。
  3. 固定範本:審核範本中的策略群組、規則與遠端資源網址。轉換時只替換節點,不要讓來源不明的範本順帶變更 DNS、控制介面或流量出口。
  4. 處理遠端 URL:為來源訂閱與遠端範本設定允許清單,限制重新導向、回應大小與請求逾時,避免服務被用來存取內網或雲端執行個體的中繼資料網址。
  5. 控管記錄:避免記錄完整查詢字串、驗證標頭與訂閱內容。需要分享記錄時,先遮蔽權杖,並定期清除產生的檔案與快取。

透過 URL 參數傳遞來源訂閱時,應將完整來源網址正確進行一次百分比編碼。例如來源網址本身帶有 ?token= 和 &type=,未編碼就嵌入另一個 URL,參數可能會被外層請求截斷。優先使用轉換器文件支援的本機檔案或要求本文入口,減少憑證出現在瀏覽器歷史記錄與存取記錄中的機會。

也要區分靜態轉換與持續訂閱:下載並產生檔案一次,只會取得當下的快照。若要自動更新,必須保留可靠的更新入口,或在設定中使用核心支援的代理集合機制。遠端更新是否會覆蓋本機修改,取決於用戶端的合併與覆寫方式,不能只看「已開啟自動更新」的開關。

轉換後驗證:依序檢查結構、連線與分流

先檢查設定,再切換目前使用的設定。保留原本可用的訂閱,避免批次轉換後失去比對依據。使用 mihomo 時,可對產生的檔案執行設定測試;以下命令中的檔名是本機儲存的輸出檔案。

mihomo -t -f ./converted.yaml

測試通過表示設定符合該核心的檢查要求,不代表遠端節點可用。引用遠端資源的設定也可能受本機檔案、網路連線與執行目錄影響,測試環境應盡量與正式執行環境一致。

狀況優先檢查項目後續處理
訂閱下載成功,卻沒有節點回應是否為網頁、錯誤物件或不支援的編碼在本機查看回應內容,確認格式後再匯入
顯示未知的代理類型核心是否支援該協定確認核心支援能力與轉換目標,別只改副檔名
看得到節點,但連線失敗密碼、SNI、傳輸路徑與服務名稱逐項比對原始節點,先測試單一節點
連線正常,但分流方式改變策略群組、規則順序與 MATCH 目標查看連線記錄中的命中規則與實際策略
更新後本機規則消失本機修改是否直接寫入遠端設定副本使用用戶端支援的覆寫或獨立設定方式

完成基本驗證

  • 確認轉換前後的節點數量與名稱,檢查是否有過濾、重新命名或解析失敗。
  • 只選擇一個已知可用的節點,確認 TLS 與傳輸參數完整後,再擴大至整份清單。
  • 若沿用範例的 7890 混合連接埠,請先確認監聽成功,再讓應用程式連線至該連接埠。
  • 分別檢查一般網頁瀏覽、DNS 解析與需要 UDP 的應用程式;一次網頁瀏覽成功,無法涵蓋所有使用情境。

最後保留一份轉換紀錄:來源格式、目標核心、轉換器與範本版本,以及手動補上的欄位。日後訂閱更新失效時,就能判斷問題出在來源資料、解析過程或本機執行設定,不必反覆嘗試不同的線上轉換入口。

下載最新版 Clash