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。 |
mode | rule 依規則分流,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. 修改後的驗證:依序檢查語法、監聽與出口
- 先檢查語法。如果已安裝獨立的 mihomo 命令列工具,可在設定副本所在目錄執行以下檢查命令;使用圖形介面用戶端的話,也可透過設定檢查或重新載入功能查看錯誤。
- 接著檢查監聽狀態。確認
7890未被其他用戶端占用,並確認目前執行中的程序讀取的是修改後的檔案。 - 測試明確指定的代理。使用固定的代理位址發出要求,排除系統代理開關和應用程式自身設定的干擾。
- 最後確認規則。在連線記錄中查看使用的規則與出口,必要時中斷舊連線後重試;既有的長連線可能仍沿用先前建立的路徑。
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,就能將故障範圍限制在剛修改的部分。若要查看完整的設定入口說明,請參閱本站的進階設定說明。