進階設定 預計閱讀 12 分鐘

Clash YAML 設定檔逐段解析:從 mixed-port 到 rules

依序解析通用連接埠、dns、proxies、proxy-groups、rule-providers 與 rules 的欄位,並附上常見縮排錯誤範例。

1. 設定檔結構:先分清客戶端設定與核心設定

Clash Verge Rev 使用的 mihomo 核心負責連線、DNS 與規則比對。YAML 是設定檔的撰寫格式,不是代理協定。檔案能通過 YAML 解析,只代表語法正確;節點類型是否受支援、策略組名稱是否存在,仍須由核心檢查。

閱讀訂閱設定時,可以依照「入口連接埠 → DNS → 節點 → 策略組 → 規則集 → 比對規則」的順序查看。實際執行時並非依照檔案由上而下處理:例如 rules 會引用前面定義的策略組,而策略組再引用節點。這些名稱彼此關聯,組成整份設定。

  • mixed-port、mode 等頂層欄位會決定本機入口與運作模式。
  • dns 是一個映射,其中還包含啟用開關、解析模式與上游伺服器。
  • proxies、proxy-groups、rules 都是清單,各項目前面要加連字號。
  • rule-providers 是依名稱組織的映射,用來宣告外部規則集。

2. mixed-port:設定應用程式連線的本機入口

mixed-port 會在同一個連接埠上同時接受 HTTP 與 SOCKS 代理連線。以下以 7897 為例;不同安裝環境不一定使用這個數值,請以客戶端目前顯示的監聽連接埠為準。

mixed-port: 7897
allow-lan: false
mode: rule
log-level: info
ipv6: false
欄位範例說明檢查重點
mixed-port: 7897本機混合代理入口為 7897手動設定代理的應用程式也須填入這個連接埠
allow-lan: false不開放區域網路裝置連線僅在本機使用時,通常維持關閉
mode: rule依規則選擇出口全域模式下無法透過 rules 驗證分流結果
log-level: info記錄一般運作資訊排查問題時可暫時改為 debug,完成後再恢復
ipv6: false停用核心的 IPv6 支援不代表停用作業系統的 IPv6

手動設定 HTTP 代理時,主機填入 127.0.0.1,連接埠填入 7897。如果客戶端改用 7898,手動設定也要一併更新。若系統代理由客戶端管理,套用設定後請確認系統中的實際值。

混合連接埠不是 DNS 連接埠,也不是核心控制介面。請勿將 external-controller 的位址填入瀏覽器代理設定。若要讓區域網路共用連線,還須檢查監聽位址、防火牆與存取驗證;不能只把 allow-lan 改成 true 就認為設定已完成。

3. dns:解析模式、上游伺服器與流量接管

dns 控制核心內建的 DNS 模組。啟用它不代表作業系統的所有 DNS 請求都會經過客戶端;系統 DNS、應用程式內建的安全 DNS,以及 TUN 的 DNS 劫持設定,都可能影響實際請求路徑。先確認請求流向,再調整上游位址。

dns:
  enable: true
  listen: 127.0.0.1:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://1.1.1.1/dns-query
    - https://1.0.0.1/dns-query

fake-ip 回傳的是映射位址

fake-ip 會為網域指派一個映射位址,核心會保留網域與位址的對應關係,以便後續處理連線。若看到以 198.18 開頭的結果,不要立刻認定 DNS 解析遭到污染。範例中的位址範圍供測試用途使用,並非遠端網站的真實公網位址。

監聽 1053 不會自動變更系統 DNS

listen: 127.0.0.1:1053 表示本機 DNS 服務監聽 1053 連接埠。一般系統 DNS 設定通常只接受伺服器 IP,無法自訂連接埠,因此不能只填入 127.0.0.1,就預期系統會連到 1053。使用 TUN 模式時,應配合客戶端產生的 tun 與 dns-hijack 設定確認接管方式。

  • nameserver 用來指定核心解析網域時使用的上游伺服器;範例採用兩個 DoH 位址,是否能連線取決於目前的網路環境。
  • 使用網域格式的加密 DNS 位址時,可能還需要透過 default-nameserver 解析上游伺服器的網域,作為引導解析。
  • 若個別裝置或應用程式不相容於 fake-ip,可針對網域檢查 fake-ip-filter,不要一開始就停用整套 DNS 機制。

若訂閱已包含完整 DNS 設定,不建議直接用這段範例取代。原設定可能還包含節點網域解析、不同網域的解析策略或特定網域處理方式。排查時一次只修改一個項目,並保留修改前後的記錄,才能判斷問題出在哪裡。

4. proxies 與 proxy-groups:節點參數與出口選擇

proxies 定義個別節點的連線參數;proxy-groups 則將節點組成手動選擇、測速選擇或其他策略組。節點名稱不是說明文字,而是供後續設定引用的識別名稱;空格、大小寫與字元都必須完全一致。

以下僅示範 Shadowsocks 節點的欄位結構。192.0.2.10 是文件專用的示例位址,example-only-not-a-secret 是示範用密碼,這段設定無法用於實際代理連線。真實伺服器、連接埠、加密方式與密碼都必須由服務提供者提供,不能自行猜測。

proxies:
  - name: "示範節點"
    type: ss
    server: 192.0.2.10
    port: 443
    cipher: aes-128-gcm
    password: "example-only-not-a-secret"
    udp: true

proxy-groups:
  - name: "手動選擇"
    type: select
    proxies:
      - "示範節點"
      - DIRECT

別把 select 和 url-test 混為一談

select 代表手動選擇成員;url-test 則會依照設定的測試 URL 與間隔測試候選成員。測速結果主要反映連線至該測試目標的表現,不能直接視為下載頻寬,也無法保證所有網站都會使用同一個最佳出口。

DIRECT 是內建的直連出口,不必另外在 proxies 中建立節點。節點上的 udp: true 只代表允許使用相應的 UDP 功能;服務端支援、協定能力與本機接管方式仍須同時符合條件。

5. rule-providers:將規則內容拆分為獨立檔案

rule-providers 用來宣告規則集的來源、格式與處理方式,但只完成宣告並不會讓規則生效。還須在 rules 中使用 RULE-SET 引用規則集名稱,並指定符合條件後的出口。

以下使用本機檔案作為範例,避免將示範網址誤認為可用的規則來源。請先在核心允許的設定目錄中準備 rules/local-direct.yaml,再載入主設定檔。相對路徑會依核心的工作目錄與路徑限制解析,並非相對於瀏覽器或本文所在位置。

rule-providers:
  local-direct:
    type: file
    behavior: domain
    format: yaml
    path: ./rules/local-direct.yaml

這份規則檔可以完整寫成:

payload:
  - "example.com"
  - "+.example.org"

example.com 用來示範單一網域;+.example.org 則示範該網域及其子網域。這兩個都是文件示例,不代表實際使用時需要採用的分流清單。

  • behavior: domain:規則內容是網域比對項目,不要寫成完整的 DOMAIN-SUFFIX,... 規則。
  • behavior: ipcidr:規則內容是 IP 網段,例如 192.0.2.0/24。
  • behavior: classical:可使用 DOMAIN-SUFFIX 等傳統規則運算式。規則集中的項目通常不會附上出口名稱,出口由引用規則集的位置指定。

改用 type: http 時,必須填入實際可連線的 url,並設定快取路徑;例如 interval: 86400 表示每隔 86400 秒,也就是 24 小時更新一次。下載失敗、檔案格式不符,以及規則未被引用,是三種不同問題,應分別檢查記錄、檔案內容與主設定檔。

6. rules:依序比對,最後設定預設出口

在規則模式下,rules 會依清單順序比對,通常由第一條符合的規則決定出口。範圍較窄的特殊規則放前面,範圍較大的規則放後面,並將 MATCH 放在最後。並不是「比對完所有規則後再挑最適合的一條」。

rules:
  - DOMAIN,example.com,DIRECT
  - DOMAIN-SUFFIX,example.net,手動選擇
  - RULE-SET,local-direct,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - MATCH,手動選擇

這段設定依賴前文已定義的 手動選擇 策略組與 local-direct 規則集,不能單獨匯入作為完整設定。DOMAIN 比對指定網域,DOMAIN-SUFFIX 比對該網域及其子網域;不要只因名稱相似就將兩者互換。

no-resolve 不代表停用所有 DNS

IP 類規則可能需要透過解析網域,才能比對網域請求。範例中的 no-resolve 表示不因這條規則而主動發起網域解析;若請求原本就是 IP,或已有可用的解析結果,仍可進行比對。它不會停用 DNS 模組,也不保證請求不會在其他步驟中被解析。

MATCH 放在前面會讓後續規則無法生效

如果第一條規則就是 MATCH,DIRECT,後面的網域代理規則便不會有機會命中。排查「規則已設定卻沒有生效」時,先到客戶端的「連線」頁面查看新連線使用的規則與出口,再檢查前面是否有涵蓋範圍更大的項目。修改後請用新連線驗證;已建立的長連線不會因規則變更而自動切換。

7. YAML 縮排錯誤:分開檢查語法與執行結果

建議每層縮排兩個空格,不要使用 Tab。YAML 的階層由縮排決定,冒號後通常要加空格,清單項目前則要加上連字號與空格。設定錯誤訊息顯示的行號,可能只是解析器發現問題的位置;真正的錯誤也可能出現在前一行。

錯誤一:欄位縮排在父層

以下的 enable 沒有縮排在 dns 底下。這段內容可能仍是合法的 YAML,卻不是核心預期的設定結構。

# 錯誤:enable 變成頂層欄位
dns:
enable: true

# 正確
dns:
  enable: true

錯誤二:清單項目與所屬欄位沒有正確分層

# 錯誤:DIRECT 與 proxies 同層
proxy-groups:
  - name: "手動選擇"
    type: select
    proxies:
    DIRECT

# 正確
proxy-groups:
  - name: "手動選擇"
    type: select
    proxies:
      - DIRECT

錯誤三:特殊字元與重複鍵造成內容變化

密碼或名稱若包含 : ,或空格後接 #,建議加上引號。例如 name: "線路: A #1" 可明確保留完整文字。不要在同一層寫兩個 dns: 或兩個 rules:,期待系統自動合併:解析器可能會報錯,也可能只保留其中一個,兩者都不適合作為覆寫方式。

「找不到策略組」或「規則集不存在」通常是引用錯誤,不是縮排錯誤。請逐字核對節點名稱、策略組名稱與規則集名稱;不要只盯著錯誤行反覆增減空格。

8. 套用設定後的檢查:依序驗證入口、解析、出口與規則

請勿直接將上方所有片段拼成正式環境設定。各段只是用來說明結構;節點使用文件示例位址,規則集也必須先建立本機檔案。實際修改時,請以目前可用的訂閱設定為基礎,一次只變更一個目標欄位。

  1. 保留基準設定。備份目前的設定,記下混合連接埠、運作模式與所選策略組成員。確認「設定檔」頁面啟用的是剛才編輯的項目。
  2. 確認載入狀態。套用修改後前往「記錄」頁面,先處理解析錯誤與名稱引用錯誤。設定尚未成功載入時,不要根據連線結果判斷新規則是否有效。
  3. 確認入口。確認實際監聽連接埠是預期的 7897,或已修改為其他數值。若應用程式未遵循系統代理設定,再評估是否需要手動設定代理或透過 TUN 接管流量。
  4. 確認解析。區分 DNS 逾時、節點網域解析失敗與目標網域解析失敗。啟用 fake-ip 時,映射位址本身並不能證明解析失敗。
  5. 確認出口。在「代理」頁面確認策略組實際選用的成員,再到「連線」頁面查看新請求符合的規則與出口路徑。
  6. 確認設定是否保留。更新一次訂閱或重新載入設定檔,確認自訂內容仍然存在;若內容遭到覆蓋,請將自訂設定移至合適的覆寫入口。

若要進一步了解欄位之間的關聯,可以繼續閱讀進階設定;若還不熟悉混合連接埠、策略組與 TUN 的概念,請先參閱術語手冊。先確認請求已進入客戶端,再驗證 DNS 與規則,比一次取代整份 YAML 更容易找出問題。

下載 Clash 客戶端