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 設定,日常使用不需要手動改動這部分;只有在自己手寫配置、或懷疑存在解析異常時,才需要按這篇的思路逐項排查。

排查清單

  • 確認 dns.enabletrue,否則整段 DNS 配置都不會生效;
  • 確認 enhanced-mode 已設為 fake-ip(或明確知道自己為什麼要用其他模式);
  • 區域網路裝置探索異常時,檢查是否需要把相關域名加入 fake-ip-filter
  • 懷疑解析被汙染時,檢查 fallbackfallback-filter 是否已正確配置。

想再深入了解 DNS 配置在完整 config.yaml 裡的位置,可以查看進階配置文件;如果只是剛接觸 Clash,多數用戶端的預設 DNS 設定已經足夠穩妥,不需要手動改動。

配好 DNS,就該正式用起來了

下載 Clash 用戶端,貼上訂閱連結,幾分鐘就能完成從安裝到連上網路的全部步驟。