Chapter 01 / Baseline
設定骨架與除錯基準
Clash 設定不是彼此獨立的選項清單,而是一條具有先後關係的處理鏈。用戶端會先讀取監聽連接埠、運作模式與 DNS 等基礎項目,再載入代理節點與策略組,接著載入規則和規則集,最後由系統代理或 TUN 將流量送入核心。任何一層引用不存在的名稱,都會影響後續行為。最常見的例子是規則指向已重新命名的策略組:設定可能仍能解析,但符合條件的流量無法依預期選擇出口。因此,進階調整的第一步不是增加更多參數,而是先建立一份能說明、能驗證、能復原的基準設定。
先分清用戶端設定與核心設定
Clash Plus、Clash Verge Rev、FlClash、Clash Nyanpasu 等圖形化用戶端通常會把設定分成兩層。第一層屬於應用程式本身,例如開機啟動、系統代理開關、設定更新週期、介面主題與服務安裝狀態;第二層才是傳給 mihomo 核心的 YAML。系統代理按鈕通常不會改寫訂閱檔案,只會變更作業系統的代理入口。TUN 開關則可能由用戶端產生一段執行時覆寫,因此在原始訂閱中找不到完全相同的欄位。排錯時應同時查看目前生效的設定與訂閱原文,不能只盯著下載下來的 YAML。
適合除錯的基礎段落應保持精簡。日誌層級先使用 info,已足以查看連線、規則命中與 DNS 錯誤;只有需要追蹤特定請求時,再暫時切換到 debug。是否需要明確填寫連接埠,取決於用戶端的管理方式;桌面用戶端可能在啟動時注入自己的連接埠。若手動維護純設定檔,可使用下方結構,但應確認連接埠未被其他代理程式占用。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
unified-delay: true
profile:
store-selected: true
store-fake-ip: true
mode: rule 表示依規則決定直連、代理或拒絕;unified-delay 讓測速標準更接近完整連線流程,但不會改變真實網路品質;store-selected 用於儲存策略組選擇,重新啟動後不必逐組重新選取;store-fake-ip 儲存 Fake-IP 對應,減少重新啟動後短時間內對應變化造成的連線波動。行動裝置若由系統回收應用程式程序,持久化設定尤其重要,但仍須由用戶端獲得正常的背景執行條件。
用最短流程建立驗證閉環
每次修改後,先確認核心能載入設定,再確認代理節點能建立連線,接著查看一個測試請求命中了哪條規則,最後才檢查目標應用程式。若日誌在設定解析階段已報錯,繼續切換節點沒有意義;若節點交握失敗,應優先處理訂閱與網路,不要先修改 DNS;若瀏覽器正常而某個應用程式失敗,再檢查該應用程式是否繞過系統代理、使用獨立 DNS 或 QUIC。依照這個順序,可以把問題鎖定在單一層級。
| 檢查層級 | 應看到的結果 | 失敗時優先處理 |
|---|---|---|
| 設定解析 | 設定成功載入,沒有欄位或縮排錯誤 | YAML 縮排、重複鍵、無效引用 |
| 節點連線 | 策略組中有可選代理並能建立工作階段 | 訂閱有效性、網路權限、協定參數 |
| 規則比對 | 日誌顯示請求命中預期規則與策略 | 規則順序、策略組名稱、規則集載入 |
| 系統接管 | 目標應用程式流量進入系統代理或 TUN | 系統代理、VPN 權限、路由衝突 |
設定檔中的縮排只使用空格,不要混入定位字元。包含冒號、井字號或特殊字元的文字可以加上引號;策略組名稱一旦被規則引用,就應保持穩定。若需要更換用戶端,先到下載頁選擇對應平台;跨平台使用可優先考慮 Clash Plus,再依作業系統與使用習慣選擇其他用戶端。遷移時先匯入同一份訂閱驗證基本連線,再遷移本機覆寫,避免直接把舊用戶端產生的執行時欄位當作通用設定複製。
Chapter 02 / Policy
策略組類型與組合方式
策略組位於節點與規則之間。規則通常不會直接綁定某個節點,而是將請求送到穩定的策略名稱,再由策略組決定使用哪個出口。如此一來,節點變更時可以維持規則不動,也能將手動選擇、自動測速、故障切換與負載分配拆成不同層次。設計策略組時最重要的原則是名稱清楚、層級有限、用途單一。一個組同時負責地區選擇、業務分類與自動切換,短期看似省事,後續排錯時卻很難知道最後選中了哪條路徑。
select、url-test、fallback 與 load-balance
select 是手動選擇組,適合總入口以及需要人工固定出口的業務。它不會主動判斷節點品質,目前節點失效後仍可能維持原本的選擇。url-test 會依指定網址進行連通性測試,並根據結果選擇表現合適的節點,適合日常自動選擇。fallback 依清單順序優先使用前方可用節點,適合重視出口穩定性、希望明確區分主備的情境。load-balance 會將連線分配至多個節點,適合能接受出口變化的平行請求,但登入工作階段、風控敏感服務及依賴固定來源位址的業務通常不適合。
proxy-groups:
- name: 總選擇
type: select
proxies:
- 自動選擇
- 故障切換
- DIRECT
- name: 自動選擇
type: url-test
use:
- main-provider
url: https://www.gstatic.com/generate_204
interval: 600
tolerance: 80
lazy: true
- name: 故障切換
type: fallback
use:
- main-provider
url: https://www.gstatic.com/generate_204
interval: 600
lazy: true
interval 是檢測間隔,設定過短會增加節點與裝置的喚醒頻率,行動裝置還可能增加背景耗電;設定過長則會延遲發現故障。tolerance 用於減少相近結果之間的頻繁切換,不是速度加成,而是穩定性門檻。lazy: true 表示實際使用組別時才進行檢測,適合降低閒置時的開銷。測試網址應回傳輕量且穩定的回應,不要把檔案下載網址當作健康檢查目標,也不要用單次測試結果取代長時間穩定性判斷。
策略組應以業務語意命名
建議先保留一個「總選擇」作為統一出口,再依業務建立「串流媒體」「開發服務」「即時通訊」等策略。業務組內部可以引用「總選擇」、地區組或 DIRECT,規則只引用業務組。如此更換節點來源時,只需調整底層組,規則層即可保持穩定。組名可以使用中文,但修改名稱時要同步檢查 rules、rule-providers 的行為欄位,以及其他策略組中的引用。名稱的大小寫與空格都屬於識別的一部分,多一個空格也會變成不同名稱。
- name: 開發服務
type: select
proxies:
- 總選擇
- 自動選擇
- DIRECT
- name: 串流媒體
type: select
proxies:
- 總選擇
- 自動選擇
rules:
- DOMAIN-SUFFIX,github.com,開發服務
- DOMAIN-SUFFIX,githubusercontent.com,開發服務
- MATCH,總選擇
節點較多時,不必把所有名稱逐一寫入 proxies,可以透過代理提供者的 use 引入,再搭配篩選運算式縮小範圍。篩選效果取決於訂閱中的節點命名品質;若不同供應來源的命名規則不一致,只靠地區關鍵字很容易誤選。應先在用戶端查看實際節點名稱,再編寫篩選條件;更新訂閱後也要檢查是否出現新的命名。排除測試節點、過期提示節點與倍率標記時,要避免運算式過寬而讓正常節點一併消失。
| 組類型 | 適用目標 | 主要限制 |
|---|---|---|
| select | 人工固定出口、總入口、業務選擇 | 不會自動避開失效節點 |
| url-test | 日常自動選擇、節點較多的訂閱 | 測試結果不等同於實際業務體驗 |
| fallback | 明確主備順序、穩定出口 | 需要持續維護清單順序 |
| load-balance | 可平行處理且不依賴固定出口的連線 | 可能觸發工作階段或來源位址變更 |
策略組排錯應從引用關係開始。先確認規則命中的組名,再開啟該組查看目前選擇,繼續往下追蹤至實際節點。若自動組看似沒有切換,請檢查測試網址是否可連線、檢測間隔是否尚未到期,以及用戶端是否暫停背景活動。若某項服務頻繁要求重新登入,將它從負載分配組移至固定出口組測試。策略層的目標不是堆疊更多自動化,而是讓每次選擇都能從日誌與組結構中得到解釋。
Chapter 03 / Rules
以規則集訂閱管理
當規則從十幾條增加到數百條後,繼續把全部內容塞進主設定會迅速失去可維護性。rule-providers 用於將不同主題的規則拆成獨立資源,由主設定宣告下載網址、格式、更新週期與比對行為。主檔案只保留呼叫順序,規則內容則由對應規則集維護。如此可以單獨更新廣告攔截、區域網路、開發服務或串流媒體規則,也能在某個規則集異常時快速停用,不必重寫整份訂閱。
provider 定義與 RULE-SET 呼叫
規則提供者的名稱只是本機引用識別,真正影響解析的是 behavior、format 與資源內容。behavior: domain 適合只包含網域類項目的集合;ipcidr 用於 IP 網段;classical 可容納帶有類型前綴的傳統規則。格式必須與遠端檔案一致,常見純文字規則可使用 text,YAML 規則使用 yaml。不要將 classic 內容宣告為 domain,否則即使載入成功,也不代表比對語意正確。
rule-providers:
private-domain:
type: http
behavior: domain
format: yaml
path: ./ruleset/private-domain.yaml
url: https://example.com/rules/private-domain.yaml
interval: 86400
developer:
type: http
behavior: classical
format: text
path: ./ruleset/developer.list
url: https://example.com/rules/developer.list
interval: 86400
rules:
- RULE-SET,private-domain,DIRECT
- RULE-SET,developer,開發服務
- GEOIP,LAN,DIRECT,no-resolve
- MATCH,總選擇
範例網域只用來表示欄位結構,實際使用時應替換為已確認可存取且內容可信的規則來源。path 是本機快取位置,不同提供者不要共用同一路徑。interval 以秒為單位,公共規則通常沒有必要每隔幾分鐘更新一次;過於頻繁只會增加請求與寫入。更新失敗時,核心通常會繼續使用既有快取,因此排錯時要區分「首次下載失敗」與「更新失敗但舊規則仍在生效」。刪除快取後重試會失去這個回復條件,不應作為第一步操作。
規則順序就是優先級
Clash 會由上而下尋找第一條符合的規則,命中後便不再繼續。具體規則應放在寬泛規則之前:私人網域與區域網路通常先直連,業務網域再進入對應策略,IP 規則放在需要解析位址的位置,最後由 MATCH 接住其餘流量。將大範圍代理規則放在頂部,後面的直連例外就永遠不會執行。排查錯誤分流時,日誌顯示的「命中哪條規則」比猜測網域屬於哪個分類更可靠。
no-resolve 表示比對 IP 類規則時,不要為了取得 IP 而主動觸發 DNS 解析。它可以避免不必要的解析,但不適合機械式地加在所有規則後面。若網域請求前方沒有網域規則,而後續又依賴 GEOIP 判斷,完全阻止解析可能使該規則無法取得所需位址。是否加入應依規則類型與 DNS 模式決定。對於已直接取得目標 IP 的連線,IP 規則仍可正常比對。
少量本機例外可以直接寫在 rules 頂部,不必為三五個項目建立遠端規則集。例如某個工作網域必須直連,或某個應用程式介面必須固定使用「開發服務」,將這些規則放在訂閱規則集之前即可。若例外數量持續增加,再移轉至本機 provider。如此既能保持主設定可讀,也能避免每次微調都發布遠端檔案。
rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,corp.example,DIRECT
- DOMAIN-SUFFIX,github.com,開發服務
- RULE-SET,private-domain,DIRECT
- RULE-SET,developer,開發服務
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- MATCH,總選擇
規則集故障的定位順序
先查看 provider 狀態是否完成載入,再確認遠端回應內容與宣告格式相符,接著檢查規則集名稱是否與 RULE-SET 引用一致,最後檢查呼叫位置。狀態正常但始終未命中,常見原因是行為類型錯誤、規則被前面的寬泛項目攔截,或目標連線只暴露 IP 而規則集只有網域。更新後突然出現大量錯誤分流時,可以還原上一份本機快取或暫時註解該規則集,確認問題是否來自上游內容變更。
規則來源越多,更新節奏與命名越難統一。更穩妥的結構是依用途選擇少量規則集,每項業務只設定一個主要來源,本機例外則作為最高優先級。不要同時引入多個涵蓋範圍相近的全集規則,再期待順序自動解決衝突。需要同步多部裝置時,可參考多裝置設定同步方案,將主設定、訂閱連結與本機規則分開管理。
Chapter 04 / DNS
DNS 設定最佳化與洩漏排查
DNS 決定網域如何轉換為位址,也直接影響網域規則能否準確比對。Clash 開啟 DNS 模組後,應用程式的查詢可以先進入本機監聽,再由核心依設定選擇上游解析器。這裡要解決三個問題:查詢是否真正進入 Clash、不同網域應交給哪個上游,以及解析結果是否能與後續連線保持對應。單純堆疊許多公共 DNS 位址不會自動提高穩定性,反而可能讓結果來源與故障邊界變得模糊。
nameserver、default-nameserver 與 proxy-server-nameserver
nameserver 是主要上游解析器。default-nameserver 用於解析 DoH 或代理伺服器本身的網域,因此通常填寫可直接連線的 IP 形式解析器,避免為了連線解析器而再次需要解析網域。proxy-server-nameserver 可專門處理代理節點網域,避免節點位址解析受到業務 DNS 規則影響。若訂閱節點使用網域而這一層解析失敗,介面可能顯示所有節點同時不可用,但根因並不在節點協定。
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
respect-rules: true
default-nameserver:
- 223.5.5.5
- 1.1.1.1
nameserver:
- https://dns.alidns.com/dns-query
- https://1.1.1.1/dns-query
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
fake-ip-filter:
- "*.lan"
- "*.local"
- "time.*.com"
- "ntp.*.com"
respect-rules 讓 DNS 請求參考代理規則,但這要求代理解析鏈已能運作,否則可能形成究竟是先有代理還是先有解析的循環依賴。設定初期若遇到上游無法連線,可以先關閉此項驗證基本解析,再逐步啟用。listen 需要配合用戶端的 DNS 接管方式;桌面端由 TUN 接管時,通常不需要讓區域網路裝置存取該連接埠;若設定為對外監聽,還應同時檢查防火牆與區域網路存取範圍。
解析器數量與 fallback 邏輯
主要解析器選擇兩到三個穩定來源通常已經足夠。不同解析器回傳的位址可能受網路位置、CDN 調度與快取影響,清單越長不代表結果越準確。若使用 fallback,需要同時理解篩選條件,否則所有查詢都可能進入多路解析,增加等待時間與網路請求。對規則清楚的設定,優先使用 nameserver-policy 依網域指定解析器,比依賴寬泛的回退判斷更容易理解。
nameserver-policy:
"geosite:private":
- system
"+.corp.example":
- 10.0.0.53
"geosite:cn":
- https://dns.alidns.com/dns-query
策略中的網域比對應與實際規則集能力一致。企業內網網域只能由內部 DNS 解析時,必須確保通往內部解析器的路由是直連或能抵達辦公網路。將內部解析器放入通用 nameserver,離開辦公網路後會導致查詢持續逾時;更合適的方式是只對特定後綴使用它。若系統同時執行其他 VPN、網路過濾器或安全軟體,還要確認它們沒有在 Clash 之前先改寫 DNS。
DNS 洩漏要先定義觀察範圍
所謂 DNS 洩漏,通常是指原本應由指定路徑處理的查詢,仍被系統或應用程式直接送往其他解析器。檢查時不能只看某個網頁顯示的解析器名稱,應結合作業系統網路設定、Clash 日誌與封包擷取結果判斷。瀏覽器可能啟用自己的安全 DNS,行動應用程式也可能內建 DoH;這類請求看起來像普通 HTTPS 流量,不一定會經過系統的 53 連接埠。若希望統一交由 Clash 處理,應關閉應用程式內的獨立解析,或透過規則明確處理其 DoH 網域。
| 現象 | 可能斷點 | 檢查動作 |
|---|---|---|
| 所有節點網域解析失敗 | default 或 proxy-server-nameserver 無法連線 | 使用 IP 解析器建立最小啟動鏈 |
| 瀏覽器正常,單一應用程式失敗 | 應用程式內建 DNS、QUIC 或繞過系統代理 | 查看 TUN 接管與應用程式網路設定 |
| 內網網域無法解析 | 內部 DNS 未依網域分流 | 加入 nameserver-policy 並檢查路由 |
| 解析正常但連線至錯誤位址 | 快取、CDN 調度或 Fake-IP 對應異常 | 核對日誌後再清理對應快取 |
修改 DNS 後應重新載入設定,並確認日誌中 DNS 模組已成功監聽,再分別測試一般網域、內網網域與節點網域。不要一遇到網頁打不開就清除全部快取,這會同時改變系統快取、瀏覽器快取與 Fake-IP 對應,使前後結果難以比較。若用戶端顯示已連線但完全無法上網,可依已連線卻無法上網排查清單,依序檢查節點、訂閱、DNS、系統代理與 TUN。
Chapter 05 / Network stack
TUN 模式與 Fake-IP 協同運作
系統代理只能涵蓋主動遵循代理設定的應用程式。命令列工具、部分遊戲、獨立網路堆疊應用程式,以及直接發起 UDP 的程式,可能完全繞過系統代理。TUN 模式透過虛擬網路介面接管系統路由,將這些流量送入 Clash 核心,因此涵蓋範圍更完整。Fake-IP 則在 DNS 階段回傳一段對應位址,讓核心在收到連線時還原原始網域並執行網域規則。兩者經常一起使用,但負責的是不同工作:TUN 負責把流量帶進來,Fake-IP 負責保留網域語意。
TUN 欄位與系統權限
tun:
enable: true
stack: mixed
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
strict-route: true
mtu: 1500
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
stack 決定 TUN 使用的網路堆疊實作。mixed 在支援的核心中兼顧相容性與效能;若特定平台出現異常,可分別測試 system 或 gvisor,但不要在沒有對照的情況下頻繁切換。auto-route 會自動寫入路由,auto-detect-interface 會嘗試識別目前的出口網卡;裝置在 Wi-Fi、行動網路與有線網路之間切換時,這項功能能減少手動指定介面的維護。strict-route 會更嚴格地防止流量繞過,但可能暴露與其他 VPN、虛擬機器及容器網路之間的路由衝突。
TUN 啟動需要系統層級 VPN 或網路延伸功能權限。Windows 用戶端可能透過服務模式提升網路操作權限;macOS 需要允許網路延伸功能;Android 與 iOS 會顯示系統 VPN 授權。權限遭拒時,介面開關可能短暫開啟後恢復,日誌中也會出現建立裝置或寫入路由錯誤。此時反覆匯入訂閱沒有作用,應先處理系統授權。macOS 的具體彈窗與復原步驟可參考網路延伸功能與鑰匙圈處理指南。
Fake-IP 的對應流程
Fake-IP 模式收到網域查詢後,不會立即將真實位址直接交給應用程式,而是從保留位址範圍分配一個對應值。應用程式連線至該位址時,核心會依對應表還原網域,然後比對 DOMAIN、DOMAIN-SUFFIX 或規則集。它的優點是,即使應用程式只將目標位址交給網路層,Clash 仍能掌握原始網域。對應位址不是遠端伺服器位址,也不應拿來進行公網路由測試。看到 198.18.0.0/16 範圍的結果,通常表示 Fake-IP 正常參與解析。
某些區域網路探索、時間同步、列印裝置、遊戲平台或依賴真實 DNS 回應的程式不適合使用 Fake-IP,需要加入 fake-ip-filter。過濾範圍應盡量具體。直接排除過大的網域集合,會讓大量請求回到真實位址模式,削弱網域還原效果,也可能使規則依賴 IP 比對。出現相容性問題時,先從日誌確認網域,再加入單一後綴並重新測試,不要複製來源不明的超長過濾清單。
MTU、UDP 與網路切換
頁面能開啟,但部分圖片、上傳或特定應用程式卡住時,可能是路徑 MTU 不合適。TUN 封裝會增加額外負載,底層網路若已存在 VPN、PPPoE 或行動網路限制,1500 位元組可能導致分片或封包遺失。在保留其他設定不變的前提下,可以逐步降低 MTU,例如先測試約 1400 的範圍,並觀察問題是否穩定消失。MTU 不是越小越安全;過小會增加封包數量與處理負載,確認有效後應選擇能穩定運作的較大值。
UDP 問題要區分三個層面:應用程式是否發出 UDP、TUN 是否接管,以及節點協定與網路是否支援對應傳輸。DNS 查詢、QUIC、遊戲與語音都可能使用 UDP。關閉 QUIC 後瀏覽器恢復,只能說明故障集中在 UDP 路徑,不代表 DNS 或節點整體不可用。行動裝置在 Wi-Fi 與行動網路切換後,舊工作階段可能仍綁定原介面;必要時重新連線 TUN,不要立即清除全部設定。
| 接管方式 | 涵蓋範圍 | 適用情境 |
|---|---|---|
| 僅系統代理 | 遵循 HTTP 或 SOCKS 代理設定的應用程式 | 瀏覽器、一般桌面應用程式、低權限環境 |
| TUN + redir-host | 更廣泛的 TCP/UDP 流量,DNS 回傳真實位址 | 需要真實位址相容性的環境 |
| TUN + Fake-IP | 廣泛接管並保留網域比對能力 | 規則分流複雜、應用程式會繞過系統代理的裝置 |
建議的啟用順序是:先使用系統代理確認節點與規則可用,再單獨開啟 TUN,確認路由與權限正常,最後啟用 Fake-IP 並處理少量相容性例外。若開啟 TUN 後整台裝置斷網,先關閉它以恢復網路,再檢查預設路由、DNS 劫持與其他 VPN。Windows 的服務模式、連接埠衝突與系統代理步驟可查看Windows 安裝設定完整流程。
Chapter 06 / Sniffer
網域嗅探與規則還原
有些連線進入 Clash 時只攜帶目標 IP,沒有可直接用於網域規則的主機名稱。網域嗅探會檢查連線初期可識別的資訊,例如 TLS ClientHello 中的 SNI 或 HTTP 請求中的 Host,再將取得的網域用於規則比對。它不是讀取完整業務內容,也不能保證每條連線都能還原網域;加密用戶端交握、非標準協定、直接使用 IP 的請求,以及部分 UDP 流量,都可能沒有適合嗅探的欄位。
基礎設定與協定範圍
sniffer:
enable: true
force-dns-mapping: true
parse-pure-ip: true
override-destination: false
sniff:
HTTP:
ports:
- 80
- 8080-8880
override-destination: true
TLS:
ports:
- 443
- 8443
QUIC:
ports:
- 443
skip-domain:
- "+.push.apple.com"
- "Mijia Cloud"
parse-pure-ip 允許針對只顯示 IP 的目標嘗試解析協定特徵;force-dns-mapping 搭配 Fake-IP 對應,協助還原連線與 DNS 查詢之間的關係。override-destination 決定嗅探取得網域後是否重寫目標。全域開啟重寫可能改善網域規則命中,也可能讓依賴原始位址的連線出現相容性問題,因此較穩妥的方式是全域維持關閉,只在確認適合的 HTTP 等協定範圍內開啟。
連接埠範圍不應無限擴大。HTTP 嗅探通常涵蓋明確的網頁連接埠,TLS 主要關注 443 與業務使用的加密連接埠,QUIC 則集中在 UDP 443。將所有連接埠交給所有協定解析器,會增加無效判斷,也可能誤判非標準二進位協定。遇到使用特殊連接埠的業務時,先從日誌確認協定與連接埠,再加入範圍。連接埠區段寫得過寬不會增加實際可見資訊,只會擴大解析嘗試。
嗅探與 Fake-IP 的關係
Fake-IP 已能為多數透過 DNS 發起的連線保留網域,嗅探更像是補充路徑:當應用程式繞過系統 DNS、直接連線至快取 IP,或連線資訊未能與對應關聯時,嗅探可能重新取得網域。兩者同時啟用不代表會重複執行同一件事。Fake-IP 在解析階段建立對應,嗅探則在連線階段觀察協定中繼資料。排查規則命中時,應查看日誌最後使用的是對應網域、嗅探網域還是原始 IP。
若關閉嗅探後某項服務總是落到 MATCH,開啟後便能命中網域規則,表示原始連線缺少可用的網域上下文。反過來,若開啟後連線被送往錯誤策略,應檢查嗅探取得的網域是否屬於共享 CDN、重新導向網域或第三方介面。一個應用程式往往會同時存取多個網域,不能只憑主站網域推斷所有連線。可以暫時提高日誌層級,完成一次短測試後恢復 info,避免長期記錄大量連線細節。
跳過清單與相容性邊界
skip-domain 用於排除已知不適合改寫或解析的網域。項目應來自實際故障驗證,而不是一次加入大範圍清單。某些裝置探索與推送服務會使用憑證網域、連線位址與業務識別不完全一致的機制,錯誤重寫可能造成重複連線。加入跳過項後要重新連線對應應用程式,因為舊連線不會自動依新規則重建。
| 日誌表現 | 說明 | 下一步 |
|---|---|---|
| 只看到目標 IP | 未取得網域或協定無法嗅探 | 檢查 DNS 接管、協定與連接埠範圍 |
| 取得網域但仍命中 MATCH | 規則缺少該網域或順序遭攔截 | 核對實際網域並調整規則位置 |
| 開啟重寫後連線失敗 | 目標依賴原始位址或識別結果不適合重寫 | 關閉全域重寫或加入精確跳過項 |
| 瀏覽器正常,QUIC 異常 | UDP 路徑、節點能力或 QUIC 嗅探問題 | 關閉 QUIC 作為對照並檢查 TUN UDP |
驗證嗅探設定時,選擇一個規則明確的網域,先記錄關閉嗅探時的命中結果,再開啟嗅探並重新建立連線進行比較。不要同時修改 DNS、規則集與目標策略,否則無法判斷變化來自哪一層。若只在系統代理模式下測試瀏覽器,瀏覽器本身通常已向代理提供網域,嗅探帶來的差異可能很小;它更適合 TUN 接管、純 IP 連線與繞過系統 DNS 的情境。
網域嗅探不能取代規則設計。還原網域後,仍需要具體規則位於寬泛規則之前,並確保對應策略組存在。若應用程式會存取大量動態子網域,優先使用已核對的後綴規則或規則集,不要持續追加單一完整網域。相關術語可在術語手冊中查閱,內容涵蓋 SNI、Fake-IP、TUN 與規則模式之間的關係。
Chapter 07 / Merge
本機覆寫與多重訂閱合併
訂閱負責提供遠端維護的節點與基礎設定,本機覆寫則負責儲存裝置或個人環境特有的調整。若直接在同一檔案中修改兩者,下一次訂閱更新很可能覆蓋本機內容;完全複製成靜態設定又會失去節點更新。更合理的結構是將訂閱視為上游輸入,把連接埠、DNS、策略組補充、規則前置與 TUN 設定放入可重複套用的覆寫層。不同用戶端支援的覆寫機制名稱可能不同,例如 Merge、Mixin、Script 或全域擴充,但目標都是在更新後重新產生生效設定。
區分取代、追加與深度合併
YAML 物件可以依鍵合併,但陣列有不同語意。修改 dns.enable 通常只會取代單一欄位;處理 rules 時,則要明確是前置規則、後置規則,還是取代整個陣列。若合併器直接以新陣列覆蓋舊陣列,一段只含三條本機規則的覆寫,可能讓訂閱原有規則全部消失。使用用戶端內建合併功能前,應查看最終生效的設定,而不是只確認覆寫片段是否成功儲存。
prepend-rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,corp.example,DIRECT
append-rules:
- MATCH,總選擇
override:
mode: rule
log-level: info
ipv6: false
上方結構用於說明「前置、後置、取代」三種意圖,具體鍵名取決於用戶端的合併實作,未經確認不能直接當作 mihomo 原生設定載入。mihomo 最終接收的仍是一份完整設定。驗證方式是開啟用戶端產生的執行時設定,確認本機規則位於預期位置、策略組沒有重複,且最終只保留一個 MATCH。若用戶端提供設定檢查功能,應在每次更新後執行一次。
多重訂閱合併以節點層為主
同時使用多份訂閱時,最穩定的方式通常是將它們宣告為不同的 proxy-providers,由本機策略組透過 use 引入,而不是直接拼接多份完整設定檔。完整設定往往各自帶有連接埠、DNS、策略組與規則,同名鍵會互相覆蓋,同名組會產生衝突,最後結果取決於合併工具的實作。節點提供者只負責節點集合,本地主設定負責統一策略與規則,職責更清楚。
proxy-providers:
primary:
type: http
url: https://example.com/subscription/primary
path: ./providers/primary.yaml
interval: 86400
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 600
backup:
type: http
url: https://example.com/subscription/backup
path: ./providers/backup.yaml
interval: 86400
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 900
proxy-groups:
- name: 總選擇
type: select
use:
- primary
- backup
proxies:
- DIRECT
範例中的訂閱網址只是結構示意,使用時應換成自己的有效網址,並避免將包含存取憑據的連結公開於文件、截圖或共用儲存庫。兩個 provider 必須使用不同的快取路徑。健康檢查間隔可依裝置與節點數量調整,行動裝置不宜高頻輪詢大量節點。若上游節點名稱重複,介面可能難以區分來源,可以在合併層使用用戶端支援的前綴功能,或讓不同 provider 進入獨立地區組,而不是直接混在同一個長清單中。
更新失敗與設定漂移
多重訂閱環境常見的問題,不是某次設定無法載入,而是執行一段時間後逐漸偏離預期。上游可能修改節點命名,導致篩選運算式失效;刪除某個地區後,策略組變成空組;新增同名節點後,手動選擇指向另一個來源。更新後應檢查 provider 狀態、策略組成員數量是否合理,以及關鍵業務規則是否仍指向存在的組。不要用虛構的固定節點數量作為監控條件,應關注「組是否為空」「引用是否存在」及「關鍵請求是否命中」。
跨裝置同步時,不建議直接同步用戶端的整個資料目錄。桌面端與行動端的權限、路徑、TUN 介面名稱及快取位置都不同。更適合同步的是訂閱入口、本地主設定範本、規則集與覆寫邏輯,裝置專屬項目則留在各自用戶端。WebDAV、訂閱分發與手動匯入的差異,可繼續閱讀Clash 多裝置設定同步方案。
| 內容 | 適合遠端維護 | 適合本機保留 |
|---|---|---|
| 節點集合 | 訂閱或 proxy-provider | 暫時測試節點 |
| 公共規則集 | rule-provider | 少量裝置與內網例外 |
| 策略組骨架 | 受控主設定 | 手動選擇狀態與裝置差異 |
| TUN、連接埠、權限相關項目 | 通常不直接跨平台同步 | 依裝置與系統維護 |
Chapter 08 / Controller
外部控制面板與執行維護
mihomo 提供外部控制介面,用戶端介面與瀏覽器控制面板可以透過它讀取策略組、切換節點、查看連線、重新整理 provider 及觀察日誌。控制介面只負責管理正在執行的核心,不會取代設定檔。面板中暫時切換策略可以立即生效,但新增規則、調整 DNS 或變更 TUN 參數仍需修改設定並重新載入。將控制介面理解為執行狀態入口,比把它當作設定編輯器更準確。
監聽位址、密鑰與存取範圍
external-controller: 127.0.0.1:9090
secret: "your-password"
external-ui: ./ui
external-ui-name: dashboard
僅在本機使用時,控制位址應監聽 127.0.0.1。設定為 0.0.0.0 會接受來自其他網路介面的連線,只有明確需要進行區域網路管理並已設定防火牆時才應採用。secret 用於介面驗證,應使用自行產生的獨立值,不要與訂閱存取參數或其他帳戶共用。面板頁面與控制介面可以部署在不同位置,但瀏覽器仍必須能存取介面位址,並符合協定、安全內容環境與跨來源條件。
遠端管理不應直接將控制連接埠暴露於公共網路。較穩妥的方式是在可信任的區域網路中存取,或先透過受控的安全通道進入裝置網路。若只需要查看家中路由器上的 Clash 狀態,應限制來源位址並保留防火牆規則。控制介面能切換出口、終止連線與讀取執行資訊,存取範圍應與路由器管理頁面同樣謹慎。
連線頁與日誌如何搭配
連線清單通常會顯示來源、目標、協定、規則、策略鏈與流量狀態。排查某個應用程式時,先清除觀察範圍或依目標篩選,再重新觸發一次請求。策略鏈能說明請求先進入哪個業務組,最後落到哪個節點;規則欄位則能說明是哪條規則完成比對。如果頁面打不開但連線清單完全沒有紀錄,問題通常發生在流量進入核心之前,應回到系統代理、TUN 路由或應用程式自身的代理設定檢查。
日誌層級維持 info 適合日常使用。需要定位 DNS、交握或嗅探細節時,可以短時間切換到 debug,重現一次後立即恢復。長期開啟詳細日誌會增加輸出量,也會讓真正的錯誤被大量正常紀錄淹沒。分享日誌前應檢查其中的訂閱網址、內網網域、目標位址與驗證欄位,只截取與故障時間點相關的片段。
provider 重新整理與策略狀態
控制面板通常允許手動重新整理代理提供者與規則提供者。重新整理按鈕只會觸發對應資源更新,不等於重新載入整份設定。代理 provider 更新後,新節點會進入引用它的策略組,但目前連線不會全部自動遷移;規則 provider 更新後,新請求會依新規則比對,既有長連線仍可能維持原策略。驗證更新結果時,應重新建立測試連線並查看 provider 的最後錯誤狀態,而不是只看按鈕是否完成旋轉。
儲存策略選擇取決於 profile.store-selected 以及用戶端資料目錄的權限。若每次重新啟動都回到預設節點,先確認該欄位是否存在於最終設定,再檢查用戶端是否能寫入執行目錄。多份設定使用相同組名時,持久化狀態也可能讓切換後的結果看起來與預設設定不一致。測試時可以新建名稱明確的組,確認儲存機制正常後,再處理舊狀態。
| 面板功能 | 適用用途 | 無法取代 |
|---|---|---|
| 策略切換 | 即時選擇出口與對照測試 | 策略組結構設計 |
| 連線查看 | 確認規則、策略鏈與協定 | 系統層封包擷取與路由檢查 |
| Provider 重新整理 | 更新節點集合或規則資源 | 完整設定重新載入 |
| 日誌觀察 | 定位解析、連線與規則錯誤 | 長期效能結論 |
一套可重複的維護順序
日常維護可以固定為四個步驟:先更新訂閱與 provider,確認所有資源載入完成;再驗證「總選擇」與關鍵業務組仍有可用成員;接著用一個網域請求和一個需要 TUN 的應用程式檢查規則鏈;最後恢復常用日誌層級並匯出目前可用的設定。若更新後出現異常,先比較變更範圍:只有節點變化就檢查 provider 與策略組,只有規則集變化就檢查命中順序,只有用戶端升級或系統網路變更後才重點檢查權限與路由。
控制面板無法連線時,先確認核心仍在執行,再檢查控制位址、連接埠占用與密鑰。使用瀏覽器存取本機面板,卻連線至遠端裝置介面時,還要確認位址沒有寫成瀏覽器所在裝置的 127.0.0.1。若用戶端本身已內建控制頁面,優先使用內建入口,通常會自動處理目前的連接埠與驗證資訊。需要重新選擇用戶端時,可前往選型指南查看平台差異,安裝套件統一從下載頁進入。