mihomo DNS 設定詳解:fake-ip 與 redir-host
本文目錄
設定檔裡最容易被跳過、出問題時卻最常是元凶的一段,就是 dns。節點沒問題、規則也對,網頁卻打不開或連到奇怪的地方,十次有七八次是解析階段出了狀況。
mihomo 內建了完整的 DNS 模組,可以自己處理所有網域解析,不必依賴系統或 ISP 的 DNS。它的核心設計是 enhanced-mode,分成 fake-ip 與 redir-host 兩種模式。這篇說清兩者的原理差別、fake-ip 的副作用怎麼處理,以及各個 nameserver 欄位分別在什麼時候被用到。
代理為什麼要接管 DNS
如果解析交給系統做,會出現兩個問題。第一是解析結果不可信:回傳被竄改或污染的位址時,你連上的根本不是目標網站,而且流量已經先出去了。第二是解析行為本身會外洩你要造訪哪些網域——就算後續連線走了加密代理,解析請求若以明文送給本地 DNS 伺服器,等於先報備了一次。
由核心接管之後,解析要走哪個上游、要不要透過代理去問,全部由設定檔決定,行為變得可預測,這也是為什麼開了 TUN 模式之後 DNS 設定會變得更關鍵——那時整台機器的解析請求都會進到核心手上,原理見 TUN 模式詳解。
enhanced-mode 的兩種模式怎麼選
fake-ip:核心收到查詢後,不真的去解析,而是立刻回一個保留網段(常見為 198.18.0.0/16)內的虛擬位址給應用程式。應用程式拿著這個假位址發起連線,核心攔下來時才知道對應的是哪個網域,這時再依規則決定直連或走代理,真正的解析交由出口那端完成。
redir-host:核心照常做真實解析,取得真實 IP 後再依規則處理連線。行為比較傳統、直觀。
兩者的實際差別在於:fake-ip 因為省掉了「連線前先解析」這一步,回應快,也天然避免了本地解析被污染的問題,因為分流判斷是靠網域而不是靠 IP;redir-host 則是所有需要真實 IP 的場合都不會出錯,但解析品質直接影響連線品質。多數情況建議用 fake-ip,遇到特定應用程式異常再個別處理。
fake-ip 的副作用與 fake-ip-filter
fake-ip 的假位址只有核心看得懂,所以少數需要真實 IP 的場景會出狀況:區域網路裝置探索、路由器管理介面、部分要求 IP 一致性的連線檢查服務,還有某些遊戲的連線邏輯。症狀通常是「其他都正常,就這個功能怪怪的」。
解法不是關掉 fake-ip,而是把這些網域列進 fake-ip-filter——名單內的網域會跳過 fake-ip,改用真實解析:
fake-ip-filter:
- "*.lan"
- "*.local"
- "+.home.arpa"
- "time.*.com"
寫法上 * 比對單層,+. 表示包含該網域及其所有子網域。遇到某個應用程式行為異常時,先把它用到的網域加進來試一次,比大改設定有效率得多。
nameserver、fallback 與 default-nameserver 的分工
default-nameserver:專門用來解析其他 DNS 伺服器本身的網域。這裡只能填 IP 位址,否則會陷入先有雞還是先有蛋的死結。nameserver:主要的上游解析伺服器,一般網域都由它負責。fallback:備援上游,通常填境外或加密的解析伺服器,用於處理主要上游結果不可信的情況。
上游位址可以寫成一般 IP、加密形式(如 tls:// 開頭的 DoT),或帶協議前綴的其他形式。多寫幾個沒壞處,但也別堆到十幾個,每次查詢都要等回應,反而拖慢速度。
一段通用的 dns 設定範例
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
default-nameserver:
- 168.95.1.1
- 1.1.1.1
nameserver:
- 168.95.1.1
- 1.1.1.1
- tls://8.8.8.8
fallback:
- tls://1.1.1.1
這份設定偏保守,適合直接套用再依需求微調:關閉 IPv6 解析可以避開部分雙堆疊環境下的怪問題;listen 開一個本機 DNS 監聽埠,方便 TUN 模式或其他程式導向它。改完照例用 mihomo -t 檢查一次再啟動。
提醒:若你的設定檔來自訂閱,客戶端可能有「覆寫 DNS」之類的選項,開啟後會以客戶端自己的 DNS 設定取代訂閱內的那一段。發現改了沒反應時,先確認是哪一份設定實際生效。
常見症狀對照表
| 症狀 | 可能原因 | 處理方式 |
|---|---|---|
| 某個應用程式異常,其他一切正常 | 該應用程式需要真實 IP,被 fake-ip 影響 | 把相關網域加進 fake-ip-filter |
| 網頁開啟前有明顯停頓 | 上游 DNS 回應慢,或清單裡有不可用的伺服器 | 精簡 nameserver,換反應較快的上游 |
| 連到的網站內容不對 | 解析結果被竄改 | 改用 fake-ip,並在上游加入加密解析 |
| 區域網路裝置、印表機找不到 | 內網網域被送去外部解析 | 把 *.lan、*.local 等加入排除清單 |
| 開 TUN 後完全沒網路 | DNS 未正確接管或監聽衝突 | 確認 dns.enable 為 true 與 listen 連接埠未被占用 |
DNS 調整完之後,若還是有網站連不上,就要往分流那一層看了——可能是規則把它送到錯的出口,判讀方式見分流規則入門;如果是整體都上不了網,照分步排查指南由外而內逐層檢查會更快找到原因。