本文目錄
先確認是網域模式驗證失敗
本文只處理一組明確症狀:同一份設定在 Mihomo v1.19.29 或更早版本可以啟動,升級到 v1.19.30 後卻出現 Parse config error: invalid domain,核心在載入設定階段直接退出。
官方 issue #3116 在 Linux Docker 環境記錄了該變化,最終定位到 sniffer.skip-domain 與 dns.fake-ip-filter 中的網域模式。v1.19.30 收錄了更嚴格的 Clash 風格網域通配符驗證;這不是節點失效,也不是把代理模式切成 Direct 就能繞開的連線問題。
如果日誌是 Invalid YAML、unsupported field、proxy not found,或核心已經啟動但網頁打不開,故障發生在其他階段,應先按對應錯誤檢查,不能把所有設定失敗都改成本文的通配符寫法。
先按第一條錯誤分流
| 日誌或現象 | 更可能的階段 | 本文是否適用 |
|---|---|---|
| Parse config error: invalid domain | 網域模式驗證 | 升級到 v1.19.30 後出現時適用 |
| Invalid YAML 或縮進錯誤 | YAML 文字結構 | 不適用,先修語法 |
| proxy / group not found | 策略群組或規則引用 | 不適用,先補齊引用 |
| 核心已啟動,只有某個網域失敗 | DNS、規則或網路 | 不適用,先看連線記錄 |
先儲存可用設定和產生來源
動手搜尋星號前,先分別儲存目前最終設定、用戶端的 Profile、Merge 或覆寫,以及訂閱轉換模板。只備份執行目錄中的 config.yaml 不夠:用戶端下一次更新訂閱時,來源中的錯誤模式還會把修復覆蓋回去。
如果舊核心仍在轉發,不要先重啟服務或連續重新整理訂閱。先保留目前可用狀態,再複製錯誤日誌、用戶端版本和實際 Mihomo 版本;截圖與設定副本要移除訂閱 token、節點密碼、控制器 secret 和私人網域。
準備一條可還原路徑
記錄實際核心版本
從用戶端關於頁、啟動日誌或 mihomo -v 確認執行的是 v1.19.30,不用「最新版」代替版本號。
匯出最終設定
儲存核心實際載入的 YAML,並另存 Profile、Merge、覆寫或轉換模板。
保留上一版核心
只保留來自官方 Release、且本機曾驗證可用的 v1.19.29 檔案作為臨時還原。
固定其他變數
檢查期間不同時換訂閱、節點、DNS 模式或 TUN 設定,避免新增第二個故障。
定位第一條無效網域模式
先用實際要執行的 v1.19.30 測試最終設定。官方 issue 使用的命令是 mihomo -t -f;測試模式成功只代表設定可以被目前核心解析和初始化,不會啟動代理,也不能證明節點可用。
v1.19.30 穩定版可能只回傳籠統的 invalid domain。此時在最終 YAML 和它引用的本機檔案中搜尋星號,優先檢查 issue 已確認出現問題的 sniffer.skip-domain 與 dns.fake-ip-filter。每修正一項就重新測試,讓核心繼續指出下一條錯誤。
mihomo -v
mihomo -t -f /path/to/config.yamlgrep -R -n '\*' /path/to/config.yaml /path/to/rules 2>/dev/nullrrn-sw-*、a*.example.com 或 *a.example.com
星號混在同一個標籤裡,屬於 v1.19.30 明確拒絕的模式。
*.example.com 或 time.*.com
星號獨佔完整標籤,形式本身合法;繼續找下一項。
example.com.、a..example.com 或首尾帶空格
尾點、空標籤和首尾空白也會被嚴格驗證拒絕。
完全找不到星號
檢查加號、尾點、空標籤和用戶端產生的最終設定,不要只搜尋訂閱原文。
先分清三種合法網域通配符
Mihomo 文件把這裡的寫法稱為 Clash 風格網域通配符,並特別說明它與路由規則中的 DOMAIN-WILDCARD 不是同一種語法。不能從規則教學複製一個看似相同的星號表達式,直接放進 fake-ip-filter 或 skip-domain。
關鍵不是星號寫在前面還是後面,而是星號必須獨佔由點分隔的完整標籤。time.*.com 合法,因為中間一段只有星號;rrn-sw-* 不合法,因為星號和 rrn-sw- 混在同一個標籤裡。
按實際匹配範圍選擇寫法
| 合法寫法 | 匹配範圍 | 不會匹配 |
|---|---|---|
| *.example.com | 恰好一級子域,如 a.example.com | example.com、b.a.example.com |
| +.example.com | 根域和任意層級子域 | 其他後綴 |
| .example.com | 任意層級子域 | example.com 根域 |
| time.*.com | 中間恰好一個完整標籤 | time.com、time.a.b.com |
| * | 不含點的單標籤主機名 | 帶點的完整網域 |
rrn-sw-*
a*.example.com
*a.example.com
a*b.example.com按實際意圖改寫,不做機械式替換
如果意圖是匹配某個固定根域下的一級或多級子域,可以在星號、加號和點前綴之間選擇。若原意是匹配 rrn-sw- 開頭的一批區域網路主機,Clash 風格網域清單沒有與 rrn-sw-* 等價的部分標籤通配符;最穩妥的方法是列舉實際主機名。
不要把 rrn-sw-* 機械改成 *.rrn-sw、rrn-sw.* 或 +.rrn-sw。它們表達的是不同的標籤結構,可能透過驗證,卻不會命中原來想要的主機。先列出實際查詢名稱,再讓每條設定都能解釋其覆蓋範圍。
sniffer:
skip-domain:
- "rrn-sw-01"
- "rrn-sw-02"
dns:
fake-ip-filter:
- "+.example.com"
- "time.*.com"錯誤寫法與可執行處理
| 原始意圖 | 不要這樣改 | 可執行處理 |
|---|---|---|
| 匹配 rrn-sw- 開頭的短主機名 | 繼續使用 rrn-sw-* | 列舉 rrn-sw-01、rrn-sw-02 等實際主機名 |
| 匹配 example.com 的一級子域 | a*.example.com | 使用 *.example.com |
| 匹配根域與全部子域 | *example.com | 使用 +.example.com |
| 只匹配全部子域,不含根域 | *.example.com 並誤以為含多級 | 使用 .example.com |
用同一 v1.19.30 驗證修復
儲存候選副本後,再用同一份 v1.19.30 執行設定測試。若仍報 invalid domain,繼續處理下一條,不要因為第一條消失就直接覆蓋唯一可用設定。所有錯誤清零後,才讓用戶端載入候選並重啟核心。
核心啟動只是第一層驗收。分別存取一條應該命中 fake-ip-filter 的網域、一條應該被 sniffer 跳過的網域和一個普通公用網路網域,再查看 DNS 結果與連線記錄。寫法透過驗證但匹配範圍錯誤,仍然不是完成修復。
按可還原順序上線候選
測試候選副本
執行 mihomo -t -f,直到 v1.19.30 明確回傳設定測試成功。
儲存原件再替換
保留上一份可用 YAML,不在用戶端執行中覆蓋唯一原件。
重載或重啟核心
確認日誌顯示 v1.19.30 已啟動,沒有繼續讀取舊處理程式或舊設定。
重新測試實際匹配
用確定的網域請求檢查 DNS、嗅探、規則命中和最終頁面存取。
修復完成標準
- v1.19.30 對最終設定的測試模式透過
- 核心能啟動並保持執行,沒有新的設定解析錯誤
- 列舉的區域網路主機按預期跳過嗅探或 Fake-IP
- 一級、任意層級與根域的匹配範圍符合所選語法
- 普通公用網路網域和節點連線沒有被擴大後的規則誤傷
- 原設定、產生來源和舊核心還原檔案仍可找到
更新後復發要修產生來源
如果手動修改後可以啟動,但重新整理訂閱、切換 Profile 或重啟用戶端又報同樣錯誤,說明無效模式來自轉換模板、遠端設定、Merge 或覆寫。此時不要反覆編輯臨時執行檔案,先比較修復前後的最終 YAML,找到是哪一層重新寫回了舊值。
能控制訂閱或轉換器時,直接修模板並重新產生;只能控制用戶端時,在受控 Merge 或覆寫中替換完整清單,並確認更新後最終設定仍然合法。不要把含 token 的訂閱上傳到陌生轉換站,也不要用一條過寬後綴覆蓋所有未知情況。
每次更新訂閱後復發
修訂訂閱轉換模板或上游設定,再產生候選。
切換 Profile 後復發
分別檢查每個 Profile 的 Merge、Script 和本機覆寫。
磁碟檔案已改,核心仍報舊值
確認實際載入路徑、處理程式和用戶端產生的最終設定。
只能靠寬泛後綴才能啟動
先列舉必要主機並記錄缺口,不把擴大範圍當長期答案。
無法立即修正時先安全還原
若設定由不可控來源持續產生、短時間內無法完成修訂,可以先關閉 TUN 或系統代理,恢復系統直連,再還原備份設定。確有業務依賴時,可臨時回到本機已驗證的 v1.19.29,等待產生源修正後重新測試 v1.19.30。
還原只用於恢復服務,不能證明舊寫法正確。v1.19.30 的嚴格驗證提交已經進入目前穩定版,而更詳細的錯誤路徑提交在其後出現;不要把「舊版不發生錯誤」和「新 Alpha 更容易定位」混成長期版本策略。
恢復已知可用狀態
停止失敗的核心重試
先關閉用戶端接管,避免系統流量持續指向沒有執行的本機連接埠。
恢復設定備份
還原 Profile、最終 YAML 與必要覆寫,不匯入來源不明的完整目錄。
必要時臨時還原核心
只使用官方 v1.19.29 和本機已驗證架構,記錄還原原因與日期。
安排同版本重新測試
產生源修正後回到 v1.19.30,重複設定測試、啟動和實際網域驗證。
