連線疑難排解 · Clash 技術部落格

Mihomo 重載後 Fake-IP 遭覆寫:v1.19.33 修正

Mihomo 重新載入設定後,舊網域的 Fake-IP 被新網域占用?先核對執行中的核心與 DNS 監聽,保持相同位址範圍做前後對照,透過支援的管道取得 v1.19.33 修正,再驗證對應、連線與還原方式。

  • Mihomo
  • Fake-IP
  • v1.19.33
  • 重新載入設定
  • DNS 對應
本文目錄

設定沒有修改,重新載入後網頁卻偶爾連錯或中斷,很容易讓人先清除 DNS 快取。如果你使用 Mihomo 的 Fake-IP 模式,可以先核對更具體的現象:舊網域在重新載入後仍保留原位址,卻在查詢新網域後取得不同位址。

剛重新載入時沒變,為什麼後來舊網域換了位址?

官方 #3281 提供 v1.19.32 與 alpha-9f053c4 在 macOS 上的重現紀錄:重新載入同一份設定會保留對應,但後續為新網域分配位址時,可能從位址集區開頭重新占用舊位址。這不表示「每次重新載入都會立刻改變所有 Fake-IP」。

Fake-IP 是核心交給應用程式使用的虛擬位址,核心還需要將它對應回原網域。只看到網頁卡住,或只看到兩次 DNS 結果不同,都不足以確認這個缺陷;回報中與 AdGuard 卡頓之間的實際因果也尚未獲得證明。

先分清楚幾種相似現象

觀察到的情況如何判斷與下一步
同一程序以相同範圍重新載入後,新查詢占用了保留的舊對應依本文核對版本,並對照前後的查詢結果。
結束程序、清除快取或修改 fake-ip-range 後,位址改變這些操作已經改變條件,不能據此確認本缺陷。
網域傳回真實公網位址,或查詢根本沒有送到核心 DNS先檢查監聽位址、查詢類型、hosts 與 Fake-IP 篩選規則。

v1.19.33 修正了哪一部分?

v1.19.33 正式發行說明列出 #3283 的修正。固定版本的原始碼在複製舊對應後,只有在新舊位址集區範圍相同時,才會一併保留分配位置 offset 與循環狀態 cycle,避免從開頭再次分配剛保留的位址。

隨修正加入的測試會確認:複製後為新網域分配位址時,原有網域與反向對應仍然保留。這並不保證位址永遠不變;位址集區容量回收、範圍變更與程序重新啟動等情況,仍須分別判斷。

profile.store-fake-ip 用來儲存 Fake-IP 對應。啟用它不代表已取得這次分配狀態的修正,也不是本問題經過驗證的暫時解法;不要為了對照而任意切換此選項或刪除快取檔案。

如何保留相同條件,查到真正的 Fake-IP?

先從用戶端的核心資訊或本次啟動日誌,確認執行中的 Mihomo 版本。圖形用戶端版本不等於核心版本;在另一個目錄執行 mihomo -v,也無法證明用戶端實際使用的就是該檔案。

查詢必須送到實際的 dns.listen。下方以本機 127.0.0.1:1053 為例,只有在它與你核對的監聽一致時才能照用;其他情況請替換伺服器位址與連接埠,不要為了套用範例而修改監聽設定。

先記錄,再重新載入一次設定

  1. 保留原設定與狀態

    將目前設定與用戶端資料獨立備份,記錄核心版本、位址範圍、篩選規則與持久化開關。選擇可短暫中斷的時間,暫停自動訂閱更新,避免對照期間再次更換設定。

  2. 記錄一個既有網域的位址

    使用下方的 A 查詢記錄舊網域 example.com 的 Fake-IP。它必須確實由該核心分配 Fake-IP;若命中 hosts 或篩選規則而傳回真實位址,就換成適合對照的網域。

  3. 透過既有入口重新載入同一份設定

    使用用戶端或服務已支援的重新載入設定入口,保持程序與 fake-ip-range 不變;不要同時結束應用程式、清除快取或更換設定。確認這項操作確實觸發核心重新載入。

  4. 先查新網域,再回查舊網域

    查詢先前未由該核心分配過位址的網域,再查舊網域,對照位址與相關日誌。example.net 只是範例;如果以前查過,請換成自己可控且尚未查詢過的網域。

重新載入前的查詢範例:替換監聽與網域後使用
nslookup -type=A -port=1053 example.com 127.0.0.1

完成同一份設定的重新載入後,再依序執行下方兩個查詢。若沒有這項工具,請使用系統既有的等效 DNS 查詢工具;不要用瀏覽器快取結果代替,也不要向公用 DNS 查詢後,將真實位址當成核心對應。

重新載入後的查詢範例:替換監聽與網域,先新後舊
nslookup -type=A -port=1053 example.net 127.0.0.1
nslookup -type=A -port=1053 example.com 127.0.0.1

一次新查詢沒有觸發覆寫,不能證明舊核心不受影響;集區中已有的分配與查詢順序都會影響結果。保留每次的網域、位址與時間,不要大量查詢正式環境網域來強行觸發,也不要把正常的容量回收誤判為同一缺陷。

如何更新,才能真正用上這次修正?

先確認應用程式或服務是否支援獨立更新核心。若支援,請從其認可的正式管道選擇包含本修正的版本,並保留原檔案與設定;若不支援,請等待或選擇維護者明確說明已整合修正的正式用戶端套件,不要自行覆寫應用程式內部檔案。

v1.19.33 的正式紀錄確認已收錄此修正,但不能只因用戶端剛更新,就認定核心也已更新。完成更新後,請檢查新的啟動日誌或核心資訊,確認真正執行的是目標版本。

更新後重新建立一組對照

  1. 保留可還原的原狀態

    將獨立備份、原版本與設定一一對應,確認還原方式後再更新。不要覆寫唯一的備份,也不要讓另一個版本直接寫入唯一的資料目錄。

  2. 確認新程序的實際版本

    依維護者要求啟動更新後的核心,查看執行中的版本,核對實際載入的設定與 DNS 監聽。

  3. 在新程序內重新做前後查詢

    升級通常會重新啟動程序,舊程序與新程序的位址不必相同。請先重新建立舊網域對應,再於同一個新程序內重新載入同一份設定、查詢新網域,最後回查舊網域。

如何確認結果,避免把一次成功當成全部修好?

同時核對對應與實際連線

  • 已記錄真正執行中的核心版本,而不只記錄圖形用戶端版本。
  • 前後查詢均送到同一個 dns.listen,使用 A 類型,且網域未被 hosts 或 Fake-IP 篩選規則排除。
  • 在同一個新程序、同一位址範圍內完成重新載入對照,沒有清除快取、結束程序或中途修改設定。
  • 適量查詢新網域後,保留的舊網域對應未被提前占用;也已核對與它有關的實際網頁或應用程式新請求。
  • 恢復原本的自動更新安排後再次觀察;若失敗,保留版本、設定差異與遮蔽敏感資訊後的查詢紀錄。

如果對應保持不變,連線卻仍失敗,請繼續檢查實際路由、上游解析與應用程式連線紀錄,不要把所有 DNS 或 AdGuard 故障都歸於這次修正。本文依據官方回報、修正與迴歸測試,並未代替你的用戶端環境進行實機重現。

更新後仍有異常,如何還原並留下線索?

若新版本造成其他相容性問題,請透過原本支援的更新方式,還原已保存的原核心或用戶端,再依對應版本還原獨立備份。停止受影響的操作後再切換,避免兩個版本同時寫入同一資料目錄。

還原舊版本可能讓本缺陷再次出現,不能視為最終修正。恢復設定與原本的自動更新安排後,請重新檢查執行版本、DNS 監聽與實際連線;不要清空唯一的快取或刪除訂閱,來掩蓋尚未查明的差異。

向維護者回報時,請提供核心完整版本、系統、重新載入方式、實際位址範圍、持久化設定,以及依序記錄的前後查詢結果。移除訂閱驗證資料、secret、私人網域與個人資訊;原 issue 的狀態本身,並不能證明你使用的安裝套件是否包含修正。

參考資料