很多人排查「規則明明寫對了,網站卻還是打不開」的問題時,最後發現根源出在 DNS 上——規則再準確,如果網域解析出的 IP 本身就是錯的,後面的分流邏輯就無從談起。這篇文章講清楚 DNS 污染、DNS 洩漏分別是什麼問題,以及 Clash 裡對應的解決方式。
01DNS 污染是什麼
DNS 污染指的是:你查詢一個網域的 IP 位址時,網路中間裝置「搶答」回傳了一個錯誤或者被封鎖的 IP,而不是該網域真實指向的伺服器位址。結果就是即使代理規則判斷正確該走代理,但因為拿到的 IP 本身是錯的,連接依然會失敗或者被跳轉到錯誤的頁面。
解決方式:使用可信的上游 DNS
在 config.yaml 中設定使用海外或經過加密的 DNS 伺服器(DoH/DoT),可以繞開中間網路裝置對一般 UDP DNS 查詢的干擾:
dns:
enable: true
nameserver:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query02DNS 洩漏是什麼
DNS 洩漏指的是:代理連接本身走了代理節點,但發出 DNS 查詢請求時卻繞過了代理、直接用本機網路環境去查詢,導致你的真實網路業者仍然能看到你存取了哪些網域,代理只保護了後續的資料傳輸,沒有保護「你存取過什麼」這個資訊本身。
解決方式:開啟 fake-ip 模式
fake-ip 模式讓 Clash 核心接管 DNS 解析過程:應用程式查詢網域時,Clash 先回傳一個虛構的本地 IP,等實際發起連接時再根據規則決定真正的解析方式和出口,這樣 DNS 查詢本身也被納入了 Clash 的統一處理流程,不會繞過代理直接洩漏給本地網路。
dns:
enable: true
mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "localhost.ptlogin2.qq.com"03nameserver-policy:按網域分流 DNS 查詢
有些網域你希望強制使用特定的 DNS 伺服器解析(比如中國大陸網域用大陸 DNS 換取更快的 CDN 節點,海外網域用海外 DNS 避免污染),這時可以用 nameserver-policy 按網域規則分別指定:
dns:
enable: true
nameserver-policy:
"geosite:cn": ["223.5.5.5", "119.29.29.29"]
nameserver:
- https://1.1.1.1/dns-query上面的寫法表示:命中 geosite:cn(中國大陸網域分類規則)的查詢走大陸 DNS,其餘網域走預設的 nameserver 清單。
04常見欄位速查
| 欄位 | 作用 |
|---|---|
| enable | 是否啟用 Clash 內建 DNS 伺服器接管解析過程,通常應設為 true。 |
| mode | 解析模式:fake-ip(推薦,防洩漏)或 redir-host(相容性更好但防洩漏效果較弱)。 |
| nameserver | 預設使用的上游 DNS 伺服器清單,建議使用 DoH/DoT 加密查詢。 |
| nameserver-policy | 按網域規則指定專屬 DNS 伺服器,優先級高於預設 nameserver。 |
| fake-ip-filter | 排除不適合使用虛構 IP 的網域清單。 |
05如何驗證 DNS 設定是否生效
改完設定後,不要憑感覺判斷,用幾個簡單的辦法就能確認 DNS 是否按預期運作:
- 看用戶端的連接日誌:大多數用戶端在「日誌」或「連接」面板裡會顯示每次請求實際解析到的目標位址,如果開啟 fake-ip,能看到網域被解析成 198.18.x.x 段的虛構位址,說明 fake-ip 已生效。
- 用線上工具檢測 DNS 洩漏:在開啟代理的狀態下存取 DNS 洩漏檢測類網站,如果顯示的 DNS 伺服器歸屬地和你實際所在地區、業者一致,說明查詢請求沒有走代理出去,存在洩漏風險,需要重新檢查 fake-ip 或 nameserver-policy 設定。
- 對比境內外網域的解析結果:存取一個中國大陸網站和一個海外網站,分別查看實際連接使用的出口節點是否符合預期(大陸直連、海外走代理),如果出口不對,通常是 nameserver-policy 裡的網域分類規則沒有覆蓋到,需要補充對應的 geosite 規則。
大多數訂閱產生的設定已經包含一份可用的 DNS 設定,一般使用者不需要從零手寫;但如果你遇到「規則正確卻連不上」或者「擔心 DNS 層面暴露隱私」的情況,回頭檢查這部分設定往往能定位到問題所在。