Clash 為什麼要自帶一套 DNS
打開任何一份 Clash 或 Clash Meta(mihomo)的設定檔,都能看到一整段以 dns 開頭的欄位。它不是擺著好看的,也不是只有進階玩家才需要碰的部分。
系統代理模式下,瀏覽器會把網域原樣交給代理,由遠端伺服器解析,本機 DNS 看似無關緊要。但只要有一個應用程式不走代理、直接向電信商 DNS 發出 UDP 53 查詢,污染與洩漏就會回來:拿到的可能是被下毒的假 IP,查詢紀錄也會完整留在本機網路端。
TUN 模式下,整台裝置的流量都會進入虛擬網卡,網域解析必須先有著落。Clash 的內建 DNS 模組就是負責這件事:統一接管 53 埠的查詢,依設定決定每個網域該問誰、怎麼問、信任哪邊的結果。
所以 dns 段落填得對不對,直接決定三件事:網頁開得快不快、會不會拿到被污染的位址、查詢紀錄落在誰手裡。
dns 段落欄位逐一說明
開關三件套:enable / listen / ipv6
enable:總開關。填 false 時整段不生效,Clash 不會接管任何解析,其他欄位等於白填。listen:內建 DNS 伺服器的監聽位址,常見寫法0.0.0.0:53。TUN 劫持的終點、區域網路裝置把 Clash 當 DNS 用時的入口,都是這個埠。若只在本機使用且走 TUN 劫持,保持預設即可。ipv6:填 false 時會捨棄 AAAA 查詢結果。若寬頻沒有 IPv6,建議關閉,避免應用程式拿到 v6 位址後走一條不存在或更慢的路線。
enhanced-mode 與 fake-ip-filter
redir-host:傳統模式,每個網域都做真實解析,相容性最好,代價是多一次 DNS 往返。fake-ip:命中代理規則的網域直接回傳 198.18.0.x 段的假位址,省去真實解析,連線建立更快,也能避開應用程式自行發出 DNS 查詢時被污染的環節。fake-ip-filter:例外名單,名單內的網域必須取得真實 IP。常見條目包括區域網路網域*.lan、時間伺服器、STUN 服務、部分廠商的登入網域。若某個應用程式在 fake-ip 下行為異常,第一步就是把它的網域加進這份名單。
default-nameserver:引導 DNS
它只做一件事:把設定中以網域形式寫成的 DNS 伺服器(例如 dns.alidns.com)解析成 IP;在沒有另外設定 proxy-server-nameserver 時,也負責解析代理節點的網域。
這裡必須填純 IP 的 UDP DNS,例如 223.5.5.5、119.29.29.29。填 DoH 位址會形成「要先解析才能解析」的死循環,整個 dns 段會直接失效。
nameserver:主力解析清單
預設的網域解析伺服器,多台並發查詢,取最快回應的結果。取值寫法有四種:純 IP 即 UDP 53;tls:// 開頭是 DoT;https:// 開頭是 DoH;寫 system 表示沿用系統 DNS。
台灣本地使用建議填當地 DoH,例如 https://dns.twnic.tw/dns-query、https://dns.cloudflare.com/dns-query,延遲低,回應結果也更貼近本地 CDN 調度。
fallback 與 fallback-filter
fallback 與 nameserver 同時發起查詢,專門服務「可能被污染、或本來就該走代理」的網域,一般填國際可信 DNS,例如 https://dns.cloudflare.com/dns-query、tls://8.8.4.4:853。
fallback-filter 決定信任哪邊的結果,四個子欄位各司其職:
geoip與geoip-code:當 nameserver 回傳的 IP 不屬於指定地區(如 TW)時,判定為污染,改採 fallback 的回應。geosite:網域命中 gfw 等分類時,直接採用 fallback 的結果。ipcidr:回傳 IP 落在240.0.0.0/4這類保留區段時,判定為污染。domain:名單內的網域無條件走 fallback。
補充一句:mihomo 後續版本更推薦 nameserver-policy 搭配分流的寫法,fallback 依然相容,舊設定不必急著改。
nameserver-policy:依網域指派(進階)
依網域或分類指定專用解析伺服器,優先度高於 nameserver 與 fallback。常見寫法:'geosite:cn' 指向中國大陸的 DoH,'+.internal.example.com' 指向公司內部網路 DNS。分流顆粒度比 fallback-filter 更細,適合對解析路徑有明確要求的場景。
「DNS 劫持」到底是劫持什麼
設定中的劫持指的是 Clash 主動接管本機發出的 53 埠查詢,交給內建 DNS 依上述規則回應,而不是攔截別人的流量。
TUN 模式下,設定 tun.enable 與 dns-hijack 後,所有進入虛擬網卡的 DNS 請求都會被收編,這是涵蓋最徹底的方式,任何應用程式都繞不開。
系統代理模式不會劫持 DNS。瀏覽器把網域交給代理端遠端解析沒問題,但本機直連的應用程式仍走系統 DNS。想堵住這個漏洞,要麼開啟 TUN,要麼手動把系統 DNS 改成 listen 填的位址。
listen 保持本機或內部網路可連即可,別把內建 DNS 暴露到公開網際網路。開放遞迴 DNS 會被掃描工具發現並用於放大攻擊。
兩套可直接套用的設定
方案一:家用常規
fake-ip 提速,本地網域走台灣與國際 DoH,命中 gfw 分類或回傳非本地結果的網域自動改用 fallback。適合絕大多數家用寬頻:網頁瞬間打開,本地 CDN 不繞路。
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"
- "*.msftconnecttest.com"
- "time.*.com"
- "localhost.ptlogin2.qq.com"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
fallback:
- https://dns.cloudflare.com/dns-query
- tls://8.8.4.4:853
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
ipcidr:
- 240.0.0.0/4
方案二:嚴格防洩漏
respect-rules: true 讓發往 nameserver 的查詢本身依規則走代理,查詢內容不會落地到本機電信商;direct-nameserver 負責直連網域,proxy-server-nameserver 負責節點網域,三者職責分開。
dns:
enable: true
listen: 0.0.0.0:53
ipv6: false
respect-rules: true
enhanced-mode: fake-ip
fake-ip-filter:
- "*.lan"
- "*.local"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
direct-nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
nameserver:
- https://dns.cloudflare.com/dns-query
- https://dns.google/dns-query
再疊加 TUN 把整機 53 埠收編,不留旁路:
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
代價也要說清楚:國際 DoH 走代理,首次解析略慢;代理無法使用時解析會整體失敗,需要接受這層耦合。
改完設定,三步驗證
- 看日誌:用戶端日誌裡的 [DNS] 那一行會列出每個網域用了哪台伺服器、命中了哪條策略,先確認分流是否符合預期。
- 開檢測頁:用瀏覽器連到 DNS 洩漏檢測網站,看到的出口伺服器應該是設定裡的 DoH 供應方或代理出口,而不是本機電信商。
- 命令列抽查:執行
nslookup example.com 127.0.0.1直接向內建 DNS 提問;fake-ip 模式下代理網域回傳 198.18.x.x 是正常現象,不是故障。
YAML 縮排錯誤是 dns 段不生效的頭號原因。欄位前統一用兩個空格,改完記得重新載入設定或重啟核心再測試。
三個高頻問題
- 本地網站開得慢:fallback 填了國際 DNS 卻沒配 geosite 分流,導致本地網域被國際伺服器解析,CDN 調度跑偏。
- 某個應用程式連線異常:多半是需要真實 IP,把它的網域加進 fake-ip-filter 即可。
- 設定看起來沒生效:確認
enable: true、縮排正確,並確認所用用戶端沒有在圖形介面上覆寫 dns 段。