DNS 沒配好,會出什麼問題
如果用戶端只接管了流量轉發,卻沒有接管 DNS 查詢,域名解析請求可能仍然直接發往本機電信業者的 DNS。這會帶來兩個問題:一是解析結果可能被汙染,回傳錯誤的 IP,導致本該走代理的網站直接連線失敗;二是即使流量本身走了代理,DNS 查詢本身也暴露了你正在存取哪個域名,這就是常說的「DNS 外洩」。
fake-ip:目前最主流的解決方案
enhanced-mode: fake-ip 的思路是:用戶端攔截 DNS 查詢後,不直接回傳真實 IP,而是從一段專用的虛擬位址範圍(fake-ip-range)裡分配一個假 IP 給應用程式;應用程式拿著這個假 IP 發起連線時,用戶端再在網路層還原出真實的目標域名,按規則判斷該走代理還是直連。整個過程對應用程式完全透明,相容性和速度都是目前幾種方案裡最好的。
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "localhost.ptlogin2.qq.com"
fake-ip-filter 用來排除不需要走假 IP 機制的域名,比較典型的是區域網路裝置探索、內網服務這類必須拿到真實 IP 才能正常運作的場景,命中過濾規則的域名會直接回傳真實解析結果。
按域名分流解析:nameserver-policy
只用一組 DNS 伺服器解析所有域名並不是最佳解——本地/區域域名交給電信業者的 DNS 通常更快,境外域名則應該交給不容易被汙染的 DNS 伺服器。nameserver-policy 可以按域名歸屬(配合 GeoSite 分類)分別指定解析路徑:
dns:
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
nameserver-policy:
"geosite:cn": [223.5.5.5, 119.29.29.29]
"geosite:geolocation-!cn": [https://1.1.1.1/dns-query]
沒有命中 nameserver-policy 的域名會走預設的 nameserver 清單;如果需要進一步判斷結果是否可信,還可以搭配 fallback 和下面的 fallback-filter 一起使用。
fallback-filter:判斷解析結果是否可信
fallback-filter 用於決定什麼情況下應該放棄預設 DNS 的結果、轉而使用 fallback 清單重新查詢,最常見的判斷依據是 geoip:
dns:
fallback-filter:
geoip: true
geoip-code: CN
開啟後,如果預設 DNS 回傳的 IP 不屬於 geoip-code 指定的地區(此處以 CN 為例,請依實際所在地區替換成對應的國碼),用戶端會判定這個結果可能不可靠(常見於汙染場景下回傳一個錯誤的境外 IP),轉而用 fallback 裡更可信的 DNS 伺服器重新解析一次。
排查清單
- 確認
dns.enable為true,否則整段 DNS 配置都不會生效; - 確認
enhanced-mode已設為fake-ip(或明確知道自己為什麼要用其他模式); - 區域網路裝置探索異常時,檢查是否需要把相關域名加入
fake-ip-filter; - 懷疑解析被汙染時,檢查
fallback和fallback-filter是否已正確配置。
想再深入了解 DNS 配置在完整 config.yaml 裡的位置,可以查看進階配置文件;如果只是剛接觸 Clash,多數用戶端的預設 DNS 設定已經足夠穩妥,不需要手動改動。
配好 DNS,就該正式用起來了
下載 Clash 用戶端,貼上訂閱連結,幾分鐘就能完成從安裝到連上網路的全部步驟。