DNS 是 Clash 設定裡最容易出玄學問題的一段。分流不准、串流媒體不解鎖、內網訪問不了,八成能追到這裡。
先理解一個前提:為什麼代理用戶端要管 DNS
正常上網時,網域解析由系統完成,然後程式拿著 IP 去連接。
但在代理場景下有個矛盾:規則是按網域寫的,而流量到達核心時可能只剩 IP 了。
所以核心需要自己接管 DNS。接管方式有兩種。
redir-host:老實解析
核心收到 DNS 請求後,真的去解析這個網域,把真實 IP 回傳給應用,同時在內部記下「這個 IP 對應哪個網域」。
優點:回傳真實 IP,相容性最好,內網服務、區域網路設備都正常。
缺點:
- 每次解析都要等上游回傳,慢
- 境外網域如果解析被污染,會拿到錯誤 IP
- 解析結果可能是国內 CDN 的 IP,導致規則判斷偏差
fake-ip:先給個假的
核心收到 DNS 請求後,不去真的解析,直接從 198.18.0.0/16 這類保留網段裡分一個假 IP 回傳,同時記下「這個假 IP = 這個網域」。
應用拿著假 IP 發起連接,核心一看是假 IP,立刻反查出原網域,按網域匹配規則,然後由出口節點去做真正的解析。
優點:
- DNS 回應幾乎零延遲(不用等上游)
- 從根本上避免解析污染
- 網域資訊完整保留,規則匹配最准
- 由落地節點解析,串流媒體解鎖判定更準確
缺點:
- 回傳的是假 IP,某些依賴真實 IP 的場景會失敗
ping 域名顯示的是198.18.x.x,看起來奇怪(但不影響使用)- 內網網域必須加進
fake-ip-filter,否則解析不到
結論:絕大多數情況用 fake-ip
一份可用的 DNS 設定
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
prefer-h3: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.localdomain"
- "+.internal"
- "+.home.arpa"
- "+.pool.ntp.org"
- "time.*.com"
- "ntp.*.com"
- "+.market.xiaomi.com"
- "localhost.ptlogin2.qq.com"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
# 用於解析下面那些 DoH/DoT 伺服器自己的網域
default-nameserver:
- 223.5.5.5
- 119.29.29.29
# 主 DNS:解析国內網域
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
# 備用 DNS:解析境外網域
fallback:
- https://1.1.1.1/dns-query
- tls://8.8.4.4:853
# 什麼情況下采用 fallback 的結果
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
- 0.0.0.0/32
# 指定網域用指定 DNS
nameserver-policy:
"geosite:cn": [223.5.5.5, 119.29.29.29]
"+.mycompany.com": "10.10.0.53"四個欄位的分工
fallback-filter 的判定邏輯
同時向 nameserver 和 fallback 發查詢,然後:
nameserver回傳的 IP 在中国大陆 → 采用它(說明是国內網域)nameserver回傳的 IP 不在中国大陆 → 采用fallback的結果(說明是境外網域,国內 DNS 可能被污染)
這套機制讓国內網域走国內 DNS(快、CDN 就近),境外網域走境外 DNS(准、不污染)。
DNS 泄漏是怎麼回事
「DNS 泄漏」指的是:你以為流量走了代理,但網域解析請求走的還是本地 ISP 的 DNS。後果是 ISP 能看到你訪問了哪些網域。
瀏覽器的內置 DoH 是最常被忽略的泄漏源:Chrome 和 Firefox 預設可能啟用自己的加密 DNS,完全繞過系統和核心。
- Chrome/Edge:設定 → 隱私和安全 → 安全 → 關閉「使用安全 DNS」
- Firefox:設定 → 隱私與安全 → 最底部「通過 HTTPS 的 DNS」→ 關閉
常見故障對照
| 現象 | 原因 | 處理 |
|---|---|---|
| 內網網域解析失敗 | fake-ip 攔截了 | 加進 fake-ip-filter |
ping 域名 顯示 198.18.x.x | 正常現象 | fake-ip 就是這樣,不影響使用 |
| 區域網路設備名(NAS)訪問不了 | .local / .lan 被 fake-ip | 加 "*.lan"、"*.local" |
| 某些 App 一直轉圈 | 它自帶 DNS 且被劫持了 | TUN 下檢查 dns-hijack |
| 国內網站變慢 | 用了境外 DNS,CDN 調度到了遠處 | 配 nameserver-policy 讓国內網域走国內 DNS |
| 串流媒體判定地區錯誤 | 解析在本地完成 | 用 fake-ip,讓落地節點解析 |
| 時間同步失敗 | NTP 網域被 fake-ip | 加 "+.pool.ntp.org"、"time.*.com" |
| 微信/QQ 登入異常 | 特定網域需要真實 IP | 加 "localhost.ptlogin2.qq.com" |
fake-ip-filter 應該放哪些
原則:任何需要拿到真實 IP 才能工作的網域,都要加進來。
驗證 DNS 設定是否生效
看是不是 fake-ip 在工作:
nslookup google.com 127.0.0.1回傳 198.18.x.x 說明 fake-ip 正常。
看內網網域是否走了正確的 DNS:
nslookup gitlab.mycompany.com 127.0.0.1應該回傳真實的內網 IP,不是 198.18.x.x。如果回傳假 IP,說明 fake-ip-filter 沒寫對。
看解析耗時:
日誌級別切 debug,能看到每次 DNS 查詢的耗時和使用的伺服器。大量查詢耗時超過 200ms 說明上游 DNS 選得不好。
小結
- 預設用 fake-ip,它更快、更准、抗污染
- fake-ip-filter 是必須維護的:內網、NTP、連通性偵測三類一個都不能少
- nameserver-policy 優先級最高,用它做精確的 DNS 分流
- 瀏覽器的內置 DoH 要關,否則前面配的全白費
- default-nameserver 只能填純 IP
相關文件
從封包的視角講清楚 TUN 模式做了什麼:創建虛擬網路卡、改寫路由表、劫持 53 連接埠、以及 gvisor/system/mixed 三種協議棧的差異與選擇。
講清楚游戲流量的特殊性:為什麼 UDP 必須靠 TUN、NAT 類型是怎麼回事、丟包比延遲更致命,以及一份面向低延遲的設定調整清單。