進階設定 預計閱讀 13 分鐘

Clash 設定檔 YAML 結構解析:從基本欄位到 proxy-groups 與 rules

逐段解析完整的 config.yaml,說明頂層欄位、dns、proxies、proxy-groups、rule-providers 與 rules 的用途及排列方式。

先釐清 YAML 檔案、訂閱與核心設定的差異

config.yaml 是常見的設定檔名稱,副檔名也可以是 .yml。YAML 用來表示鍵值、清單與階層;Clash 或 mihomo 則負責解讀這些欄位。檔案能通過 YAML 解析,不代表目前使用的核心支援其中的節點協定、DNS 參數和規則類型。

Clash Meta 後續以 mihomo 之名維護。不同用戶端封裝的核心與設定入口不盡相同。本文主要說明 mihomo 設定結構,其中內嵌規則集等功能不能直接套用於舊版 Clash 核心。排查相容性時,請先到用戶端的「關於」或核心資訊頁面確認實際執行的核心,而不只是看用戶端名稱。

  • 完整設定訂閱:可能同時包含連接埠、DNS、節點、策略組與規則,更新後這些內容也可能變動。
  • 節點提供者:透過 proxy-providers 提供節點,再由本機策略組引用,並不等同於完整設定檔。
  • 用戶端覆寫:在訂閱內容之外合併或取代欄位,實際合併順序由用戶端決定。

可供檢查結構的完整 config.yaml

以下設定僅提供本機混合連接埠與直連策略,不包含代理伺服器。適合用來檢查欄位階層、策略引用與規則順序;成功載入不代表已具備代理出口。範例中的內嵌規則集需使用支援 type: inline 的 mihomo 核心。

# 基本入口
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false

# DNS 模組;未設定獨立 DNS 監聽連接埠
dns:
  enable: true
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - '*.lan'
    - 'localhost'
  nameserver:
    - 223.5.5.5
    - 1.1.1.1

# 目前未包含遠端代理節點
proxies: []

# 策略組名稱供 rules 引用
proxy-groups:
  - name: 出口選擇
    type: select
    proxies:
      - DIRECT

# 內嵌規則集,不需要額外的規則檔案
rule-providers:
  範例網域:
    type: inline
    behavior: domain
    payload:
      - '+.example.com'

# 由上往下比對,最後一條作為兜底
rules:
  - DOMAIN,localhost,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - RULE-SET,範例網域,出口選擇
  - MATCH,出口選擇

這份檔案沒有啟用系統代理或 TUN。手動將應用程式的 HTTP 代理設為 127.0.0.1:7890,才會將該應用程式的相關請求送進混合連接埠。連線進入核心後,規則會選擇「出口選擇」;該組目前只有 DIRECT,因此仍會直接連線至目標。

設定檔排列順序不等於執行順序

頂層欄位中,dns 寫在 proxies 前或後,通常不影響設定含義。依照「入口 → DNS → 節點 → 策略組 → 規則集 → 規則」排列,主要是為了方便檢查相依關係。真正會影響比對結果的是 rules 清單的順序。策略組內候選項目的順序也會影響介面上的排列,並非所有清單都能像字典一樣任意排序。

基本欄位:連接埠、運作模式與記錄

欄位範例值作用
mixed-port7890在同一個連接埠接收 HTTP 與 SOCKS 代理連線。
allow-lanfalse不允許其他區域網路裝置使用本機代理入口。
moderule依照規則清單決定連線使用的策略。
log-levelinfo輸出一般運作資訊;排查問題時可暫時切換為 debug。
ipv6false關閉核心中相應的 IPv6 支援;不會變更作業系統的網路設定。

mixed-port: 7890 不代表系統中的所有流量都會經過 Clash。系統代理只會影響遵循該設定的應用程式;自行連線的程式可能會繞過代理。TUN 則透過虛擬網卡與路由接管連線,兩者是不同的流量入口。

external-controller 是管理 API 的監聽位址,不是要填入瀏覽器的代理位址。例如,本機管理連接埠可設為 127.0.0.1:9090,但不能與混合連接埠同時占用同一位址上的 7890。用戶端可能會自行管理控制介面,手動覆寫前請先確認相關要求。

dns:解析模式、上游 DNS 與 Fake-IP 的關係

dns 是頂層映射,內部的 enable、nameserver 等欄位必須比 dns: 多縮排一層。範例中的 nameserver 設定了兩個上游 DNS 位址;填入兩個位址不代表一定會依序逐一嘗試,實際查詢方式取決於核心實作及其他 DNS 參數。

Fake-IP 不是代理節點位址

enhanced-mode: fake-ip 會讓核心為適用的網域查詢分配合成位址,再透過對應映射處理後續連線。範例位址池 198.18.0.1/16 不是遠端伺服器位址,也不應填入節點的 server 欄位。部分需要取得真實解析結果的區域網路應用程式,可依需求加入 fake-ip-filter。

  • dns.enable: true 會啟用核心的 DNS 模組,但不代表作業系統已將所有 DNS 要求交由它處理。
  • dns.listen 用來開放獨立的 DNS 監聽入口;範例未設定,以免額外占用連接埠。
  • dns.ipv6: false 控制核心 DNS 對 AAAA 查詢的處理方式,不能因此認定系統完全不會發起 IPv6 連線。
  • 加密 DNS 保護的是相應的解析連線,不會自動取代代理規則,也無法保證所有 DNS 要求都會經過代理出口。

若遇到「網域無法開啟,但直接連 IP 可以」的情況,請先檢查 DNS 查詢是否進入核心、上游 DNS 是否可連線,再查看 Fake-IP 映射與路由。此時反覆切換節點,可能無法解決真正的故障原因。

proxies 與 proxy-groups:分開設定節點與選擇邏輯

proxies 是節點清單。每個節點通常包含 name、type、server、port,以及該協定所需的驗證與傳輸參數。不同協定的欄位不能互換:例如,密碼欄位不能取代另一種協定要求的 UUID。實際值應以服務供應商提供的資訊或自架服務設定為準。

proxy-groups 不會定義遠端伺服器,而是用來設定如何選擇出口。組內的 proxies 雖然與頂層欄位同名,在此處卻只是候選名稱清單。名稱必須對應已定義的節點、其他可引用的策略組,或 DIRECT 等內建策略。

常見策略組類型

  • select:在用戶端手動選擇一個候選項目,適合明確指定節點或直連。
  • url-test:根據指定測試網址的探測結果自動選擇候選項目;測試延遲不代表所有網站的實際載入速度。
  • fallback:依候選項目順序與健康檢查結果選擇可用項目,適合主備切換。
  • load-balance:依照設定的分配策略處理連線,不代表會將單一下載連線分散到多個節點以累加頻寬。

範例使用 select,因此不需要探測 URL。若改用自動測試類策略組,還需提供適合目前網路環境的測試網址與檢查間隔,例如 interval: 300 代表 300 秒。不能只變更 type,卻漏掉該類型執行所需的參數。

訂閱節點放在 proxy-providers 時如何引用

使用節點提供者後,策略組通常透過 use 引用提供者名稱,而不是將訂閱 URL 填入組內的 proxies 清單。提供者回傳的內容也必須符合相應格式,一般完整設定訂閱不一定能直接作為節點提供者使用。請保持引用鏈清楚:規則指向策略組,策略組再選擇節點。

rule-providers 與 rules:規則集內容與比對入口

rule-providers 用來儲存可重複使用的規則集;rules 則決定何時引用規則集,以及比對成功後採用哪個策略。只定義名為「範例網域」的規則集,卻沒有寫入 RULE-SET,範例網域,出口選擇,並不會讓它自動參與分流。

behavior 決定 payload 應該如何撰寫

behavior內容範例注意事項
domain+.example.com使用網域規則集語法,不要在每一行加入目標策略組。
ipcidr192.168.0.0/16內容應為 IP 網段,不可混入網域。
classicalDOMAIN-SUFFIX,example.com使用規則運算式,並在引用處指定目標策略。

範例使用 type: inline,規則集內容直接放在 payload 下方。遠端 HTTP 規則提供者還需要設定下載網址、快取路徑、更新間隔與格式;不能將遠端檔案的正文直接複製到 URL 欄位。舊版核心若不支援內嵌提供者,可在確認規則語意一致後改寫為一般規則。

由上往下比對,首次符合即生效

例如,若要讓範例網域走「出口選擇」,其他連線則直接連線,可寫成:

rules:
  - DOMAIN-SUFFIX,example.com,出口選擇
  - MATCH,DIRECT

DOMAIN 比對完整網域;DOMAIN-SUFFIX 比對該網域及其子網域。MATCH 是兜底規則,通常放在最後。若將它移到第一行,後續的網域規則就沒有比對機會。新增規則時,請修改原有清單,不要在檔案末尾再加上一個 rules:。

IP 規則末尾的 no-resolve 表示不會為了比對該條 IP 規則而主動將網域解析成 IP,並不代表全域停用 DNS。若連線本身已有目標 IP,仍可能符合相應的網段規則。範例僅列出部分本機位址範圍,不應將這三條視為完整的內網規則集。

TUN 設定應放在哪裡?為什麼不能只開啟一個選項

tun 與 dns、rules 同為頂層欄位,不可縮排至策略組內。桌面版常見的設定片段如下,實際支援情況仍取決於核心、作業系統與用戶端的接管方式:

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - any:53

auto-route 用於自動設定相關路由,auto-detect-interface 用於自動偵測出口介面。啟用 TUN 通常需要管理員權限或用戶端的服務模式;Android 用戶端則通常透過系統 VpnService 建立 VPN 介面,不應照搬桌面版的權限處理步驟。

dns-hijack 中的 any:53 用來攔截適用的傳統 DNS 流量,無法涵蓋瀏覽器透過 HTTPS 傳送的所有加密 DNS 要求。公司 VPN、其他虛擬網卡與手動路由也可能和自動路由衝突。建議先透過系統代理入口確認設定可用,再啟用 TUN,避免同時變更入口、DNS 與規則,導致無法判斷問題來源。

載入前檢查:縮排、引用與用戶端覆寫

常見的 YAML 格式錯誤

  • 使用 Tab 縮排:統一改用兩個空格;同一層級必須對齊。
  • 漏寫清單項目的連字號:rules、nameserver 與組內候選項目都是清單。
  • 重複定義頂層欄位:兩個 dns: 不代表會自動合併,解析器可能報錯或只保留其中一個。
  • 特殊字元未加引號:密碼、含特殊符號的名稱,以及可能被誤判為其他型別的值,建議以引號括起來。
  • 大小寫或名稱不一致:出口選擇 與 出口選擇 不是可靠的相同引用;複製時請檢查結尾是否有空格。

先用核心檢查,再確認實際生效結果

若已安裝 mihomo 命令列程式,可在設定檔所在的目錄執行:

mihomo -t -f ./config.yaml

Windows 可使用 .\mihomo.exe -t -f .\config.yaml,前提是目前目錄中有該程式。測試通過表示設定檔符合相應核心的檢查,不代表節點驗證正確、網路連線正常,或系統流量已進入代理。

  1. 先執行設定檔測試,優先處理日誌指出的行號、未知欄位與策略引用錯誤。
  2. 在用戶端載入設定,確認混合連接埠確實為 7890,且沒有連接埠占用錯誤。
  3. 使用已設定代理的應用程式發出請求,並在連線清單中檢查命中的規則與最終策略。
  4. 若檔案中設定了 mode: rule,介面卻顯示其他模式,請檢查用戶端的全域設定或執行階段 API 是否覆寫了檔案中的值。
  5. 最後再更新一次訂閱,檢查自訂規則是否仍然存在,並確認需要保留的修改確實寫在覆寫層。
下載Clash