設定檔整體結構與閱讀順序

Clash 的 config.yaml 是 YAML 格式的文字檔,客戶端啟動時會依序讀取頂層欄位。理解它的最佳方式,是把檔案從上到下分成四段:通用設定、DNS 設定、節點定義、策略組與規則。

YAML 的語法約束很直接:縮排用空格(禁止 Tab),同層欄位縮排必須一致,鍵與值之間用英文冒號加空格分隔。欄位順序本身不影響解析,但 proxies、proxy-groups、rules 之間存在引用關係:策略組引用的節點名稱必須先在 proxies 裡定義,規則引用的策略組名稱必須先在 proxy-groups 裡定義。按照「通用 → DNS → proxies → proxy-groups → rules」的順序撰寫,既符合閱讀直覺,也能避免引用未定義名稱的報錯。

一個最小可用設定的骨架:

port: 7890
socks-port: 7891
allow-lan: false
mode: rule
log-level: info

dns:
  enable: true
  nameserver:
    - 223.5.5.5

proxies:
  - name: "範例節點"
    type: ss
    server: 203.0.113.10
    port: 443
    cipher: aes-256-gcm
    password: "example-password"

proxy-groups:
  - name: PROXY
    type: select
    proxies:
      - "範例節點"
      - DIRECT

rules:
  - DOMAIN-SUFFIX,github.com,PROXY
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

這個骨架省略了 ipv6、external-controller 等選用欄位,但已經能完成「啟動 → 走代理 → 規則分流」的完整流程。

通用欄位:連接埠、模式與日誌

頂層通用欄位控制客戶端的基本行為,下表列出最常用的幾個:

欄位 範例值 作用
port 7890 HTTP 代理監聽連接埠
socks-port 7891 SOCKS5 代理監聽連接埠
allow-lan false 是否允許區域網路裝置連線
mode rule 執行模式:rule / global / direct
log-level info 日誌等級:silent / error / warning / info / debug
ipv6 false 是否啟用 IPv6 流量
external-controller 127.0.0.1:9090 外部控制 API 監聽位址

mode 是三個取值最容易混淆的欄位。rule 模式會依 rules 區規則逐條比對,命中即轉發,這是日常使用最常見的模式;global 模式讓所有流量都走 proxy-groups 裡第一個策略組,跳過 rules 比對;direct 模式讓所有流量直連,相當於全域繞過代理,適合用來排查節點故障。

port 與 socks-port 可以同時監聽,也可以只開其中一個。如果本機 7890 被其他程式占用,啟動日誌會提示 bind: address already in use,把連接埠改成 7897 之類未占用的值即可。

external-controller 提供 RESTful API,Clash Verge 的面板、Yacd、Metacubexd 都透過這個位址讀取與修改設定。預設綁定 127.0.0.1 只允許本機存取;如果設定了 secret 欄位,存取 API 時需要帶上對應的請求標頭。

log-level 建議日常用 info,排查問題時暫時切到 debug。debug 會輸出每條連線的規則命中資訊:

[TCP] dial Match(DomainSuffix): github.com → PROXY
[UDP] dial Match(GEOIP): 8.8.8.8 → DIRECT

這類日誌能直接告訴你流量被哪條規則接走,是除錯分流最有效的著手點。

DNS 設定段:nameserver 與 fallback 的分工

dns 段決定網域名稱解析走哪條路徑,是設定裡第二重要的部分。核心欄位如下:

欄位 範例值 作用
enable true 是否接管系統 DNS
listen 0.0.0.0:53 DNS 服務監聽位址
nameserver 223.5.5.5, 119.29.29.29 預設解析伺服器
fallback 8.8.8.8, 1.1.1.1 備用解析伺服器
fallback-filter geoip: true 觸發 fallback 的條件
default-nameserver 223.5.5.5 解析節點網域所用的伺服器

nameserver 負責解析大多數網域,一般填中國大陸公共 DNS,例如 223.5.5.5(阿里雲)與 119.29.29.29(騰訊雲),回應快且沒有污染問題。

fallback 用於處理被污染的網域:當 nameserver 回傳的 IP 被 geoip 判定為保留位址時,客戶端會用 fallback 裡的伺服器重新解析一次。簡單情境下,把 fallback 填成 8.8.8.8 與 1.1.1.1 即可。

這裡有一個容易踩的坑:如果 proxies 裡的節點使用網域而非 IP,客戶端解析節點網域時也會走 dns 段。一旦節點網域被污染,所有節點都會連不上。所以 default-nameserver 必須填一個可靠的中國大陸 DNS,並且不要把節點網域解析交給 fallback 流程。TUN 模式下,dns 段的 enable 必須為 true,否則開啟 TUN 後系統流量無法正確解析網域。

proxies 節點:每種協定怎麼定義

proxies 是一個陣列,每個元素定義一個代理節點。不同協定共用 name、type、server、port 四個基礎欄位,協定專屬欄位則各不相同。

SS 節點的欄位最少:

- name: "SS-東京"
  type: ss
  server: 203.0.113.10
  port: 443
  cipher: aes-256-gcm
  password: "your-password"

cipher 常見取值有 aes-256-gcm、chacha20-ietf-poly1305、2022-blake3-aes-256-gcm 等。密碼必須與訂閱服務商提供的一致,否則握手階段會直接失敗。

VMess 節點多了 uuid、alterId 與傳輸層欄位:

- name: "VMess-新加坡"
  type: vmess
  server: 203.0.113.20
  port: 443
  uuid: "550e8400-e29b-41d4-a716-446655440000"
  alterId: 0
  cipher: auto
  network: ws
  ws-opts:
    path: "/path"
    headers:
      Host: "example.com"

alterId 在較新的服務端實作裡通常為 0。network 為 ws 時必須搭配 ws-opts 的 path 與 Host 使用,兩者要與訂閱服務商的設定一一對應,填錯會導致 TLS 握手後無法建立隧道。

Trojan 節點結構與 VMess 類似,但沒有 uuid:

- name: "Trojan-洛杉磯"
  type: trojan
  server: 203.0.113.30
  port: 443
  password: "your-password"
  sni: "example.com"
  skip-cert-verify: false

sni 用於 TLS 的 SNI 擴充,必須與憑證網域一致。skip-cert-verify 預設為 false,不建議改成 true,除非節點憑證本身不合法且你確認風險可接受。

Hysteria2 節點額外需要 up 與 down 頻寬參數:

- name: "Hysteria2-香港"
  type: hysteria2
  server: 203.0.113.40
  port: 443
  password: "your-password"
  up: "50 Mbps"
  down: "200 Mbps"
  sni: "example.com"

up/down 宣告客戶端可用頻寬,數值偏小會限制傳輸速度,偏大可能導致壅塞。

proxy-groups 策略組:選擇邏輯如何嵌套

proxy-groups 定義策略組,組內 proxies 列表可以引用節點,也可以引用其他策略組。四種常用類型:

類型 行為 適用場景
select 手動選擇一個節點 日常主力,手動切換
url-test 定時測速,自動選延遲最低的節點 追求自動選優
fallback 按列表順序使用,故障時切換下一個 需要固定優先順序
load-balance 在多個節點間平均分配流量 多節點聚合頻寬

select 類型最直觀:

- name: PROXY
  type: select
  proxies:
    - "SS-東京"
    - "VMess-新加坡"
    - "Trojan-洛杉磯"
    - DIRECT
    - REJECT

url-test 需要額外設定測速位址與間隔:

- name: Auto
  type: url-test
  url: "https://www.gstatic.com/generate_204"
  interval: 300
  tolerance: 50
  proxies:
    - "SS-東京"
    - "VMess-新加坡"

interval 單位是秒,300 表示每 5 分鐘測一次速。tolerance 表示延遲差小於 50ms 時不切換,避免頻繁抖動。

策略組可以嵌套,這是進階寫法:

proxy-groups:
  - name: PROXY
    type: select
    proxies:
      - Auto
      - "SS-東京"
      - DIRECT
  - name: Auto
    type: url-test
    proxies:
      - "SS-東京"
      - "VMess-新加坡"

這裡 PROXY 組的第一個選項是 Auto 組,選中 Auto 後實際流量由 url-test 自動決定。嵌套層數沒有硬性限制,但建議不要超過兩層,否則排查「目前走的是哪個節點」會變得困難。

rules 規則區:比對順序決定流量走向

rules 是最後一節,也是流量分流的核心。Clash 會依序逐條比對,命中第一條就停止,不再繼續往下看。因此規則順序非常關鍵。

常用規則類型:

規則前綴 比對對象 範例
DOMAIN 完整網域 DOMAIN,www.google.com,PROXY
DOMAIN-SUFFIX 網域後綴 DOMAIN-SUFFIX,google.com,PROXY
DOMAIN-KEYWORD 網域關鍵字 DOMAIN-KEYWORD,github,PROXY
IP-CIDR IPv4 網段 IP-CIDR,192.168.0.0/16,DIRECT
GEOIP 國家或地區 GEOIP,CN,DIRECT
PROCESS-NAME 處理程序名稱 PROCESS-NAME,wechat.exe,DIRECT
MATCH 兜底 MATCH,PROXY

一個可用於正式環境的 rules 範例:

rules:
  - DOMAIN-SUFFIX,local,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT
  - DOMAIN-SUFFIX,cn,DIRECT
  - GEOIP,CN,DIRECT
  - DOMAIN-SUFFIX,google.com,PROXY
  - DOMAIN-SUFFIX,youtube.com,PROXY
  - DOMAIN-KEYWORD,github,PROXY
  - MATCH,PROXY

注意上面這個順序:區域網路與中國大陸流量先被 DIRECT 接走,再比對國外網域走 PROXY,最後 MATCH 兜底。如果把 DOMAIN-SUFFIX,google.com,PROXY 放到 GEOIP,CN,DIRECT 前面,google.com 的解析結果如果是中國大陸 IP(例如被 CDN 調度到中國大陸節點),就會錯誤地直連。

規則名稱(最後一個欄位)必須是 proxy-groups 裡定義的組名,或是 DIRECT、REJECT 這兩個內建目標。引用不存在的組名,設定校驗會直接報錯。

規則順序即優先順序。Clash 從 rules 第一條開始逐條比對,命中即停止。把寬泛規則(如 GEOIP,CN,DIRECT)放在具體規則(如 DOMAIN-SUFFIX,google.com,PROXY)之前,後者將永遠沒有機會命中。

校驗設定與常見錯誤

寫完 config.yaml 後,先用命令列校驗語法,再啟動客戶端,能省下大量排查時間。mihomo 核心的校驗命令:

./mihomo -t -f config.yaml

輸出 configuration file ... test is successful 表示通過。Clash Verge 的「設定」→「參數設定」裡也提供設定檢查入口,本質上呼叫的是同一條校驗邏輯。

常見錯誤依出現頻率排序:

  1. 縮排用了 Tab。YAML 只認空格,在編輯器裡勾選「將 Tab 轉為空格」即可避免。
  2. 冒號後漏空格。port:7890 會被解析成字串鍵,而不是連接埠欄位。
  3. 密碼等特殊字元未加引號。密碼含 #、:、* 等字元時必須用雙引號包裹,否則 YAML 會把它當成註解或結構符號。
  4. 引用了未定義的節點名稱或策略組名稱。檢查 proxies 的 name 與 proxy-groups 的 proxies 列表是否完全一致。
  5. 重複定義同名節點。後一個定義會覆蓋前一個,容易造成「改了設定但行為沒變」的假象。

把校驗命令的輸出與上面這張清單對照,絕大多數設定問題都能在 5 分鐘內定位。