設定檔參考 · mihomo 欄位

Clash YAML 設定手冊

依結構查閱連接埠、DNS、代理節點、策略組與規則。先釐清核心欄位和用戶端設定的差異,再檢查設定產生流程與連線路徑。

首次安裝及匯入設定,請依照快速入門教學完成操作;本頁適合用來修改欄位、比較設定及排查載入問題。範例主要以 mihomo 為對象,不保證適用於所有舊版 Clash 核心。

設定結構與 YAML 語法

Clash 設定檔描述核心如何監聽請求、解析網域及選擇出口,不等於完整的用戶端介面偏好設定。視窗位置、選單列圖示、開機啟動等項目通常由圖形化用戶端另行儲存。閱讀設定前,先確認目前執行的是哪種核心,以及用戶端實際載入了哪份設定。檔名為 config.yaml,不代表它一定是生效中的檔案;訂閱設定、本機設定與執行時產生的檔案可能同時存在。

映射、清單與縮排層級

YAML 映射以鍵和值表示,清單項目則以連字號開頭。頂層的 dns 是映射,proxies、proxy-groups 和 rules 通常是清單。子欄位的縮排必須比父層多,建議統一使用兩個空格,避免使用定位字元。同一層的欄位應對齊。解析錯誤指向某一行時,真正原因也可能出在上一行,例如引號未閉合,或清單項目漏了連字號。

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

dns:
  enable: true
  nameserver:
    - https://dns.alidns.com/dns-query

proxies: []

proxy-groups:
  - name: "出口選擇"
    type: select
    proxies:
      - DIRECT

rules:
  - MATCH,出口選擇

這是一份僅包含直連出口的結構範例,不含可連線的遠端代理節點。適合用來檢查 YAML 層級、策略組引用與規則兜底關係,不能取代服務提供者提供的節點設定。不要把各章範例直接首尾拼接成同一個檔案:同名頂層欄位應合併至同一處,尤其不可重複加入兩段 dns 或兩段 rules,再期待核心自動判斷合併方式。

字串、布林值與特殊字元

值中含有冒號後接空格、井字號,或容易產生型別歧義時,建議加上引號。井字號在一般文字中可能表示註解起始,導致後面的內容不再被視為密碼或名稱。布林值直接寫成 true 和 false,連接埠則使用整數。節點名稱、策略組名稱與規則目標都是字串,引用時必須完全一致;可以使用中文名稱,但名稱前後的空格也可能成為字串的一部分。

使用雙引號時請留意反斜線跳脫;一般不需跳脫的字串可使用單引號。編輯器若自動換成彎引號,檔案可能仍能解析,卻讀取出非預期的字串。排查引用失敗時,應比對原始文字,而不只看介面上外觀相近的名稱。不要讓兩個節點或策略組使用相同名稱,也不要用 DIRECT、REJECT 等內建出口名稱替自訂物件命名。

設定來源與驗證方式

訂閱連結回傳的內容不一定是完整 YAML:有些會回傳編碼後的節點清單,有些需要伺服器端轉換,也有些會依請求方式回傳不同格式。匯入失敗時,先在用戶端確認設定類型,再查看解析記錄。網頁回傳的登入頁、錯誤頁或過期提示,即使儲存時加上 YAML 副檔名,也不是有效設定。訂閱網址可能含有存取憑證,不應貼到公開討論區或截圖中。

若裝置已安裝獨立的 mihomo 命令列程式,可在終端機執行下列語法測試。圖形化用戶端內建的核心未必位於 shell 搜尋路徑,因此出現找不到命令,不代表設定檔已損毀。測試時應使用與用戶端相近的核心及相同資源目錄;引用外部規則檔的設定,也需要確認對應檔案存在。測試通過只表示可載入,不能證明遠端節點可連線,或分流結果符合預期。

mihomo -t -f ./config.yaml

建議保留一份可正常連線的原始設定,每次只修改一組相關欄位,並記錄預期變化。發生問題時,便能釐清是語法錯誤、用戶端覆寫、網路無法連線,還是規則比對異常。一次加入大量無關的網路範例,容易讓錯誤互相掩蓋,也會失去可供比較的回復基準。

監聽連接埠與存取範圍

連接埠欄位決定本機應用程式將代理請求交給核心的入口。這些連接埠不等於遠端節點連接埠,也不等於控制介面連接埠。瀏覽器連上本機混合連接埠後,核心才會依規則選擇遠端節點或直連出口。遠端節點的伺服器連接埠則設定在對應節點下。混淆這兩個層級,常見結果是把系統代理指向遠端伺服器,或誤將遠端節點位址改成回送位址。

HTTP、SOCKS 與混合連接埠

欄位接收的請求使用範圍
portHTTP 代理,包含 CONNECT 請求可供系統 HTTP 與 HTTPS 代理使用
socks-portSOCKS 代理應用程式需支援相應代理協定
mixed-portHTTP 與 SOCKS 代理兩種協定共用一個監聽連接埠
external-controller核心管理 API不是網頁流量的代理入口

一般桌面使用只設定一個混合連接埠即可。範例使用 7890,不代表所有用戶端都採用這個數值;介面顯示、執行設定與系統代理設定必須彼此一致。若分別啟用多個獨立監聽入口,應使用不同連接埠,避免同一位址發生監聽衝突。關閉不需要的入口,比設定所有連接埠欄位更容易理解,也方便確認應用程式目前使用哪個入口。

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

回送位址與區域網路分享

127.0.0.1 是目前裝置的 IPv4 回送位址。手機填入這個位址時,連線的是手機本身,不會連到 Mac。若要將 Mac 的代理分享給區域網路裝置,應明確允許區域網路連線、設定合適的監聽位址,並在其他裝置填入 Mac 實際的區域網路位址。開放監聽後,也要留意防火牆、網路隔離與存取驗證,不能只打開開關就忽略存取範圍。

allow-lan 控制是否允許區域網路請求,bind-address 則用來限制監聽位址。實際能否連線取決於這些欄位的組合、核心行為與系統防火牆。桌面自用建議維持回送位址存取;分享時應限定可信任的網路,不要在路由器上將本機代理連接埠直接轉送至公網。公共 Wi-Fi 中的其他裝置,不會因為位於同一網段就變得可信。

macOS 系統代理欄位

macOS 的網頁代理和安全網頁代理通常都填入本機 HTTP 入口;安全網頁代理這個名稱,不代表本機入口必須另外啟用 TLS。HTTPS 網站通常透過 HTTP CONNECT 建立通道。若用戶端使用混合連接埠,網頁代理、安全網頁代理與 SOCKS 代理可以指向相同的回送位址和連接埠;若使用獨立連接埠,則必須分別對應,不可直接照抄範例數值。

下列指令可查看名為 Wi-Fi 的網路服務目前設定。裝置上的服務名稱可能不同,可先用清單指令確認。系統有多個網路服務時,應檢查實際承載連線的服務;外接網卡、有線網路或服務重新命名,都可能讓檢查對象與實際出口不一致。指令輸出的位址正確,也不表示用戶端確實正在監聽,因此還要檢查本機程序。

networksetup -listallnetworkservices
networksetup -getwebproxy Wi-Fi
networksetup -getsecurewebproxy Wi-Fi
networksetup -getsocksfirewallproxy Wi-Fi
lsof -nP -iTCP:7890 -sTCP:LISTEN

連接埠遭占用時,先確認是哪個程序正在監聽,不要直接結束不熟悉的系統程序。兩個代理用戶端同時執行,可能爭用連接埠,也可能輪流修改系統代理。退出其中一個後,仍須確認系統設定沒有殘留。更換連接埠後,也要同步更新 shell 環境變數、編輯器代理設定及其他手動填入代理位址的應用程式;否則瀏覽器恢復正常,部分應用程式仍可能連到舊位址。

執行模式與流量入口

執行模式決定請求進入核心後如何選擇出口;系統代理與 TUN 則決定請求如何進入核心。這是兩個不同的問題。啟用規則模式不會自動接管所有應用程式,啟用 TUN 也不代表所有流量都必須經過遠端代理。說明連線行為時,應先確認應用程式使用哪個入口,再確認核心目前採用哪種執行模式,最後查看該連線的比對結果。

規則、全域與直連模式

mode: rule 依規則清單的順序選擇策略;mode: global 使用全域策略;mode: direct 則採用直連方式。這些模式不是連線品質等級,也不是網路權限層級。全域模式適合短暫用於比對測試,協助判斷問題是否與規則有關,但不應把它當成解決所有問題的開關。若選取的遠端節點本身無法連線,切換全域模式通常不會改善結果。

mode: rule
log-level: info
ipv6: false

圖形化用戶端通常可在介面中切換模式,但介面狀態可能是透過控制介面修改執行中的核心,不一定會寫回原始 YAML。重新載入設定後,模式能否保留取決於用戶端的儲存方式。排查時應同時檢查檔案與即時介面,不能只憑編輯器中的 mode 值判定目前狀態。用戶端的執行記錄、連線頁面與產生的設定檔,是更直接的觀察依據。

系統代理與終端機環境變數

系統代理主要影響遵循系統代理設定的應用程式。許多命令列程式有自己的代理設定邏輯,預設不會讀取 macOS 網路設定。可在目前的 shell 暫時設定環境變數,再進行比對測試;新開的終端機視窗不會自動繼承另一個視窗之後新增的變數。不同工具支援的變數名稱與大小寫可能不同,遇到問題時應查閱該工具的說明文件,而不是反覆切換系統代理。

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5h://127.0.0.1:7890

curl -I https://example.com

unset http_proxy https_proxy all_proxy

此處的 socks5h 表示支援這種寫法的工具會將目標網域交由代理端解析,與先在本機解析再傳送位址不同。環境變數只會影響讀取它們的程式,不會改變整個作業系統的網路路由。有些工具同時提供命令列參數與設定檔,優先順序也可能高於環境變數;驗證時應盡量減少重複設定,避免無法判斷究竟是哪一層生效。

TUN 設定與權限範圍

TUN 透過虛擬網路介面接收更廣泛的 IP 流量,通常需要用戶端安裝輔助服務或取得相應權限。以下是 mihomo 常見的欄位組合,不是所有圖形化用戶端都採用相同的設定方式。有些用戶端會接管 TUN 欄位、自動選擇介面或產生排除路由,建議優先使用該用戶端支援的設定入口。完整啟用步驟請參閱TUN 模式教學。

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

auto-route 會讓核心嘗試建立相應路由,auto-detect-interface 用於自動辨識出口介面。切換無線網路、連接擴充基座或啟動其他 VPN 後,出口介面與路由可能改變。連線中斷時應檢查介面與路由狀態,不要立刻歸咎於節點。企業 VPN、虛擬機器和其他網路延伸功能可能同時修改連線路徑,搭配使用時應逐一啟用並觀察。

DNS 劫持規則也有適用範圍:上述設定針對一般 DNS 連接埠的流量,不代表會自動接管所有應用程式內建的加密 DNS。啟用 TUN 後若只有部分網域異常,應一併檢查 DNS 模式、應用程式自身設定及路由排除項目。關閉用戶端前,也應讓它正常解除接管,避免強制結束程序後留下暫時無法使用的網路狀態。

排查時可依固定順序比對:先關閉其他 VPN,只用系統代理測試;確認入口可用後再啟用 TUN;最後重新啟用其他網路工具。每次只變更一個條件,並記錄瀏覽器、終端機與特定應用程式的差異。Windows 的應用程式回送是另一種平台機制,並非 macOS TUN 的同義詞,相關補充請參閱Windows 應用程式回送說明。

DNS 欄位與網域解析路徑

DNS 設定需要釐清三件事:應用程式的查詢是否進入核心、核心使用哪個解析器,以及解析結果如何影響後續連線。只填入一個公共 DNS 位址,不代表所有應用程式都會使用它。在系統代理情境中,應用程式可能先呼叫系統解析器;透過 HTTP CONNECT 或遠端解析的 SOCKS 請求則可能保留網域名稱。TUN、應用程式內建的加密 DNS 與本機快取,也會改變實際觀察到的路徑。

基本解析器與引導解析

dns.enable 用來啟用核心 DNS 模組,nameserver 則指定一般上游解析器。若加密 DNS 位址使用網域名稱,就需要先解析該網域;default-nameserver 可用於這類引導解析,適合填入明確的 IP 位址。不要讓所有解析器都依賴彼此的網域名稱,再期待它們透過尚未建立的代理鏈路完成首次連線。

dns:
  enable: true
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  default-nameserver:
    - 223.5.5.5
  nameserver:
    - https://dns.alidns.com/dns-query
  proxy-server-nameserver:
    - https://dns.alidns.com/dns-query
  fake-ip-filter:
    - "*.lan"
    - "*.local"

此範例用來說明欄位之間的關係,不代表某個公共解析器適用於所有網路。選擇上游解析器時,應考量目前網路能否直接連線、組織內部網域是否需要專用解析器,以及遠端節點所在網路的解析需求。proxy-server-nameserver 用於解析代理伺服器網域,可將節點位址解析與一般網站解析分開處理,降低啟動時發生循環依賴的風險。

fake-ip 與真實位址模式

fake-ip 模式會為符合處理條件的網域回傳合成位址,核心再利用對應關係還原原始網域,進行連線與規則判斷。範例網段屬於基準測試用途的位址空間,不是遠端代理伺服器位址。應用程式看到這類位址,不一定代表解析錯誤;但若取得合成位址後繞過核心,連線就可能失敗,因此解析入口與流量入口必須一致。

使用真實位址回應的模式較接近傳統 DNS 行為,但網域與連線之間的關聯可能受到應用程式快取、共用 IP 或連線方式影響。兩種模式沒有絕對優劣。區域網路探索、遊戲、裝置管理,或某些會明確驗證位址的應用程式,可能需要排除 fake-ip。新增過濾項目之前,應先確認問題確實來自位址相容性,而不是遠端節點或目標服務無法連線。

依網域選擇解析器

nameserver-policy 可為指定網域選擇解析器,適合將公司內部網域交由內部 DNS 解析。以下以範例網域和私有網路位址說明結構,實際使用時必須換成組織提供的正確值。若內部 DNS 只能透過企業 VPN 存取,也要確保路由允許查詢送達該位址。將內部網域交給公共解析器,通常無法取得有效結果,也可能暴露不必要的查詢資訊。

dns:
  nameserver-policy:
    "+.corp.example.com":
      - 192.168.10.1

這段設定應合併至現有的 dns 映射,不能再追加第二段同名的頂層欄位。引入依規則選擇 DNS 出口的進階設定前,應先建立可正常運作的基本解析鏈。某些 DNS 路由選項會讓解析請求也參與規則判斷;若規則判斷本身又需要 DNS,就應依核心文件處理相依關係,而不是一味增加解析器數量。

DNS 問題的觀察順序

先確認用戶端記錄中是否出現對應查詢,再檢查回應位址與連線最後選擇的出口。一般的 dig 測試通常無法證明應用程式內建的加密 DNS 行為;瀏覽器能開啟網頁,也不代表終端機使用相同的解析路徑。修改設定後,瀏覽器、系統與核心可能各自保留快取;需要關閉舊連線並重新發出請求,必要時再依用戶端提供的方法清除快取。

IPv6 也需要分層理解:頂層開關、DNS 是否回傳 IPv6 位址,以及作業系統是否有可用的 IPv6 路由,是不同條件。關閉其中一個欄位,不能一概解釋所有 IPv6 問題。遇到連線緩慢或首次請求等待時,應比對解析時間、建立連線的時間與所選出口,並依照網速緩慢的分層排查方法繼續定位,避免把所有等待都歸咎於 DNS。

代理節點欄位與遠端服務提供者

代理節點描述一種具體的遠端連線方式,核心欄位包括協定類型、伺服器位址、伺服器端連接埠與驗證參數。策略組負責選擇節點,規則負責選擇策略組,三者不能互相取代。服務提供者提供的節點欄位應是主要依據,不要只根據節點名稱猜測協定。例如名稱中出現某種協定字樣,也只是標籤;核心實際採用的協定仍由 type 欄位決定。

通用欄位與協定專用欄位

name 用於供策略組引用,server 是伺服器網域名稱或 IP,port 是遠端服務的監聽連接埠。驗證方式依協定而異:有些使用密碼,有些使用使用者識別碼,有些則同時需要 TLS 與傳輸參數。欄位名稱相似,不代表可以跨協定照搬。以下的 Shadowsocks 範例僅說明結構,其中的網域與密碼是教學用假資料,無法直接建立遠端連線。

proxies:
  - name: "範例出口"
    type: ss
    server: proxy.example.com
    port: 443
    cipher: aes-128-gcm
    password: "your-password"
    udp: true

加密方式、密碼與伺服器端連接埠必須與服務端一致。連接埠使用常見的網頁服務連接埠,不代表該節點就是 HTTPS 服務,也不代表一般瀏覽器可以直接連線。udp: true 只表示設定允許相應功能,實際能否使用仍取決於協定實作、服務端支援、上游網路與應用程式的請求路徑。UDP 無法連線時,應檢查整條鏈路,而不是反覆切換這個欄位。

TLS、伺服器名稱與傳輸參數

對於啟用 TLS 的協定,需了解連線位址與憑證驗證名稱可能不同。server 決定連線目標;部分協定中的 servername 等欄位則用於傳送及驗證伺服器名稱,實際名稱取決於協定設定格式。WebSocket 路徑、請求標頭、gRPC 服務名稱等,也必須與服務端一致。漏掉這些參數時,TCP 連接埠可能可連線,但上層交握仍會失敗。

發生憑證錯誤時,應先檢查系統時間、伺服器名稱、憑證鏈與服務端部署。略過憑證驗證會改變安全範圍,不應當成通用排錯方式。也不要在不清楚用途時自行加入指紋、傳輸最佳化或連線重用欄位;某個欄位在其他協定中有效,不代表目前協定支援。解析器接受了未知或無關欄位,也不代表這些欄位會產生預期效果。

遠端節點集合與健康檢查

proxy-providers 可將節點來源與主設定分開,適合定期更新節點集合。提供者檔案必須符合節點提供者的結構,不能任意將包含完整規則與 DNS 的訂閱當成相同類型的輸入。以下展示遠端來源的寫法,連結僅供教學示範;正式設定應使用可信任的來源,並將存取憑證視為機密資訊,不要提交至公開儲存庫。

proxy-providers:
  remote-pool:
    type: http
    url: "https://example.com/proxies.yaml"
    path: ./providers/remote-pool.yaml
    interval: 86400
    health-check:
      enable: true
      url: https://www.gstatic.com/generate_204
      interval: 600

interval 表示更新間隔,健康檢查間隔則用來控制可用性測試,兩者用途不同。路徑是相對於核心的工作目錄;圖形化用戶端可能使用專用資料目錄。更新失敗時,應區分遠端回應異常、格式不符與本機目錄無法寫入;既有快取是否仍可使用,也要依記錄判斷。未備份前不要直接刪除快取,以免一併清除原本仍可運作的節點集合。

節點名稱與引用穩定性

訂閱更新可能變更節點名稱。手動策略組若逐一引用舊名稱,更新後可能找不到對應節點。透過提供者的 use 引入整個集合,通常比複製大量節點名稱更容易維護,但篩選條件也需要配合命名方式調整。合併多個來源時應避免名稱重複;重名不只是顯示問題,也會讓策略選擇、記錄閱讀與覆寫定位變得不明確。

節點清單顯示出來,不代表已完成可用性驗證。排查應依序檢查網域解析、伺服器連線、協定交握,再到目標存取。單一節點失敗時,先與同一策略組中的其他節點比較;所有節點都失敗時,再檢查本機網路、入口、系統時間與設定來源。測速結果也不代表所有網站、協定與時段的實際表現。

選擇用戶端時,可先查看macOS 下載入口中的 Clash Plus,再依功能需求比較 Clash Verge Rev 與 FlClash。用戶端介面相似,不代表支援的核心欄位完全相同。若想了解圖形化用戶端與核心的分工,可繼續閱讀Clash 開源生態與 mihomo 的關係,再決定應在哪一層維護設定。

策略組欄位與健康檢查

策略組會將節點整理成可供引用的出口名稱。規則通常指向策略組,而非經常變動的個別節點,這樣更換節點時就不必重寫整套規則。一個策略組也能引用另一個組,形成手動選擇與自動選擇的層次。不過,引用關係不可形成循環,組名必須唯一,且所有被引用的物件都必須存在於最終執行設定中。若節點只存在於原始訂閱,卻被覆寫移除,同樣會造成問題。

手動選擇組與巢狀關係

proxy-groups:
  - name: "出口選擇"
    type: select
    proxies:
      - 自動選擇
      - DIRECT

  - name: "自動選擇"
    type: url-test
    use:
      - remote-pool
    url: https://www.gstatic.com/generate_204
    interval: 300
    tolerance: 50

範例中的 remote-pool 對應上一章定義的提供者。proxies 列出指定節點或組名,use 則引入提供者集合。使用 select 時,實際出口取決於使用者目前的選擇;清單中的某個節點發生連線問題時,不會自動改選,除非使用者選的是內部具備自動選擇功能的子組。清單順序也不代表目前的選擇狀態。

多層巢狀適合拆分地區、用途與選擇方式,但層數過多會降低可讀性。連線頁面顯示命中某個規則目標後,仍須沿著策略組目前的選擇確認最終節點。排錯時可先建立一個直接引用已知節點的簡單選擇組,確認節點本身可用,再恢復自動組與較複雜的巢狀結構。這樣能區分策略邏輯與遠端連線問題。

自動選擇、故障切換與負載平衡

類型主要行為適用情境
select保留手動選擇需要明確控制出口
url-test依探測結果選擇節點從可用候選中自動選擇
fallback依候選順序選擇可用節點優先使用固定出口,失效時切換
load-balance依所選策略分配連線在多個出口之間分散請求

url-test 的結果反映的是存取指定測試網址的表現,不是下載頻寬,也不是對所有目標服務的綜合評分。tolerance 用來減少小幅差異造成的頻繁切換,單位是毫秒;它不代表固定延遲保證。候選節點品質相近時,適度容許差異通常比追求每次測量的最低值更能維持出口穩定。

fallback 依候選順序表達優先順序:前面的節點可用時優先採用,而不是永遠選測試值最低的節點。load-balance 則依設定的分配策略處理連線,不會把單一連線拆成多條線路來疊加頻寬。涉及登入狀態、地區判定或工作階段一致性的應用程式,應考量多出口可能造成的影響,不要只因名稱中有負載平衡就預設啟用。

探測網址、間隔與延遲檢測

測試網址應穩定、回應輕量,並能代表需要觀察的連線狀況。若某個節點無法存取測試網站,卻能存取實際目標,自動策略仍可能依目前的測試條件判定該節點不適用。反過來說,測試通過也不代表所有服務都能使用。選擇測試網址時應了解這些限制,不要把它當成整個網際網路的健康狀態指標。若發生誤判,應比對實際目標請求與記錄。

縮短 interval 會提高探測頻率,也會增加請求數量與裝置資源消耗,不會直接提升節點頻寬。提供者健康檢查與策略組測試同時啟用時,還可能重複探測。有些策略組支援延遲檢測,未使用時會減少檢查;因此剛切換到該組時,可能需要等待狀態更新。應依使用習慣設定間隔,不要一律改成極短時間。

篩選條件與選擇狀態

使用 filter 或排除條件篩選提供者節點時,先確認名稱確實包含預期內容。正規表示式中的括號、直線符號與特殊字元各有意義,不能把一般描述直接當成可靠的篩選條件。訂閱改名後,策略組可能變成空組;調整篩選條件後,應展開清單檢查,而不只是確認組標題仍在。候選清單為空,通常是自動組異常的重要線索。

若用戶端或設定啟用了選擇狀態儲存,重新載入設定後可能會還原上次的手動選擇;名稱變更後則可能無法還原。測試 YAML 清單順序時,應先確認目前實際選擇的項目,不要以為永遠會使用第一項。三種自動策略的細節與使用情境,請參閱url-test、fallback 與 load-balance 比較,再決定是否需要調整現有策略組。

規則語法與比對順序

規則清單是一個依序執行的決策流程。核心由前往後檢查,命中後就採用對應出口,因此即使規則相同,順序不同也可能得到不同結果。撰寫規則時,應先列出明確例外,再加入範圍較廣的規則,最後設定兜底規則。不要把 MATCH 放在清單開頭,再期待後面的網域規則生效;兜底規則已接收所有未受限制的請求。

網域、後綴與關鍵字規則

rules:
  - DOMAIN,api.example.com,DIRECT
  - DOMAIN-SUFFIX,example.org,出口選擇
  - DOMAIN-KEYWORD,example,出口選擇
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR6,fc00::/7,DIRECT,no-resolve
  - MATCH,出口選擇

DOMAIN 比對完整網域,適合設定單一主機的例外;DOMAIN-SUFFIX 比對網域本身及其子網域;DOMAIN-KEYWORD 則依包含關係比對,範圍更廣,也更容易命中無關服務。規則中的網域不應附加 https://、路徑或查詢參數,因為此處處理的不是完整網頁網址。需要區分特定主機時,應優先使用範圍明確的規則。

每條規則最後指定的目標,必須是已存在的節點、策略組或內建出口。中文逗號不能取代英文逗號,名稱中多出的空格也會讓引用難以核對。目標不存在時,不要只檢查規則本身,也要確認前面的節點合併或策略組覆寫是否改變名稱。對於經常更新的節點集合,指向穩定的策略組名稱通常比直接指向單一節點更容易維護。

IP 規則與解析副作用

IP-CIDR 和 IP-CIDR6 依據位址網段判斷。若請求只有網域名稱,有些 IP 類規則可能需要先解析網域再進行比對。加入 no-resolve 可避免該規則為了比對而主動發起解析,但不能簡單理解為忽略所有 IP 請求:若連線已帶有目標 IP,仍可能依該位址比對。這個選項控制的是解析行為,不是直連或代理行為。

私有網段規則適合用來保護區域網路存取,但實際網路也可能包含其他位址範圍與特殊路由。不要只因某次查詢發現目標使用某個位址,就把整個寬廣的公網網段設為直連。大型服務可能共用位址,解析結果也會隨網路改變。能以明確網域設定的策略通常較穩定;若必須依 IP 分流,應了解網段範圍與更新來源。

遠端規則集與宣告方式

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

rules:
  - RULE-SET,local-services,DIRECT
  - MATCH,出口選擇

對應的規則檔採用下列結構。此處的 behavior: domain 表示載荷是網域比對內容,不是完整的逐條規則敘述。若提供者使用 classical,載荷格式與可用規則類型也會不同。規則提供者的宣告方式、檔案格式與實際內容必須一致;副檔名相同不代表內部結構相同,下載失敗時回傳的網頁也不能當成規則集載入。

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

規則集只儲存比對內容,實際採用哪個出口,則由主設定中的 RULE-SET 規則決定。規則集成功載入,不代表其中每個網域都會使用預期出口:前面的規則可能已先命中。更新規則集後,也要觀察連線頁面顯示的實際規則類型與目標。不要只為了修正一個網域,就把整組遠端規則移到最前面,以免改變原本需要優先保留的區域網路與業務例外。

連線重用與驗證方式

修改規則通常只會影響新建立的連線;既有長連線、瀏覽器連線集區與應用程式工作階段,可能繼續沿用原本的路徑。驗證時應關閉相關連線,再向明確的目標發出請求,同時觀察比對規則、策略組與最終節點。單一網頁可能存取多個網域;主文件、圖片、登入與 API 請求未必使用相同路徑。僅憑網頁能否開啟,無法判定每個子請求的策略都正確。

並非所有連線入口都能直接取得網域資訊。應用程式直接連線至 IP、使用自有解析機制或重用既有連線時,規則可取得的資訊可能不同。嗅探功能可在適用情境補充網域資訊,但無法辨識完整網址,也不保證能從所有加密連線還原資訊。排查時應以連線記錄實際顯示的中繼資料為準,不要假設核心已看到瀏覽器網址列中的所有內容。

設定覆寫、合併與驗證流程

覆寫可在保留訂閱更新能力的同時,維持本機連接埠、DNS、規則或策略選擇。關鍵不在於額外寫了一份 YAML,而在於用戶端如何合併多個來源,產生最終設定。原始訂閱、本機覆寫、用戶端偏好與執行時 API 修改,可能位於不同層級。哪一方最後決定某個欄位,沒有適用所有用戶端的通用答案,應以目前用戶端的合併說明和實際產生結果為準。

純量、映射與清單的差異

純量欄位通常由後者覆蓋前者,例如混合連接埠從一個數值變更為另一個數值。映射可能採用深度合併,也可能整段取代;清單則可能取代、插入前端、附加至後端,或交由專用指令碼處理。不要把某個用戶端的合併經驗直接套用到另一個用戶端。尤其是規則清單,整段取代會遺失原有規則;附加至後端則可能落在 MATCH 之後,導致規則無法實際比對。

欄位類型常見處理方式需要確認的事項
純量,例如 mixed-port以新值覆蓋介面是否會再次改寫
映射,例如 dns深度合併或整段取代原有子欄位是否保留
清單,例如 rules取代、前置或後置兜底與自訂規則的順序
物件清單,例如 proxy-groups依工具規則處理是否依名稱比對,是否有重名

區分訂閱內容與本機差異

節點憑證與遠端節點集合適合隨可信任的訂閱更新;監聽連接埠、區域網路權限與本機 DNS 例外則適合保留在本機。不要直接修改臨時下載的快取檔,再期待下次更新時修改內容仍會保留。也不要將目前裝置的網卡名稱、絕對路徑與本機監聽位址同步到所有裝置;不同作業系統與用戶端的資料目錄、權限機制及支援欄位都可能不同。

# 本機欄位範例;合併方式以用戶端說明為準
mixed-port: 7890
allow-lan: false
log-level: info

profile:
  store-selected: true

此範例只表示希望保留的本機欄位,不會定義規則合併演算法。profile.store-selected 用於儲存策略組選擇,與用戶端是否儲存訂閱檔是兩回事。若用戶端已有相應設定,應確認介面產生的值與覆寫值何者優先。同一欄位若在多處維護,容易出現編輯器中的值和介面顯示不一致,增加後續排錯成本。

檢查最終設定與精簡修改

開始修改前,先匯出或備份目前可用的設定,並記錄使用的用戶端、核心類型與重要開關。修改後查看最終執行設定,確認目標欄位是否存在、是否被其他層級覆蓋,以及引用的組名是否仍然有效。原始訂閱未變,但執行設定有變化,是正常的產生流程;若原始檔案修改成功,執行設定卻沒有變化,可能是編輯了錯誤的項目,或尚未觸發重新產生。

驗證可分成四個層次:先檢查 YAML 語法與核心載入狀況,再確認本機連接埠正在監聽,接著測試明確的代理請求,最後觀察規則與最終出口。每個層次都有不同的判斷依據。語法通過不代表節點可連線,節點可連線不代表系統代理已設定,瀏覽器可用也不代表終端機走代理。逐層確認,才能避免在錯誤的設定區域反覆嘗試。

mihomo -t -f ./config.yaml
lsof -nP -iTCP:7890 -sTCP:LISTEN
curl --proxy http://127.0.0.1:7890 -I https://example.com

命令列測試應與用戶端的實際環境比對。獨立核心的工作目錄、規則快取與權限可能不同,不能只因獨立測試成功就排除用戶端產生設定時的問題。重新載入設定後,請留意記錄中的解析失敗、物件不存在與監聽失敗,並優先處理最早出現的明確錯誤。後續大量連線失敗往往只是前面的載入錯誤所致,不宜逐一當成獨立的網路故障處理。

回復、分享與常見問題

若修改後導致連線中斷,先還原上一份可用設定,停用新加入的覆寫,再逐項重新加入差異。保留原始訂閱,不要用臨時測試檔覆蓋唯一副本。跨裝置同步時,只分享確實通用的內容,將本機路徑、網路介面與裝置專屬規則留在裝置端;訂閱網址與節點密碼應存放在受控位置。具體作法請參閱多裝置設定同步說明。

修改 YAML 後,用戶端為什麼仍使用舊的連接埠?
先確認修改的是目前選取的設定,再檢查用戶端連接埠設定、覆寫檔與最終執行設定。若介面偏好設定的優先順序較高,應在對應入口統一修改。重新載入後檢查監聽程序,並同步更新系統代理與應用程式手動設定的代理位址。
訂閱更新後,自訂規則為什麼消失?
直接修改訂閱快取通常會在下次更新時被取代。應使用用戶端支援的持久覆寫機制,並確認規則是前置、後置,還是整段取代。自訂規則必須位於相關廣泛規則與 MATCH 之前,才有機會命中。
同一份設定可以直接用於所有 Clash 用戶端嗎?
不能只憑名稱判斷相容性。節點協定、DNS 欄位、TUN 參數與合併機制都可能不同。先確認核心支援範圍,再保留通用部分,並將裝置與用戶端專屬設定分開。首次操作可返回快速入門教學,完成匯入後再逐步加入進階設定。

維護設定的目標,是讓每個欄位都有明確來源、每條規則都有合理順序,且每次變更都有可還原的基準。遇到問題時先縮小範圍,再逐步增加細節。需要重新安裝或比較用戶端時,請前往下載頁;需要依序完成匯入、模式選擇與連線驗證時,請返回快速入門教學,不要把參考手冊當成必須一次啟用所有欄位的清單。