代理連上了、網站能開,但 DNS 查詢還在裸奔——這就是 DNS 洩漏:你訪問了什麼域名,本地網路運營商看得一清二楚。這一篇講清 Clash 的 DNS 機制和堵住洩漏的配置。

DNS 洩漏示意:明文 53 埠查詢繞過隧道,加密 DNS 走隧道內
洩漏的本質:DNS 查詢沒走隧道,把訪問意圖暴露給了本地網路

洩漏是怎麼發生的

只開系統代理時,瀏覽器的 DNS 查詢通常由代理伺服器遠端解析,問題不大。但 TUN 模式下如果 DNS 配置不當,或某些應用自行呼叫系統解析器,查詢就會以明文 UDP 直奔運營商 DNS(埠 53)——流量走了隧道,「想去哪」卻先廣播了出去。

Clash 的解法:接管解析

Mihomo 內建 DNS 模組,兩種工作模式:

  • fake-ip(推薦):應用問「google.com 的 IP 是多少」,核心直接回一個保留段假地址(198.18.x.x),應用拿假 IP 發起連線,核心憑假 IP 反查域名、按域名規則分流。真正的解析在代理出口完成——本地網路全程只見假地址,無洩漏且省一次解析延遲。
  • redir-host:返回真實 IP,相容性更好,但解析路徑難控,洩漏風險高。僅在個別應用與 fake-ip 衝突時降級使用。

推薦配置模板

寫進 Merge(做法見增強配置),覆蓋訂閱自帶的 DNS 段:

dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - "*.lan"
    - "+.local"
    - "+.msftconnecttest.com"   # 系統聯網檢測走真實解析
  nameserver:
    - https://223.5.5.5/dns-query   # 國內域名用加密 DNS
  fallback:
    - https://1.1.1.1/dns-query     # 命中境外域名時使用
  fallback-filter:
    geoip: true
    geoip-code: CN

要點:nameserverfallback 都用 DoH(HTTPS 加密),即使這段查詢沒進隧道,內容也不是明文;fake-ip-filter 把區域網和系統探測域名排除在假 IP 之外,避免印表機、聯網檢測這類功能異常。

TUN 模式的最後一塊拼圖

開 TUN 時保持「DNS 劫持」為 any:53(預設值)。它把所有仍然頭鐵直連 53 埠的明文查詢強行截進核心處理——不管應用多不配合,都逃不出去。TUN 配置本身見 TUN 教程

怎麼驗證沒洩漏

  1. 開著代理訪問 dnsleaktest.com 或 browserleaks.com/dns,跑 Extended 測試;
  2. 結果裡出現的解析伺服器應該全部位於代理出口所在地區/或你配置的 DoH 提供商;
  3. 一旦出現本地運營商的 DNS 伺服器,就是洩漏——回頭檢查 fake-ip 是否開啟、DNS 劫持是否生效。

改完 DNS 配置記得清一次 fake-ip 快取(重啟核心即可),否則新舊對映混雜可能出現個別網站打不開的假象。