Clash DNS 設定詳解:nameserver、fallback 與網域劫持處理
網域解析是 Clash 規則分流的前置環節:規則按網域名稱比對、按 IP 歸屬地判斷,都仰賴一份乾淨、可控的解析結果。本文按設定欄位逐層拆解 Clash 內建 DNS 的運作方式,講清楚 nameserver 與 fallback 的分工、一次查詢的完整路徑,以及 DNS 洩漏、53 埠劫持、結果污染三類典型故障的排查與處理。
DNS 為什麼是分流的基石
Clash 的絕大多數規則以網域名稱為比對對象:DOMAIN、DOMAIN-SUFFIX、GEOSITE 都直接看網域名稱;GEOIP、IP-CIDR 這類規則則需要先把網域解析成 IP 才能判斷。也就是說,一次連線該走直連還是代理,答案的一半就藏在 DNS 回應裡。
如果解析環節交給系統預設 DNS,而這條鏈路又被電信業者劫持或投毒,Clash 拿到的就是錯誤答案:台灣本地站點被解析到境外位址而誤走代理,或者反過來。更隱蔽的情況是查詢經由境外明文 UDP 發出,途中被搶答,回應結果與查詢目標完全無關,分流也就無從談起。
因此 Clash 內建了一個 DNS 伺服器:開啟後,系統或 TUN 介面把網域查詢統一交給 Clash,由它依照設定的上游、策略與快取集中回應。增強模式(enhanced-mode)進一步決定回應方式:redir-host 回傳真實解析結果,fake-ip 則先回傳一個假位址,等連線真正建立時再反查網域做規則判斷。
增強模式之一。查詢一到就立即回傳 198.18.0.0/16 段內的假位址並記錄對應關係,連線建立時反查網域再比對規則,走代理的網域無需真實解析。
增強模式之一。先向上游完成真實解析再回應,所有網域都要經過一次完整查詢,結果品質取決於上游鏈路。
鏈路上的中間設備搶答或竄改 DNS 回應,使查詢端拿到與真實記錄不符的 IP,最常見於明文 UDP 53 查詢。
設定骨架:enable、listen 與 enhanced-mode
DNS 模組的入口是設定檔中的 dns 區塊。最小可用骨架如下:
dns:
enable: true
listen: 0.0.0.0:53
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.localhost"
- time.*.com
- ntp.*.com
- localhost.ptlogin2.qq.com
逐欄位說明:
- enable:總開關。設為 false 時 Clash 不監聽 DNS,網域解析交還系統,規則中的 IP 判斷只能仰賴系統解析結果。
- listen:監聽位址與埠。0.0.0.0:53 表示接管本機所有網卡的 53 埠,需要相應權限;圖形化用戶端通常會自動完成授權並指向系統 DNS。
- ipv6:是否回應 AAAA 查詢。網路不具備 IPv6 出口時保持 false,可避免應用程式優先嘗試不可達的 v6 位址。
- enhanced-mode:增強模式,可取 fake-ip 或 redir-host,語義見上文術語卡。
- fake-ip-range:假位址池,預設 198.18.0.1/16。該段屬於基準測試保留位址,一般網路中不會出現真實主機;若內網確實佔用此段,需另選一段。
- fake-ip-filter:假位址豁免清單。清單內的網域不做假位址回應,直接進行真實解析。區域網路網域、NTP 對時、部分依賴 STUN 的語音與遊戲服務通常需要列入。
53 埠被佔用是 DNS 模組最常見的啟動失敗原因。Linux 桌面的 systemd-resolved、Windows 的網際網路連線共享都會佔用 53。可將 listen 改為 0.0.0.0:1053 並搭配 TUN 模式接管,或停用佔用該埠的服務。
nameserver 與 fallback:兩組上游的分工
nameserver 是預設上游清單。發起一次真實解析時,Clash 會向清單內所有上游並發查詢,採用最先回應的結果。它負責絕大多數網域的解析,尤其是需要低延遲、依照台灣本地電信業者調度結果的網域,因此通常填寫台灣本地公共 DNS 的 DoH 位址。上游位址支援四種寫法:純 IP(明文 UDP)、tls:// 加網域(DoT)、https:// 加路徑(DoH)、dhcp:// 加網卡名稱(跟隨系統分配)。
fallback 是原版 Clash 的對照上游機制。它與 nameserver 同時被查詢,但結果預設不會被採用;只有當 nameserver 的回應未通過 fallback-filter 的檢驗時,Clash 才會改用 fallback 的結果。設計理念是:本地上游快但可能被人為竄改,境外上游慢但可信,靠過濾器在兩者間擇優。fallback-filter 提供三種判準:
- geoip 與 geoip-code:nameserver 回應 IP 的歸屬國家代碼不等於設定值(預設 CN)時,判定結果可疑,採用 fallback。
- ipcidr:回應 IP 落入清單網段(如保留段 240.0.0.0/4)時,判定為污染。
- domain:清單內網域無條件使用 fallback 的回應。
| 維度 | nameserver | fallback |
|---|---|---|
| 角色 | 預設上游,負責絕大多數解析 | 可信對照上游,結果預設不採用 |
| 典型選擇 | 台灣本地公共 DNS 的 DoH 位址 | 境外公共 DNS 的 DoH / DoT 位址 |
| 查詢時機 | 每次真實解析皆並發查詢 | 與 nameserver 同時並發查詢 |
| 結果採用條件 | 回應通過 fallback-filter 檢驗 | nameserver 回應未通過檢驗 |
| mihomo 現況 | 保留,搭配 nameserver-policy 使用 | 已標記為棄用,不建議新設定使用 |
有兩點需要特別留意。其一,fallback 上游必須使用 DoH 或 DoT 這類加密通道:若 fallback 本身也是明文 UDP,它的查詢同樣會被劫持,對照機制形同虛設。其二,mihomo(Meta 核心)已將 fallback 與 fallback-filter 標記為棄用,官方建議改用 nameserver-policy 按網域集合明確分流,語義更直接,詳見後文說明。
一次網域查詢的完整路徑
應用程式發起查詢
系統 DNS 指向 Clash 的監聽位址,或由 TUN 介面在網路層截獲,查詢進入 Clash 內建 DNS 伺服器。
fake-ip 判定
增強模式為 fake-ip 且網域不在豁免清單內時,立即回傳 198.18.x.x 假位址並記錄對應關係;清單內的網域則進入真實解析流程。
連線建立,反查網域
應用程式向假位址發起連線,Clash 反查出原始網域,先按網域完成規則比對,決定直連或交給哪個代理節點。
需要 IP 時進行真實解析
命中 GEOIP、IP-CIDR 規則或目標需要直連時,先查 nameserver-policy 是否有專用上游,未命中則走 nameserver 並發查詢。
污染檢驗與回應
原版 Clash 用 fallback-filter 檢驗 nameserver 結果,未通過則採用 fallback 回應;最終結果會寫入快取,後續相同查詢直接命中快取回傳。
nameserver-policy 與 proxy-server-nameserver
nameserver-policy 按網域或網域集合指定專用上游,優先權高於 nameserver。mihomo 支援以 geosite: 前綴引用網域集合,一行設定即可讓整組網域走指定上游,這正是它取代 fallback 的原因:分流依據寫在明處,不再依賴事後的結果檢驗。
proxy-server-nameserver 專用於解析節點伺服器的網域。訂閱裡的節點位址若是網域名稱,必須先解析出 IP 才能建立代理連線;若用一般上游經代理解析,就會形成循環依賴。這一項必須填寫直連可達的上游。default-nameserver 則是引導上游:設定中的 DoH、DoT 上游本身也是網域,需要一組純 UDP 上游先把這些網域解析出來。
dns:
default-nameserver:
- 223.5.5.5
- 119.29.29.29
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
nameserver-policy:
"geosite:cn":
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
"+.corp.example.com":
- 10.0.0.2
這份範例中,台灣本地網域集合走台灣公共 DNS 的 DoH,境外集合走 Cloudflare 與 Google 的 DoH,企業內部網域則指向內網 DNS;nameserver 作為未命中策略時的預設出口。境外 DoH 上游的查詢本身經代理發出,鏈路可信,不再需要 fallback 那套事後比對。
洩漏、劫持與污染:三類典型故障的處理
DNS 洩漏
瀏覽器內建的安全 DNS(Chrome、Edge 預設開啟)會繞過系統 DNS 直接發起 DoH 查詢,Clash 看不到網域,只能按 IP 比對規則,分流精準度明顯下降。處理方式是關閉瀏覽器的安全 DNS 選項,或啟用 TUN 模式在網路層接管所有流量,讓瀏覽器無論向誰查詢都先經過 Clash。
53 埠劫持
明文 UDP 53 查詢在鏈路上可被任意中間節點搶答,境外 UDP 上游在台灣本地網路環境下幾乎必然被搶答。凡是寫進設定的上游,出境方向一律使用 DoH 或 DoT;nameserver 中不應出現境外明文 UDP 位址。
結果污染
fake-ip 模式下,走代理的網域根本不需要真實解析結果,污染無從進入決策;需要直連的網域交給台灣本地 DoH 上游,受污染機率很低。若個別網域解析異常,先檢查 fake-ip-filter 是否需要補充,再透過用戶端日誌確認該網域實際命中的上游。
nameserver 裡出現 8.8.8.8 這類境外明文 UDP,是設定審查中最常見的錯誤。它不會帶來更準確的結果,只會引入搶答污染與額外的逾時等待。
參考設定與核對清單
綜合上文,一份可直接套用的 mihomo 風格 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"
- time.*.com
- ntp.*.com
default-nameserver:
- 223.5.5.5
- 119.29.29.29
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
nameserver-policy:
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
啟用前逐項核對:
- enable 為 true,listen 埠未被其他服務佔用;
- 系統 DNS 已指向 Clash,或已開啟 TUN 模式;
- nameserver 使用台灣本地 DoH,境外上游全部走加密通道;
- proxy-server-nameserver 已設定且直連可達,節點網域能正常解析;
- fake-ip-filter 包含區域網路與對時網域;
- 用戶端日誌中無持續的 DNS 逾時記錄。
DNS 設定完成後,規則分流才有可靠的基石。後續的自訂規則撰寫與策略群組設計,都能在這份乾淨的解析結果之上展開。