先確認設定檔路徑與引用關係

設定檔的核心關係是:規則選擇策略組,策略組選擇節點,DNS 負責提供網域解析結果。依照這層關係拆解欄位,比逐行修改訂閱設定更容易找出問題。本文適用於 mihomo,也就是常稱為 Clash Meta 核心的後續專案;舊版 Clash 核心與不同圖形介面的設定合併機制,不一定支援相同欄位。

直接執行核心時,可將工作目錄設為 ~/.config/mihomo,並將設定檔放在該目錄的 config.yaml。使用用戶端時,先確認最後交由核心載入的設定檔路徑;訂閱原始檔、覆寫檔與執行中的設定檔可能是三個不同檔案。直接編輯執行中的檔案,下次更新訂閱時可能會被覆蓋。

mkdir -p ~/.config/mihomo
mihomo -v
mihomo -t -d ~/.config/mihomo

-v 可查看目前執行的核心版本;-t 用來檢查指定目錄中的設定。尚未建立設定檔時,最後一個指令顯示找不到檔案是正常情況。下文前六節的 YAML 片段可依序組合成入門設定;其中的本機 SOCKS 節點有使用前提,並不是可直接使用的遠端代理服務。

一、mixed-port:建立本機代理入口

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

mixed-port 同時接受 HTTP 代理與 SOCKS5 代理連線,因此瀏覽器和命令列工具都能使用 127.0.0.1:7890。它不是控制面板連接埠,也不是節點伺服器的遠端連接埠。若只供本機應用程式使用,請維持 allow-lan: false,不要只為了排查網頁問題,就把監聽位址改成所有網路介面。

欄位用途本文設定值
mixed-port應用程式使用的 HTTP / SOCKS 入口7890
port獨立 HTTP 代理入口不另外啟用
socks-port獨立 SOCKS 代理入口不另外啟用
dns.listen核心 DNS 服務的監聽位址127.0.0.1:1053
external-controller管理 API,不接收一般網頁代理請求入門設定省略

此處暫時關閉 IPv6,將它排除在初次部署的變因之外,並不代表所有網路都應永久關閉 IPv6。之後若要啟用,請一併檢查 DNS 的 AAAA 回應、節點的 IPv6 連線能力與系統路由。若要供區域網路裝置共用,應另外規劃監聽位址、驗證機制與防火牆規則,而不是只修改一個布林值。

ss -lntp 'sport = :7890'
curl --proxy http://127.0.0.1:7890 --connect-timeout 10 -I https://example.com/

第一個指令用來確認連接埠是否正在監聽;第二個指令明確指定代理,避免受桌面環境的系統代理設定影響。只有核心已啟動時,這兩項測試才有意義。若連線遭拒,請先檢查程序與連接埠,不必立刻調整 DNS。

二、mode 與日誌:固定流量分流方式

mode: rule
log-level: info

mode: rule 表示依照 rules 清單選擇出口。direct 模式會直接連線;global 模式則使用全域策略。排查規則時,請先確認用戶端沒有切換到其他模式。管理 API 也可能修改設定中的模式,因此檔案寫著 rule,不代表目前實際運作的模式一定如此。

log-level: info 適合查看一般連線狀況與啟動錯誤。若要追查特定規則或 DNS 行為,可暫時改成 debug,重現問題後再恢復。日誌可能包含瀏覽過的網域、節點位址與連線資訊,分享前請移除敏感內容。不要同時修改模式、節點與 DNS;每次只調整一組欄位,才能判斷現象與哪些變更有關。

三、DNS:分清上游、監聽連接埠與 fake-ip

dns:
  enable: true
  listen: "127.0.0.1:1053"
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - "*.lan"
    - "localhost"
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver:
    - https://dns.alidns.com/dns-query
    - https://doh.pub/dns-query

三個欄位各自負責什麼

  • listen 決定本機 DNS 服務接收查詢的位置。此處使用非特權連接埠 1053,避免入門階段直接占用系統常用的 53 連接埠。
  • default-nameserver 用來解析 DNS 上游伺服器本身的網域,避免上游位址尚未解析,就無法繼續查詢。
  • nameserver 是預設的網域解析上游。範例使用兩個 DoH 位址,實際網路環境必須能連上它們;使用 HTTPS 並不代表一定連得通。

fake-ip 會為符合條件的網域回傳虛擬位址,再由核心透過對應關係還原網域並處理連線。這不是遠端節點的實際 IP,也不代表目標網站位於 198.18.0.0/16。需要真實解析結果的區域網路服務,可依網域加入 fake-ip-filter,避免透過 fake-ip 回應。

dig @127.0.0.1 -p 1053 example.com A
dig @127.0.0.1 -p 1053 localhost A

依照範例設定,第一個查詢通常會回傳 fake-ip 位址;過濾項目的結果則取決於實際解析狀況。若系統沒有 dig,可安裝 Linux 發行版提供的 DNS 工具套件。直接查詢核心的監聽連接埠,是為了區分「上游解析異常」與「系統未使用核心 DNS」這兩種問題。

四、proxies:宣告節點,別把入口連接埠當成上游

proxies:
  - name: "本機 SOCKS"
    type: socks5
    server: 127.0.0.1
    port: 1080
    udp: false

此範例使用已在本機執行、位於 127.0.0.1:1080 且不需驗證的 SOCKS5 服務。它適合用來確認設定引用關係,但不會建立該服務。若沒有這個上游,稍後仍可將策略組選為 DIRECT,確認本機監聽與規則載入正常;但無法驗證代理節點是否連得通。

name 是設定檔內部的引用名稱,後續策略組必須完全一致;server 和 port 才是節點的連線位址。若已有訂閱,請使用服務提供的實際節點參數,不要把 SOCKS5 範例直接改成其他協定。Shadowsocks、VMess、VLESS 等類型的驗證方式與傳輸欄位各不相同,差異不只在 type。

五、proxy-groups:讓規則引用穩定的出口名稱

proxy-groups:
  - name: "出口"
    type: select
    proxies:
      - DIRECT
      - "本機 SOCKS"

select 是手動選擇策略組。規則只需引用「出口」,替換節點時就不必逐條修改規則。DIRECT 是內建的直接連線策略,不必再於 proxies 中宣告;「本機 SOCKS」則必須與上一節的節點名稱一致。若首次執行時尚未保存選擇狀態,本例會將 DIRECT 放在第一項,方便先確認基本連線。

圖形用戶端通常會保存策略組的選擇。調整清單順序後,舊選項仍可能被還原;測試前請確認目前選取的項目。若以純核心執行且未啟用管理 API,初期可調整第一個項目後重新啟動測試,之後再視需要使用本機控制面板。

需要自動測速時再加入 url-test

url-test 會定期向指定 URL 傳送探測並比較延遲,但不能證明「所有網站都能連線」。例如設定 interval: 300 代表每 300 秒檢查一次,不是每次請求都重新測速。節點數量少、剛開始排查時,先用 select 確認一條可用連線,再考慮自動選擇,避免混淆健康檢查失敗與節點驗證失敗。

六、rules:由明確比對到最後兜底

rules:
  - DOMAIN-SUFFIX,lan,DIRECT
  - DOMAIN,localhost,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - DOMAIN-SUFFIX,github.com,出口
  - MATCH,出口

規則會由上往下比對,符合後通常不會繼續比對後續規則。DOMAIN 比對完整網域;DOMAIN-SUFFIX 比對網域本身及其子網域。例如 github.com 和 api.github.com 都符合範例中的網域後綴規則,但這不代表所有 GitHub 相關資源的網域都涵蓋在內。

IP-CIDR 依目標 IPv4 位址範圍進行比對。no-resolve 表示不會只為了判斷這條 IP 規則,就主動解析尚未解析的目標網域;若已有目標 IP,仍可參與比對。因此,區域網路服務最好也維護必要的網域規則,不能只靠私有位址範圍推斷所有本機名稱。

MATCH 是最後的兜底規則,應放在清單末尾。若放在前面,後續規則就不會有比對機會。本例明確列出私有位址範圍,入門設定不依賴 GeoIP 資料庫;不過這並非完整的特殊用途位址清單。前面的基本設定已關閉 IPv6,啟用 IPv6 後還需補上相應的位址策略。

到這裡,前六節的片段已組成基本設定,目的是說明欄位之間的關係,並非完整的地區分流方案。基礎設定正常運作後,再逐項加入更細的規則集、DNS 分流與程序規則;相關欄位可參閱設定參考。

七、proxy-providers:節點多時再拆分檔案

節點增加後,可將節點清單移至 Provider 檔案。以下是取代第四、五節的選用方案,請勿與前面同名的策略組重複貼上。主設定檔會從檔案讀取節點,策略組則透過 use 引用 Provider 名稱,而不是將 Provider 名稱填入節點清單。

proxy-providers:
  local-pool:
    type: file
    path: ./providers/local.yaml
    health-check:
      enable: true
      url: https://www.gstatic.com/generate_204
      interval: 600

proxy-groups:
  - name: "出口"
    type: select
    proxies:
      - DIRECT
    use:
      - local-pool

在 ~/.config/mihomo/providers/local.yaml 中加入以下內容,並先建立 providers 目錄。請依實際工作目錄確認相對路徑;本文的啟動指令已透過 -d 明確指定目錄。

proxies:
  - name: "本機 SOCKS"
    type: socks5
    server: 127.0.0.1
    port: 1080
    udp: false

Provider 檔案必須符合節點集合的格式,不能只把包含 dns、rules 等欄位的完整用戶端設定檔改個名稱就拿來使用。若改用 type: http,還需要填入實際訂閱 URL,並使用 Provider 層級的 interval 設定抓取週期。訂閱網址通常含有存取憑證,不應出現在公開日誌或截圖中。

請留意兩種週期的差異:Provider 的 interval 控制遠端內容更新;health-check.interval 控制節點探測。這裡使用的是本機檔案 Provider,不會因健康檢查每 600 秒執行一次,就從遠端下載新節點。若探測位址本身無法連線,也可能導致整個策略組的節點探測失敗,請配合實際請求判斷。

八、TUN 是額外的流量接管層,並非必要設定

先確認明確指定的代理能正常運作,再啟用 TUN。TUN 透過虛擬網路裝置與路由接管流量;一般的 mixed-port 不會自動讓所有應用程式都走代理。以下片段只適用於權限與路由環境都已準備妥當的 Linux 測試,不屬於前六節的基本設定。

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

auto-route 會要求核心設定相應路由;auto-detect-interface 用來識別出口介面。建立 TUN 與修改路由需要足夠的系統權限,通常由用戶端的服務模式或管理員設定的服務提供;一般使用者程序不一定具備所需權限。dns-hijack 用來接管進入此處理路徑的傳統 53 連接埠 DNS 請求,不會直接解密瀏覽器本身的 DoH 流量。

九、依序檢查語法、監聽、DNS 與出口

  1. 先備份目前的檔案。修改前請保留一份已知可用的設定,尤其是訂閱覆寫與手動維護的規則。請勿誤將備份檔當成目前實際使用的設定。
  2. 檢查語法與引用關係。執行 mihomo -t -d ~/.config/mihomo。節點名稱不存在、策略組引用錯誤與 YAML 縮排問題,都應在重新啟動前修正。
  3. 只保留一個測試執行個體。若圖形用戶端已占用 7890,請先停止其核心,或為測試設定選用其他連接埠。連接埠衝突不代表節點故障。
  4. 在前景執行並查看日誌。使用下方的啟動指令,再從另一個終端機測試連接埠、DNS 與代理請求。按 Ctrl+C 即可結束前景測試。
mihomo -d ~/.config/mihomo

# 在另一個終端機執行
ss -lntp 'sport = :7890'
dig @127.0.0.1 -p 1053 example.com A
curl --proxy http://127.0.0.1:7890 --connect-timeout 10 -I https://example.com/
curl --proxy socks5h://127.0.0.1:7890 --connect-timeout 10 -I https://example.com/

socks5h 中的 h 表示將目標網域交由代理端解析;這與用戶端先在本機解析網域的方式不同。這有助於判斷問題是否出在應用程式自己的 DNS 查詢流程。HTTP 請求回傳錯誤狀態時,也要分辨是目標網站的回應,還是代理連線失敗;不能只看是否回傳 200 來判斷網路連線。

設定測試通過,只代表設定檔能正確解析與載入,不保證訂閱網址可連線、節點驗證資訊正確、DNS 上游可連線或 TUN 路由設定合理。基本檢查通過後,再恢復 systemd 服務或由用戶端管理,並確認服務使用的執行檔、工作目錄與設定檔都和測試時一致。需要部署步驟,請接著參閱快速入門;遇到連線異常,則先查看疑難排解。

最後保留清楚的依賴關係:應用程式連上 mixed-port,規則命中「出口」,策略組選擇可用節點或 DIRECT,DNS 則提供相應的解析結果。之後加入訂閱更新、規則集與 TUN 時,每次只擴充一層,並重複執行同一組測試指令。