mihomo 設定參考

Clash 設定進階手冊

從策略組、規則集與 DNS 開始,逐層拆解 TUN、Fake-IP、網域嗅探、本機覆寫、多訂閱合併與外部控制面板。重點不在堆疊參數,而是說明參數如何共同決定一條連線的去向。

如果尚未完成安裝、訂閱匯入與首次連線,請先依照使用指南完成基礎流程。本頁適合已能正常使用客戶端、需要長期維護設定的使用者。客戶端安裝檔與平台差異集中在下載頁,常見啟動錯誤可在常見問題中快速定位。

mihomo 核心 YAML 設定 規則與 DNS 聯調 桌面與路由器情境
CHAPTER 01

策略組類型與實際組合

先區分「選節點」與「做判斷」

策略組位於規則與代理節點之間。規則只負責將連線交給某個策略名稱,真正決定使用哪條線路的是策略組。將兩者混在一起,常見結果是設定中重複出現大量節點名稱;節點一旦調整,規則也得跟著修改。更穩妥的結構是先依用途建立穩定的策略組,例如「節點選擇」「自動選擇」「串流媒體」「即時通訊」與「漏網之魚」,規則長期引用這些名稱,節點變動則交由訂閱與策略組處理。

select 是手動選擇組,適合需要明確控制出口的情境。使用者可在客戶端介面中選擇節點、另一個策略組或 DIRECT;選項會維持到設定重新載入,或持久化狀態發生變化為止。它不會主動檢測線路品質,因此最適合作為頂層入口:下方可同時放入「自動選擇」「故障轉移」與數個地區組。如此既能保留自動化,也能在特定網站發生相容性問題時快速切換。

url-test 會依指定網址定期進行連通性測試,並選擇結果較佳的節點。它適合網頁瀏覽、軟體更新等對回應時間敏感,且可重新建立連線的流量。測試結果只反映測試目標的連線狀況,不等同於所有網站的實際速度;節點連到測試網址很快,也可能繞路連往目標服務。因此不要把檢測間隔設得過短,更不要把單次測試視為線路品質的永久結論。

fallback 依清單順序選擇第一個可用項目。它重視穩定的優先順序,而不是每次都追求最低延遲。主線路固定、備援線路僅在故障時接手的情境,更適合使用此類型。load-balance 則會將不同連線分配到多個節點,可用於大量並行且彼此獨立的請求;但同一服務若同時看到多個出口位址,可能觸發登入狀態變更或風控。網路銀行、帳號管理與持續性工作階段不應任意交給負載平衡組。

類型 決策方式 適用情境 主要限制
select 使用者手動指定 頂層出口、地區切換 不會主動避開失效節點
url-test 選擇測試結果較佳的項目 網頁、更新、一般應用程式 測試目標不能代表所有服務
fallback 依順序使用第一個可用項目 主備線路、固定優先順序 切換後既有連線可能需要重新建立
load-balance 依策略分配不同連線 並行下載、獨立請求 多出口可能影響工作階段一致性

使用 provider 管理動態節點

訂閱節點經常增刪,若直接在每個策略組內寫入完整節點清單,設定很快就會失去可維護性。mihomo 可透過 use 引用 proxy-providers,再使用 filterexclude-filter 依節點名稱篩選。篩選運算式只處理名稱,不會驗證節點的實際位置,因此應以訂閱中穩定的命名規則為基礎。若服務提供者頻繁更名,優先使用一個包含全部節點的自動組,再將少量特殊線路手動放入專用組。

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

proxy-groups:
  - name: 節點選擇
    type: select
    proxies:
      - 自動選擇
      - 故障轉移
      - DIRECT

  - name: 自動選擇
    type: url-test
    use:
      - primary
    url: https://www.gstatic.com/generate_204
    interval: 600
    tolerance: 80

  - name: 故障轉移
    type: fallback
    use:
      - primary
    url: https://www.gstatic.com/generate_204
    interval: 600

tolerance 用於減少小幅波動造成的頻繁切換。兩條線路只有幾毫秒差異時,持續更換出口往往比維持目前線路更糟。檢測網址應回傳輕量、穩定且可存取的回應;若檢測目標本身被規則直連、遭 DNS 錯誤解析,或所在網路無法連達,整組健康狀態都會失真。排查時先確認檢測請求實際經過哪條鏈路,再判斷節點是否真的無法使用。

策略組排序也會影響操作體驗。頂層手動組應放在規則直接引用的位置,地區組與自動組作為下層能力,避免形成循環引用。例如 A 組包含 B,B 又包含 A,核心便無法取得有效出口。修改後先在客戶端的策略頁面確認每個組都有可選項,再查看連線記錄中的「規則名稱—策略組—實際節點」三段資訊。若想進一步理解規則由上而下的匹配順序,可閱讀自訂規則語法與優先順序詳解

CHAPTER 02

規則集訂閱化管理

從單條規則拆分至 rule-provider

少量自訂規則可以直接寫在 rules 中,但當網域、網段與應用程式分類達到數百條後,主設定會變得難以審閱。規則集的作用是將規則內容拆成獨立檔案,由 rule-providers 負責下載、快取與定期更新,主規則清單只保留引用順序。如此可分別維護廣告過濾、私人網路、特定服務與地區網路規則,也能在某個來源異常時單獨停用,而不必替換整個訂閱。

provider 的 behavior 決定檔案內容的解讀方式。domain 面向網域集合,適合純網域分類;ipcidr 面向 IPv4 與 IPv6 網段;classical 接收帶有類型的完整規則,例如 DOMAIN-SUFFIXPROCESS-NAMEIP-CIDR。三者不能任意互換。若宣告為 domain 的檔案中塞入完整規則語法,載入時可能回報格式錯誤,或內容無法依預期匹配。

format 常見為 yamltext 或二進位規則格式。YAML 便於人工審閱,文字格式適合一行一條的簡單來源。無論選擇哪種格式,都要讓宣告與遠端檔案的實際內容一致。path 是本機快取位置,不同 provider 不應共用同一檔案,否則後下載的內容會覆蓋前者。桌面客戶端通常會代管設定目錄,相對路徑比寫死某個使用者目錄更容易移轉。

rule-providers:
  private-network:
    type: http
    behavior: classical
    format: yaml
    path: ./rules/private-network.yaml
    url: "https://example.com/rules/private-network.yaml"
    interval: 86400

  service-domains:
    type: http
    behavior: domain
    format: yaml
    path: ./rules/service-domains.yaml
    url: "https://example.com/rules/service-domains.yaml"
    interval: 86400

  regional-cidr:
    type: http
    behavior: ipcidr
    format: yaml
    path: ./rules/regional-cidr.yaml
    url: "https://example.com/rules/regional-cidr.yaml"
    interval: 86400

rules:
  - RULE-SET,private-network,DIRECT
  - RULE-SET,service-domains,節點選擇
  - RULE-SET,regional-cidr,DIRECT,no-resolve
  - MATCH,漏網之魚

順序、解析與 no-resolve

Clash 規則依由上而下的順序匹配,命中後便停止繼續檢查。因此「規則集已包含某個網域」不代表一定會使用它:若更前面的規則已命中,後面的 provider 永遠沒有執行機會。一般應將範圍小、意圖明確的本機規則放在前面,業務規則集放在中間,地區網段與兜底規則放在後面。臨時修正某個網站時,也應優先在主設定頂部加入一條清楚的規則,而不是立即修改大型遠端集合。

IP 類規則可能觸發網域解析。當連線最初只有網域,而規則引擎需要判斷目標 IP 是否屬於某個網段時,核心必須先取得位址。no-resolve 表示這條規則不要為了匹配而主動發起解析,適合放在網域規則之後的 IP 規則,可減少額外 DNS 查詢並避免解析過程改變原始判斷。但若流量入口只提供 IP,IP 規則仍可直接匹配;no-resolve 並不是停用這條規則。

遠端規則集無法使用時,要區分「更新失敗」與「本機快取無法使用」。若已有快取仍有效,暫時的網路故障通常不會讓所有規則立即消失;首次載入、快取檔案損壞或格式變更,則可能導致 provider 無法就緒。記錄中應重點查看 provider 名稱、HTTP 狀態、解析錯誤與本機路徑,而不是只看最終連線失敗。遠端 URL 建議使用穩定的 HTTPS 位址,並依更新頻率設定合理間隔。一天才變更一次的集合,沒有必要每幾分鐘下載。

現象 優先檢查 處理方式
規則集顯示無法使用 URL、網路、快取目錄權限 手動更新並查看 provider 記錄
規則存在但未命中 主規則順序、behavior 類型 用連線記錄確認較早命中的規則
更新後大量網域失效 檔案格式與內容結構 回復快取並單獨驗證新檔案
DNS 請求異常增加 IP 規則是否觸發解析 調整網域規則順序並評估 no-resolve

規則訂閱化不代表所有規則都應交由第三方維護。區域網路網域、家庭伺服器、公司測試環境與個人例外項屬於本地事實,最好保留在自己的覆寫檔案中。公共規則集負責廣泛分類,本地規則負責精確修正。每次大規模替換規則來源前,先保留舊快取與主設定副本,再用幾個明確目標驗證直連、代理、拒絕三類結果。能解釋每條測試連線為何走向目前出口,才算完成移轉。

CHAPTER 03

DNS 設定與解析路徑最佳化

理解請求從哪裡發出

DNS 設定的難點不在於填寫更多伺服器,而是釐清每次查詢由誰發起、經過哪條網路路徑,以及回傳結果如何進入規則判斷。系統應用程式可能直接詢問作業系統 DNS,也可能自行使用加密 DNS;啟用 TUN 與 DNS 劫持後,一般 53 埠查詢可以交由 mihomo 處理,但應用程式內建的加密解析仍可能繞過。出現「瀏覽器能開、其他應用程式不行」時,首先比較兩者實際使用的解析方式,而不是反覆更換節點。

nameserver 是主要上游,負責一般網域解析。default-nameserver 用於解析 DoH 或 DoT 上游本身的網域,因此通常填寫可直接存取的 IP 位址。否則會出現「為了連線到網域形式的 DNS 上游,必須先解析這個上游網域;但解析又依賴尚未連線的上游」的循環。proxy-server-nameserver 可專門解析代理伺服器位址,適合節點主機名稱需要透過穩定解析通道取得 IP 的情況。

nameserver-policy 可以依網域將請求交給指定上游。例如內部網域走區域網路 DNS,特定服務走另一組解析器。它解決的是「不同網域由誰解析」,不是「解析後的連線走哪個策略組」;後者仍由規則決定。若策略範圍寫得過寬,可能讓大量網域繞過主要 nameserver。調整後應分別測試策略命中的網域、一般網域與節點網域,確認三條路徑都能獨立運作。

dns:
  enable: true
  listen: 0.0.0.0:1053
  ipv6: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  default-nameserver:
    - 223.5.5.5
    - 1.1.1.1
  nameserver:
    - https://dns.alidns.com/dns-query
    - https://cloudflare-dns.com/dns-query
  proxy-server-nameserver:
    - https://dns.alidns.com/dns-query
  nameserver-policy:
    "+.lan":
      - 192.168.1.1
    "+.internal.example":
      - 192.168.1.1
  fake-ip-filter:
    - "*.lan"
    - "*.local"
    - "time.*.com"
    - "time.*.gov"

並行上游不是單純的數量競賽

增加上游數量不一定能提高可靠性。多個解析器可能回傳不同的 CDN 位址、不同的 IPv6 結果或不同地區線路,導致同一網域在短時間內表現不一致。更重要的是,上游之間的查詢路徑若不同,最快回傳的結果未必適合最終出口。例如直連 DNS 回傳的位址適合本地網路,但連線隨後透過遠端節點建立,目標 CDN 可能反而不是最佳選擇。設定時應先確定主要出口,再選擇符合網路模型的上游組合。

ipv6 控制 DNS 模組是否回傳 AAAA 結果,但系統是否真的能透過 IPv6 建立連線,仍取決於實體網路、TUN 堆疊、路由與代理節點。開啟回傳卻沒有可用的 IPv6 路徑,應用程式可能先嘗試一個無法完成的連線,再回退到 IPv4,表現為首次開啟速度緩慢。關閉 IPv6 只是排錯手段,不應取代對鏈路能力的判斷。若家用寬頻、伺服器與節點都支援 IPv6,可以保留並分別驗證直連與代理結果。

解析快取能減少重複請求,但也會讓錯誤結果持續一段時間。修改 hosts、nameserver-policy 或 fake-ip-filter 後,舊快取可能仍被應用程式、系統或核心使用。標準排查順序是重新載入設定、清理客戶端 DNS 快取,必要時再清理作業系統快取,最後重新啟動目標應用程式。只重新整理網頁通常不足以清除所有快取層。瀏覽器還可能維護獨立的連線池與 DNS 快取,測試時使用新視窗或完全退出後重新開啟會更可靠。

本地域名與特殊服務的過濾

Fake-IP 模式下,部分裝置探索、區域網路服務、時間同步,以及依賴真實位址驗證的應用程式不適合接收映射位址,應加入 fake-ip-filter。過濾範圍要盡量小。直接加入過寬的萬用字元,會讓大量網域回到真實 IP 模式,削弱網域規則的穩定性。每增加一個過濾項,都應記錄對應現象,例如投放找不到裝置、區域網路主機名稱無法存取或時間服務拒絕回應,避免日後無法判斷該例外是否仍有必要。

DNS 監聽位址也涉及邊界。桌面客戶端只供本機使用時,不必將埠暴露給整個區域網路;路由器作為閘道服務其他裝置時,則需要監聽可達位址,並配合防火牆限制來源。監聽成功不代表系統已經使用它,仍要檢查系統 DNS、TUN 劫持與埠佔用。若啟動記錄提示 bind 錯誤,可參考埠衝突定位流程,確認現有程序後再修改監聽埠。

CHAPTER 04

TUN 模式與 Fake-IP 協同

TUN 解決系統代理無法涵蓋的連線

系統代理只對主動讀取代理設定的應用程式有效。命令列程式、遊戲、部分商店應用程式與直接發起 UDP 的軟體可能完全忽略它。TUN 模式會建立虛擬網路介面,從 IP 層接管經過系統路由的流量,因此涵蓋範圍更廣。它不是「更強的全域模式」:規則模式、全域模式與直連模式決定接管後的分流方式,TUN 只負責將原本看不到的連線送進核心。

啟用 TUN 通常需要系統管理員權限或系統授權。不同平台對虛擬介面、路由表與 DNS 設定的實作不同,客戶端會盡量完成自動設定,但睡眠喚醒、網路切換、VPN 共存與安全軟體攔截仍可能留下舊路由。啟用後若完全斷網,先關閉 TUN 並確認基礎網路恢復,再檢查記錄中的介面建立、路由寫入與 DNS 劫持錯誤。不要同時連續切換多個相關開關,否則很難判斷是哪一步改變了系統狀態。

auto-route 讓核心自動寫入路由,適合一般桌面環境。auto-detect-interface 用於辨識目前的預設出口,避免代理連線再次被送回 TUN 形成迴圈。多網卡、虛擬機器、熱點分享,或同時連接有線與無線網路時,自動辨識可能選到非預期介面;此時應查看路由表與記錄中的實際介面,而不是憑介面名稱猜測。strict-route 會更嚴格限制旁路流量,能減少某些繞過情況,但也可能影響區域網路存取與其他虛擬網路。

tun:
  enable: true
  stack: mixed
  dns-hijack:
    - any:53
    - tcp://any:53
  auto-route: true
  auto-detect-interface: true
  strict-route: false
  mtu: 1500

dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16

Fake-IP 保留網域語意

傳統 redir-host 方式會先取得真實 IP,再將連線交給規則引擎。多個網域共用同一個 CDN 位址時,僅憑 IP 很難判斷原始目標。Fake-IP 會為查詢到的網域分配保留位址中的映射值,應用程式連線到這個映射位址後,核心可以反查原始網域,再執行網域規則與遠端解析。它的核心價值是保留網域語意,而不是加速所有 DNS 查詢。

映射位址通常只在執行中的核心及其快取內有意義。看到應用程式連線至 198.18.0.0/16 類型的位址,不代表目標真的位於該網段。若 DNS 查詢沒有經過 mihomo,應用程式卻取得先前的映射位址,或連線未被 TUN 接管,就可能出現「能解析但連不上」的斷裂。因此 Fake-IP、DNS 劫持與流量接管必須視為同一條鏈路檢查。只開啟 enhanced-mode,卻讓系統繼續使用其他 DNS,設定不會完整生效。

UDP 是 TUN 排錯時容易遺漏的一層。語音、遊戲、QUIC 與部分 DNS 查詢依賴 UDP,節點協定、客戶端設定與目標服務都必須支援相應路徑。網頁能開啟只能證明部分 TCP 流量正常,不能證明 TUN 的 UDP 鏈路完整。排查時可先測試一般 TCP,再測試 DNS UDP、QUIC 或實際應用程式;若只有 UDP 失敗,請檢查節點能力、規則策略與系統防火牆,而不是立即否定整個 TUN 設定。

組合 網域規則能力 典型用途 注意事項
系統代理 + 一般 DNS 取決於應用程式提交網域還是 IP 瀏覽器與一般桌面軟體 忽略系統代理的應用程式無法涵蓋
TUN + redir-host 依據真實解析結果補充判斷 需要真實 IP 的相容情境 共用 IP 可能降低網域辨識精準度
TUN + Fake-IP 保留查詢網域並穩定匹配 規則分流與全裝置接管 DNS 與連線必須同時進入核心

MTU、區域網路與其他通道

某些網路下,小型請求正常,但上傳、影片或大型頁面卡住,可能與 MTU 和分片有關。TUN 封裝會增加額外負擔,底層網路若不允許相應大小的封包通過,連線會在特定負載下停滯。調整 MTU 應小幅逐步進行,並用可重複的大型檔案請求驗證,不能將任意斷流都歸因於 MTU。若只在某個節點出現,還要比較該節點協定與傳輸層的額外負擔。

區域網路存取失敗時,先確認私人網段規則位於前段並指向 DIRECT,再檢查 strict-route、防火牆及目標裝置是否允許目前介面存取。與其他 VPN 同時執行時,兩個程式都可能修改預設路由與 DNS,最終結果由路由優先順序決定。最可靠的驗證方式是先單獨啟用 Clash,再逐項恢復其他通道;若必須共存,應明確指定哪些網段由哪個介面負責,而不是靠啟動順序碰運氣。

CHAPTER 05

網域嗅探與目標還原

嗅探處理的是「只看得到 IP」的連線

規則引擎最希望取得網域,因為網域通常比共用 IP 更能表達業務意義。但有些連線進入核心時只有目標 IP,例如應用程式使用自己的 DNS、系統快取了真實位址,或透明代理階段沒有攜帶網域。網域嗅探會讀取連線初期可見的協定資訊,從 HTTP Host、TLS SNI 等欄位還原目標網域,再交給網域規則判斷。它補足的是缺失資訊,不是取代 DNS。

嗅探能力受協定本身限制。明文 HTTP 的 Host 通常可見,TLS 交握中的 SNI 在常見情況下也能提供網域;如果應用程式使用不含網域的連線方式、協定內容無法辨識,或加密機制隱藏了交握資訊,嗅探就無法還原。UDP 協定的可見性也各不相同,不能假設所有流量都能取得網域。設定規則時仍應保留合理的 IP 規則與兜底策略。

override-destination 決定辨識出網域後,是否以它取代原始目標參與連線處理。開啟後有助於讓網域規則與遠端解析生效,但在少數依賴固定 IP、憑證行為特殊,或目標網域與連線位址刻意不一致的應用程式中,可能造成相容性問題。更穩妥的方式是先針對常見埠啟用,再透過 skip-domain,或針對來源位址為已知異常的應用程式建立小範圍例外。

sniffer:
  enable: true
  force-dns-mapping: true
  parse-pure-ip: true
  override-destination: true
  sniff:
    HTTP:
      ports:
        - 80
        - 8080-8880
      override-destination: true
    TLS:
      ports:
        - 443
        - 8443
    QUIC:
      ports:
        - 443
  skip-domain:
    - "Mijia Cloud"
    - "+.push.apple.com"

force-dns-mapping 與 parse-pure-ip

force-dns-mapping 會讓嗅探器關注與 DNS 映射相關的連線,適合 Fake-IP 鏈路。parse-pure-ip 則允許嘗試分析目標呈現為純 IP 的流量。兩者開啟後涵蓋範圍更大,也代表更多連線會進入辨識流程。現代裝置通常能負擔這部分開銷,但路由器等資源有限的環境仍應觀察連線數、CPU 與記錄量,不應只因參數存在就全部開啟。

埠範圍是控制嗅探準確度的重要界線。HTTP 嗅探若涵蓋所有埠,非 HTTP 協定的初始資料可能被反覆嘗試解析,既增加開銷,也提高誤判機會。應從明確的 80、8080 與常見 Web 埠開始;TLS 通常集中在 443 與少量自訂埠。某個應用程式確實使用特殊埠時,再依連線記錄補充。設定越具體,後續解釋一次匹配結果就越容易。

嗅探與 Fake-IP 都能協助恢復網域,但觸發階段不同。Fake-IP 在 DNS 查詢時建立映射,應用程式隨後連線到映射位址;嗅探則在連線已抵達後,從協定交握中擷取資訊。前者通常更穩定,後者是繞過核心 DNS、以真實 IP 連線與透明代理情境的重要補充。若同一連線存在映射網域與嗅探網域,應查看記錄中最終採用哪一個,尤其留意 CDN 轉址或憑證使用通用網域的情況。

發生誤判時不要直接關閉全部嗅探

某個應用程式啟用嗅探後出現異常,先定位具體連線。檢查記錄中的原始目標 IP、還原網域、命中規則與最終策略。如果還原出的網域明顯不屬於目標業務,可將該網域加入跳過清單,或縮小對應協定的埠範圍。若只有一個區域網路服務異常,可以針對其網域或網段設定例外;直接關閉全域嗅探會讓其他依賴網域辨識的連線退回 IP 規則,可能引入更多難以察覺的分流變化。

測試嗅探時應選擇規則結果明確的網域。準備一個應直連、另一個應代理的服務,清除應用程式連線快取後分別存取,再查看連線詳細資訊是否顯示網域。如果只看到 IP,檢查流量是否經過 TUN、協定是否可辨識,以及埠是否包含在 sniff 範圍內。若網域已顯示但策略錯誤,問題在規則順序或策略組,而不在嗅探。將「辨識目標」與「選擇出口」拆開判斷,可以避免在錯誤層面反覆修改參數。

網域嗅探也無法修正錯誤的 DNS。若應用程式在連線前已取得無法連達的位址,嗅探雖可能辨識出網域,但底層路由、憑證或目標服務仍可能受到影響。穩定的設定通常以正確的 DNS 接管為主,以嗅探補充純 IP 連線,再用 IP 規則涵蓋無法還原的流量。三個層次各自負責一個問題,疊加後才形成完整的判斷鏈。

CHAPTER 06

本機覆寫與多訂閱合併

將上游設定視為可更新的輸入

訂閱設定由服務提供者維護,更新時可能替換代理節點、策略組與規則。如果直接修改訂閱產生的檔案,下一次更新通常會覆蓋本機內容。正確做法是將訂閱視為輸入,將本機需求放在獨立的覆寫層:訂閱負責節點與基礎結構,本機層負責埠、DNS、TUN、規則優先順序與專用策略組。Clash Plus 等圖形客戶端通常提供設定覆寫、腳本或合併入口,具體名稱可能不同,但目標都是讓本機修改能重複套用。

覆寫有「取代」與「合併」兩種語意。純量欄位如 mixed-portmode 通常直接取代;映射欄位如 dns 可以依鍵合併,也可能整體覆蓋;陣列欄位如 rulesproxy-groups 最容易產生歧義。有些客戶端會將新陣列附加到尾端,有些會依名稱合併,另一些則會完整取代。因此使用任何合併腳本前,先匯出最終設定,確認實際結果,而不是只檢查輸入片段。

規則陣列尤其需要區分前置與後置。自訂直連規則放在 MATCH 之後不會生效;修正某個業務分流的規則,通常應插入遠端通用規則之前。若合併工具支援 prepend 與 append,應明確選擇。策略組依名稱合併時,也要避免本機組與上游組同名卻類型不同,否則更新後可能保留舊欄位,形成難以理解的混合結構。

# 本機覆寫示意:具體合併入口由客戶端提供
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

dns:
  enable: true
  enhanced-mode: fake-ip

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true

rules:
  - DOMAIN-SUFFIX,internal.example,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve

多訂閱不等於簡單拼接

合併多個訂閱時,最先遇到的是名稱衝突。不同來源可能都包含「自動選擇」「節點選擇」或完全相同的節點名稱。若客戶端依名稱去重,後加入的項目可能覆蓋前者;若不去重,介面上會出現難以區分的重複項目。可以在 provider 層保留不同來源名稱,再建立自己的統一策略組,透過 use 同時引用多個 provider。如此不必將所有節點展開成靜態陣列,也能單獨暫停某個來源。

第二個問題是更新週期。多個訂閱若同時頻繁更新,會增加請求量,並在設定重新載入時中斷現有連線。節點資訊通常不需要以分鐘為單位重新整理。可以讓 provider 依較長週期更新,手動更新則用於服務方明確變更或節點異常後的驗證。健康檢查與訂閱下載是兩回事:前者測試現有節點,後者取得新的節點清單。不要用極短的訂閱更新間隔取代健康檢查。

第三個問題是來源之間的能力差異。有些節點支援 UDP,有些不支援;部分線路適合固定地區業務,另一些適合一般瀏覽。單一自動組將全部節點混在一起,可能選到不符合業務要求的出口。應依可驗證的命名或來源建立專用組,例如「來源 A 自動」「來源 B 備用」,頂層「節點選擇」再引用這些組。若節點名稱無法穩定表達能力,只能透過實際連線測試與手動分組維護。

合併物件 建議方式 常見風險
埠與執行模式 本機純量覆蓋 埠佔用、客戶端重新載入後失效
DNS 與 TUN 本機維護完整模組 部分欄位合併後語意衝突
規則 明確設定前置、後置與兜底位置 自訂規則落在 MATCH 之後
多個節點訂閱 分別建立 proxy-provider 節點重名與更新互相覆蓋
策略組 在本機建立穩定的業務層 與上游同名但類型不同

建立可回復的修改流程

每次修改前保留上一份可正常運作的最終設定,而不只是儲存覆寫片段。最終設定能反映合併後的真實順序,也便於比較哪一段發生變化。建議一次只調整一個模組:先策略組,再規則,再 DNS,最後啟用 TUN 與嗅探。每一步至少驗證設定可載入、基本網頁可存取、一個直連目標與一個代理目標符合預期。多項同時修改雖然省事,但失敗時無法快速定位。

訂閱更新後若出現異常,先比較 provider 是否成功、策略組是否為空,以及規則引用的名稱是否仍然存在。許多問題並非節點失效,而是上游更改了策略名稱,本機規則仍引用舊名稱。核心載入時通常會回報找不到策略或 provider;若客戶端只顯示「設定失敗」,應開啟詳細記錄查看具體鍵名。不要為了恢復連線就立即刪除所有本機覆寫,這會失去最有價值的差異線索。

本機覆寫應保持精簡且附有說明。可以依模組撰寫註解,記錄某項規則解決的具體問題,但不要讓長期失效的測試參數一直留在檔案中。每隔一段時間檢視例外項:確認目標服務仍存在、遠端規則集是否已涵蓋,以及舊網路環境是否已更換。設定維護的目標不是欄位越來越多,而是每個保留欄位都能說明用途與界線。

CHAPTER 07

外部控制面板與 API 邊界

控制埠可以做什麼

mihomo 的外部控制介面允許圖形客戶端或 Web 面板讀取策略組、切換節點、查看連線、觸發 provider 更新,以及調整部分執行狀態。桌面客戶端中的策略頁面、連線清單與記錄視窗,許多都建立在這套介面之上。它是控制面,不是代理入口;mixed-port、HTTP 埠與 SOCKS 埠負責轉送流量,external-controller 只處理管理請求。

只在本機使用時,將控制位址綁定到迴路介面最穩妥。綁定 127.0.0.1 後,區域網路中的其他裝置無法直接存取。若需要從另一台裝置管理路由器上的核心,可以監聽區域網路位址,但必須同時設定存取憑據、限制防火牆來源,並避免將埠映射到公網。管理介面能查看連線目標並改變出口,權限應等同於本機管理權限。

external-controller: 127.0.0.1:9090
secret: "your-password"

# 可選:由核心託管本機控制面板檔案
external-ui: ./ui

secret 為空時,能存取控制埠的程式可能不需要驗證即可呼叫介面。本機迴路環境仍應考慮同機其他程序的存取風險;區域網路監聽則必須設定憑據。範例中的值只是明顯的教學值,實際使用時應替換為獨立憑據,不要與訂閱網址、系統帳戶或其他服務共用。面板連線失敗時,檢查位址、埠、協定與憑據是否完全一致。

external-ui 指向靜態面板檔案目錄。核心託管這些檔案後,可以透過控制位址開啟介面;也可以使用客戶端內建的控制面板。介面檔案與核心 API 必須相容,若頁面能載入但策略組為空,先查看瀏覽器網路請求與控制介面回應,而不是重新下載節點訂閱。靜態檔案載入成功只代表 Web 資源可達,不代表 API 驗證已通過。

區域網路存取與反向代理

在家庭伺服器或路由器上使用時,常見結構是控制埠只監聽本機,再由受控的反向代理提供 HTTPS 入口。如此可以集中處理存取控制與憑證,也能避免直接暴露管理埠。但反向代理設定錯誤可能遺失 WebSocket 或驗證標頭,表現為面板首頁正常、連線清單無法即時更新。排查時分別測試靜態頁面、一般 API 請求與即時連線通道,確認問題位於哪一層。

若直接監聽 0.0.0.0,必須檢查裝置防火牆。allow-lan 主要控制代理埠是否允許區域網路裝置使用,不應誤認為是控制介面的防火牆。控制介面是否可達,取決於自身的監聽位址與系統網路規則。可以從區域網路中的另一台裝置測試埠,但測試完成後仍應限制來源網段,不要把「暫時方便存取」變成長期開放狀態。

控制面板顯示的連線資訊來自核心目前狀態。切換策略通常只影響新建立的連線,已建立的 TCP 工作階段可能繼續使用舊節點,直到連線關閉。測試節點切換時,應在面板中關閉舊連線或重新啟動目標應用程式,再觀察新連線的鏈路。只查看策略組目前選項,無法證明正在傳輸的工作階段已經遷移。

存取情境 監聽建議 額外控制
桌面客戶端本機管理 127.0.0.1:9090 設定獨立憑據,避免埠衝突
家庭區域網路管理 裝置區域網路位址 防火牆限制來源裝置或網段
反向代理存取 控制埠仍綁定本機 HTTPS、驗證與即時連線轉送
容器執行 容器內部介面 只映射必要的位址與埠

API 排錯順序

面板無法連線時,先在執行核心的裝置上確認控制埠正在監聽,再從存取端確認網路可達性,最後檢查驗證。三個步驟不能顛倒:埠未監聽時修改瀏覽器設定沒有意義,網路遭防火牆攔截時反覆更換憑據也不會成功。若埠與其他程式衝突,修改控制埠後還要同步更新客戶端或面板位址。

面板可以提高觀察效率,但不應成為唯一的設定來源。重要修改仍應寫入可備份的 YAML、覆寫檔案或客戶端設定中。只在執行期間透過 API 切換的狀態,重新啟動或載入後可能恢復預設值。長期使用的策略選擇可以依賴客戶端持久化,結構性變更則應回到設定檔。區分臨時操作與持久設定,才能避免「在介面中改過,但重啟後消失」的問題。

遠端管理還要控制記錄範圍。連線清單可能包含目標網域、來源位址與流量資訊,不適合在不受控的網路中公開。日常執行使用能滿足排錯需求的記錄層級即可,遇到問題時短期提高詳細度,完成後恢復。外部控制面板的價值在於看清規則與連線,而不是長期保存所有存取記錄。

CHAPTER 08

設定驗證、聯調與故障定位

先驗證語法,再驗證行為

設定排錯分為兩個層次。第一層是結構是否能被核心讀取,包括 YAML 縮排、欄位類型、策略引用與 provider 格式;第二層是載入成功後,實際連線是否依預期經過 DNS、規則與策略組。語法通過只代表檔案可解析,不代表分流正確。反過來,應用程式無法連網也不一定是設定語法錯誤,可能只是某條規則選中了無法使用的節點。

YAML 使用空格表達層級,Tab、錯誤縮排與冒號後的格式都會改變結構。清單項目前的短橫線必須位於正確層級,布林值與數字不需要引號,包含特殊字元的名稱或 URL 則可以加上引號。策略組名稱屬於精確引用,「節點選擇」與「節點選擇 」看似接近,但尾端空格會形成兩個不同字串。設定較長時,先從記錄回報的行附近檢查,再向上尋找所屬模組。

mihomo 可透過命令列檢查設定目錄,具體執行檔名稱取決於平台與安裝方式。以下命令呈現常見的檢查方式:指定設定目錄後進行測試,不直接啟動長期服務。圖形客戶端使用者也可以使用其設定檢查功能,並查看核心記錄中的第一個錯誤。後續錯誤常由第一個結構錯誤連鎖產生,應從最早出現的一項開始修正。

mihomo -t -d /path/to/config-directory

# 若需要以前景方式觀察載入過程
mihomo -d /path/to/config-directory

建立最小驗證矩陣

每次修改後至少驗證四類目標:區域網路位址應直連,一個明確的一般網站依預期策略連線,一個只有透過代理出口才能使用的目標經由代理,以及一個未被專用規則涵蓋的目標落入兜底組。若啟用 TUN,再增加一個忽略系統代理的應用程式;若啟用 IPv6,再分別驗證 A 與 AAAA 連線。固定測試對象能讓不同設定之間具有可比性。

連線記錄應依處理鏈閱讀。先看入站類型,確認連線來自 HTTP、SOCKS 還是 TUN;再看目標是網域還是 IP,判斷 DNS 映射或嗅探是否正常;接著看命中的規則與策略組;最後查看實際節點或 DIRECT。若入口就不正確,繼續調整規則沒有意義。若規則正確但節點錯誤,問題在策略組選擇。若節點正確仍無法連線,再檢查節點能力、目標服務與底層網路。

DNS 問題應單獨驗證。記錄查詢網域、上游、回傳類型與連線目標,避免只憑「網頁打不開」推斷 DNS 錯誤。可以暫時使用簡單的 nameserver 設定建立基線,再逐步恢復 policy、Fake-IP 過濾與多上游。每恢復一項就重複相同測試。複雜 DNS 設定一次整體替換,很容易將上游不可達、策略範圍過寬與快取殘留混成同一個問題。

故障表現 最可能的層級 第一個檢查動作
設定無法載入 YAML 或欄位引用 讀取第一條核心錯誤並檢查對應層級
瀏覽器正常,其他應用程式失敗 系統代理涵蓋範圍或 TUN 確認失敗應用程式的連線是否進入核心
網域規則未命中 DNS、嗅探或規則順序 查看連線目標顯示為網域還是 IP
切換節點後仍使用舊線路 既有連線尚未關閉 關閉舊連線並重新發起請求
小型請求正常,大型傳輸停滯 MTU、UDP 或傳輸鏈路 比較不同節點並檢查分片相關現象
更新訂閱後策略為空 provider 或名稱合併 確認 provider 狀態與策略組引用名稱

一次只變更一個變數

有效排錯依賴可重複性。關閉所有進階功能後恢復基礎連線,再依序啟用 DNS、Fake-IP、TUN、嗅探與規則 provider,比隨機切換開關更快。每一步記錄變更與結果,失敗時回到上一份可用設定。若客戶端支援設定副本,可以建立「基礎」「TUN 測試」「完整規則」三個獨立設定,避免持續覆蓋同一檔案。

埠類錯誤應確認具體的監聽者。mixed-port、DNS 監聽與 external-controller 都可能與其他程式衝突,錯誤記錄中的埠號決定要檢查哪一項。修改埠後,系統代理、面板位址或其他依賴端也要同步更新。詳細命令與平台差異可參考Clash 埠被佔用的定位流程

節點全部逾時時,先判斷健康檢查網址是否可達,再手動測試一個節點。若所有 provider 同時失敗,問題更可能位於本地網路、DNS、訂閱更新或系統時間,而不是所有節點剛好同時失效。若只有某個來源失敗,則檢查該 provider 的 URL、快取與節點協定。首次連線的基礎驗證可回到選擇節點、測試延遲並確認代理生效逐項核對。

效能調整建立在正確性之後

縮短健康檢查間隔、增加 DNS 上游、擴大嗅探範圍與啟用更多規則集都會增加工作量,但不一定改善體驗。先用預設或保守參數取得正確、穩定的處理鏈,再根據明確現象調整。網頁首次開啟緩慢,可以分別測量 DNS 時間與連線時間;節點頻繁切換可以提高 tolerance 或延長檢測間隔;路由器負載過高可以減少規則集數量、降低檢查頻率並縮小嗅探埠範圍。

記錄層級同樣會影響觀察與開銷。日常使用保留一般資訊即可,重現問題期間暫時提高詳細度,完成後恢復。長期輸出大量連線細節會增加磁碟寫入,也會累積不必要的存取記錄。排錯記錄應包含問題發生前後的完整鏈路,但不需要無限期保留。

一份成熟的設定不以欄位數量衡量。更重要的是,入口、解析、匹配、決策與出口五個階段都能被解釋,而且任何進階功能都可以獨立關閉,不會破壞基礎連線。完成本頁的模組化設定後,建議匯出最終 YAML 與覆寫檔案,記錄客戶端中的關鍵開關。需要更換裝置時,可先從下載頁選擇對應平台客戶端,首推支援多平台的 Clash Plus,再按模組逐項恢復,而不是直接複製一份無法解釋的龐大設定。