1. 設定檔入口:先備份,再確認實際生效的檔案

在用戶端的設定檔清單中選取目前使用的設定,找到編輯或開啟檔案的入口,先另存一份副本,再修改 YAML。各用戶端的選單名稱可能不同;重點是確認你編輯的是目前啟用的設定,而不是訂閱原始檔、本機覆寫設定或用戶端產生的執行時檔案。修改後請重新載入設定,並在記錄中確認載入成功。

config.yaml 是常見檔名,但不是唯一可用的名稱。核心可以讀取指定路徑的 YAML,圖形介面用戶端也可能為不同訂閱分別儲存檔案。訂閱更新通常會重新下載來源檔案,因此若要長期保留連接埠、DNS 和自訂規則,建議優先使用用戶端提供的覆寫或合併功能;實際合併方式請以該用戶端的實作為準。

YAML 的三項基本檢查

  • 縮排使用空格:建議每一層縮排兩個空格,不要混用 Tab。頂層的 dns、proxies、rules 要對齊,子項目則向內縮排。
  • 清單項目前加短橫線:rules 下的每條規則都是清單項目;proxy-groups 下的每個策略組也都是清單項目。
  • 特殊字串加上引號:密碼,以及含冒號或井字號的文字,建議加上引號。不要重複定義同名的頂層鍵,也不要用全形冒號取代半形冒號。

閱讀時可以從入口一路看到出口:連接埠決定應用程式如何將連線交給核心,DNS 負責解析與網域資訊,節點和策略組提供出口,規則則決定每條連線使用哪個出口。以下依此順序逐段說明;不過,YAML 頂層欄位的排列順序本身不會決定執行順序。

2. 一般設定:mixed-port、mode 與日誌層級

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

這組設定將 HTTP 和 SOCKS 代理入口設在 7890,採用規則模式,並將一般執行資訊寫入日誌。這裡的連接埠號碼僅供示範,並非所有用戶端的固定預設值。若用戶端在設定頁面覆寫了連接埠,請以實際執行時的監聽結果為準。

欄位用途與檢查重點
mixed-port在同一個入口接收 HTTP 與 SOCKS 代理要求;應用程式應填入實際監聽的位址與連接埠。
port / socks-port分別提供 HTTP 與 SOCKS 入口。使用混合連接埠時,不必為相同需求再另外開啟一組連接埠。
allow-lan控制是否允許區域網路裝置存取代理入口;僅在本機使用時,可先維持 false。
moderule 依規則分流,global 使用全域策略,direct 則直接連線。
log-level疑難排解時可暫時改為 debug,完成後恢復為 info,避免長期累積大量詳細日誌。
ipv6控制核心是否使用 IPv6;DNS 模組也有獨立的 IPv6 設定,不能只檢查這個欄位。

連接埠正在監聽,不代表系統代理已啟用

設定 mixed-port: 7890 後,核心只是提供了代理入口。macOS 上的應用程式若要透過系統代理連線,還需要在用戶端啟用系統代理,或前往「系統設定」→「網路」→目前的網路服務→「詳細資訊」→「代理伺服器」檢查設定。macOS 不同版本的介面可能略有差異。若只測試本機,代理位址通常填入 127.0.0.1,連接埠填入 7890。

系統代理也無法涵蓋所有程式。部分命令列工具、遊戲和使用自有網路堆疊的應用程式需要個別設定,或透過 TUN 接管流量。先用支援明確指定 HTTP 代理的工具確認入口可用,再評估是否需要擴大接管範圍。

3. 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
  default-nameserver:
    - 223.5.5.5
  nameserver:
    - https://dns.alidns.com/dns-query
  fake-ip-filter:
    - "*.lan"
    - "localhost"

enable 用來啟用核心 DNS,listen 則指定本機監聽位址。此處的 1053 是示範用的高位連接埠,可避免直接使用通常需要較高權限的 53。只設定監聽位址,不會讓整個系統自動向它發出查詢;系統 DNS 設定、TUN 的 DNS 劫持,以及應用程式自行使用的加密 DNS,都可能影響實際流量路徑。

default-nameserver 和 nameserver 各自的用途

  • default-nameserver 主要負責解析上游 DNS 伺服器的網域名稱。例如先解析示範中的 dns.alidns.com,再建立 DoH 要求。
  • nameserver 是一般網域查詢所使用的上游清單。範例採用 DoH;能否連線仍取決於目前的網路和相關路由設定。
  • nameserver-policy 可為特定網域指定上游,適用於內部網域、公司 DNS 等範圍明確的情境。

如果節點的 server 本身是網域名稱,也要留意 mihomo 的 proxy-server-nameserver。它用於解析節點網域,可協助將節點解析路徑與一般網站解析區分開來。一般查詢、上游引導解析和節點解析不是同一個步驟。

Fake-IP 不是遠端伺服器位址

fake-ip 模式會向應用程式回傳映射位址,核心則保存位址與網域的對應關係,並在連線進入時比對及轉送。範例中的 198.18.0.1/16 是映射位址池,不應用來判斷實際網站所在的地區,也不是代理節點位址。

依預設的過濾規則,fake-ip-filter 中的網域不會取得 Fake-IP,而會回傳實際解析結果。可視需要加入內網探索或依賴真實位址的應用程式例外,但 DNS 上游仍須能解析這些網域。將內部網域加入過濾清單,不會自動取得公司內網 DNS 的解析能力。

4. proxies 與 proxy-providers:節點定義與來源

proxies 是節點清單,每個節點都是包含通訊協定與連線參數的對應項目。常見欄位包括 name、type、server、port,以及通訊協定要求的驗證和傳輸參數。策略組會透過節點名稱引用節點,建議名稱保持唯一;伺服器連接埠與本機的 mixed-port 位於不同位置,不必設成相同值。

欄位閱讀重點
name本機使用的識別名稱;策略組會透過此名稱找到節點。
type通訊協定類型,例如 ss、trojan、vmess;是否支援取決於核心。
server / port遠端伺服器位址與服務連接埠,由服務提供者提供。
驗證與傳輸欄位密碼、UUID、TLS、SNI 和傳輸層設定都必須與伺服器端相符,不能只修改通訊協定名稱。
proxy-providers從獨立來源載入節點集合,再透過策略組的 use 引用。

完整訂閱通常同時包含節點、策略組和規則;節點提供器則主要提供節點集合。將任意 Base64 節點訂閱 URL 填入 HTTP 類型的 proxy-providers,不代表核心會自動轉換格式;內容仍須符合提供器支援的格式。

本機暫時沒有節點時,proxies: [] 表示空清單,可用來檢查設定檔結構,但不會產生任何遠端出口。若已有訂閱節點,請保留實際的通訊協定參數,不要為了套用範例而清空節點清單。

5. proxy-groups:策略組串接節點與規則

proxies: []

proxy-groups:
  - name: 手動出口
    type: select
    proxies:
      - DIRECT

這是一個可用來檢查結構的直連策略組:手動出口 是組名,select 表示由使用者選擇成員,目前唯一的成員是內建策略 DIRECT。因此這個策略組目前只會直接連線;若要使用遠端節點,請將目前設定中確實存在的節點名稱加入策略組,或透過 use 引用節點提供器。

常見策略組類型的差異

  • select:手動選擇成員,適合固定業務出口和疑難排解。
  • url-test:透過指定的測試 URL 比較可用成員的延遲,並搭配容差等設定選擇出口。
  • fallback:依設定順序選擇可用成員,著重故障切換,而非持續追求最低延遲。
  • load-balance:依所選策略分配連線;這不代表單一下載連線的頻寬會合併成多個節點頻寬的總和。

測試型策略組中的 url、interval 與節點健康檢查有關。測試成功只代表測試目標可連線,不表示所有服務網站都能存取。自動選擇的結果異常時,請先確認測試 URL 是否適合目前的網路,再檢查節點本身。

策略組之間也能互相引用,但不能形成循環。規則若指定 手動出口,設定中就必須有完全相同的組名;多一個空格或使用不同標點,都可能讓目標無法找到。

6. rule-providers:將規則資料與分流動作分開

rule-providers:
  office-domains:
    type: file
    behavior: domain
    format: yaml
    path: ./rules/office-domains.yaml

這段設定定義了一個名為 office-domains 的本機規則提供器。type: file 表示從檔案讀取,範例不涉及自動下載。相對路徑通常以核心的工作目錄為基準,而非文字編輯器目前所在的目錄;圖形介面用戶端也可能限制可讀取的路徑,請將檔案放在它允許的設定資料目錄中。

對應的檔案內容可以寫成:

payload:
  - "+.example.org"
  - "intranet.example.net"

這裡使用保留的示範網域說明結構,並非實際的辦公服務。behavior: domain 表示檔案內是網域比對項目;+.example.org 可涵蓋根網域及其子網域。若使用 classical,內容則是包含規則類型的項目,例如 DOMAIN-SUFFIX,example.org,不能直接套用上方的純網域寫法。

  • domain:網域類資料,適合維護網域清單。
  • ipcidr:IP 網段資料,適合維護位址範圍清單。
  • classical:以規則類型描述的清單,可指定更多比對條件。

HTTP 類型還需要設定 url,並可用 interval 指定更新間隔,單位為秒;例如 86400 代表一天。format 必須與實際檔案格式相符;改為 text 後,檔案就不再使用 YAML 的 payload 包裝。

7. rules:由上往下比對,MATCH 放在最後

rules:
  - DOMAIN-SUFFIX,example.org,手動出口
  - RULE-SET,office-domains,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - GEOIP,CN,DIRECT
  - MATCH,手動出口

這段規則需要搭配前述策略組與規則提供器使用,而且本機規則檔案必須存在。第一條比對 example.org 及其子網域;第二條引用 office-domains;第三條比對指定的私人網段;第四條嘗試比對中國大陸地區 IP;最後一條則處理其餘連線。GEOIP 判斷需要可用的地理位置資料庫,不能只新增一條規則就完成。

由第一條符合的規則決定結果

rules 會依由上而下的順序檢查,符合其中一條後就使用對應目標。上例中的 example.org 雖然也在辦公規則集中,但會先符合第一條,導向 手動出口。自訂例外通常需要放在範圍較廣的規則之前;若將精確例外放在 MATCH 之後,就不會生效。

no-resolve 用來避免為了比對 IP 類規則而主動觸發網域解析。如果目前連線只有網域名稱,且沒有可用的目標 IP,該規則可能無法符合;若連線本來就是連往某個 IP,仍可進行網段比對。這不是「禁止整個連線使用 DNS」的全域開關。

策略名稱與內建動作

  • DIRECT:直接建立連線,仍會受本機網路、路由和目標服務狀態影響。
  • REJECT:拒絕符合條件的連線,適用於明確需要封鎖的目標。
  • 策略組名稱:交由該組目前選取的節點或下一層策略組處理。
  • MATCH:不需其他條件的兜底規則,應放在規則清單末尾。

排查分流時,先維持 mode: rule,再查看連線記錄中的目標網域、符合的規則和最終出口。如果切換到全域模式,就無法透過連線結果驗證這份規則清單的順序。

8. TUN 與控制介面:依流量接管需求啟用

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

範例先關閉 TUN,方便逐項驗證代理入口和規則。若要接管不遵循系統代理設定的應用程式,再配合用戶端的服務安裝、系統授權和核心支援啟用。auto-route 用於自動設定路由,auto-detect-interface 則協助選擇出口網卡;啟用 TUN 後,應檢查網路路由,而不只是確認開關狀態。

dns-hijack 的 any:53 用於接管相應的一般 DNS 流量,不代表可以直接接管所有 DoH 或 DoT 要求。公司 VPN、其他虛擬網卡和防火牆可能與 TUN 路由互相影響;發生問題時,應先關閉其中一層接管功能進行比對,而不是同時修改 DNS、路由和所有規則。

external-controller 是控制 API 的監聽入口,與網頁代理連接埠不同。例如,本機管理位址可以是 127.0.0.1:9090;若確實需要啟用,請搭配 secret 設定強密碼,並限制存取範圍。有些用戶端會自行管理這些欄位,不建議直接覆寫其所依賴的位址與驗證設定。

9. 修改後的驗證:依序檢查語法、監聽與出口

  1. 先檢查語法。如果已安裝獨立的 mihomo 命令列工具,可在設定副本所在目錄執行以下檢查命令;使用圖形介面用戶端的話,也可透過設定檢查或重新載入功能查看錯誤。
  2. 接著檢查監聽狀態。確認 7890 未被其他用戶端占用,並確認目前執行中的程序讀取的是修改後的檔案。
  3. 測試明確指定的代理。使用固定的代理位址發出要求,排除系統代理開關和應用程式自身設定的干擾。
  4. 最後確認規則。在連線記錄中查看使用的規則與出口,必要時中斷舊連線後重試;既有的長連線可能仍沿用先前建立的路徑。
mihomo -t -f ./config.yaml

# macOS:查看 TCP 7890 的監聽程序
lsof -nP -iTCP:7890 -sTCP:LISTEN

# 明確使用本機 HTTP 代理測試要求
curl -I --proxy http://127.0.0.1:7890 https://example.com

設定檢查成功,代表目前的核心能解析該檔案,不代表節點在線、規則集下載成功或目標網站可連線。curl 回傳 HTTP 回應,表示這次要求收到回應;實際走直連還是代理,仍須搭配連線記錄確認。本文的空節點範例只有直連成員,無法用來測試遠端代理能力。

依錯誤訊息定位欄位

  • YAML 解析失敗:檢查錯誤提示行附近的縮排、引號、冒號和清單短橫線。
  • 找不到代理或策略組:核對規則目標、策略組成員與節點名稱,並確認節點提供器已載入。
  • 讀取規則集失敗:檢查路徑、檔案權限,以及 behavior 和 format 是否符合實際內容。
  • 連接埠繫結失敗:檢查連接埠是否已被占用及監聽位址,避免兩個用戶端同時使用相同入口。
  • 更新訂閱後修改內容消失:將需要長期保留的設定移至用戶端支援的本機覆寫層,再檢查合併後的執行時設定。

最後應保留一份可正常載入的基準設定,每次只調整一類設定。依序處理連接埠、DNS、節點與策略組,最後再調整規則和 TUN,就能將故障範圍限制在剛修改的部分。若要查看完整的設定入口說明,請參閱本站的進階設定說明。