DNS 解析是代理链路中最易出现问题的环节。配置不当会引发两类风险:DNS 污染导致境外域名解析到错误 IP 而无法访问;DNS 泄漏则让真实的访问记录暴露给 ISP。Clash 官方 DNS 模块内置 Fake-IP 机制,在系统层面从根本上解决上述两类问题,是 Clash 区别于同类工具的核心能力之一。
传统代理的 DNS 困境
在传统的 HTTP 代理模式下,当你的浏览器访问 google.com 时,会先在本地进行 DNS 解析,得到 IP 地址后再建立连接。这里存在一个矛盾:如果 DNS 解析走本地 ISP 的 DNS 服务器,google.com 的解析结果可能因为污染而返回错误的 IP;如果 DNS 解析走代理,代理又需要先建立好连接才能转发 DNS 请求,形成鸡生蛋蛋生鸡的死循环。
早期的解决方案是在代理服务器端进行 DNS 解析(Remote DNS Resolution),即客户端直接把域名发给代理服务器,由代理服务器在其网络环境中解析并返回结果。这解决了污染问题,但增加了延迟,且无法与 Clash 的基于 IP 的规则(如 GEOIP)配合使用。
Fake-IP 的工作机制
Fake-IP 是 Clash 采用的一种更优雅的解决方案。其核心思路是:当应用程序发出 DNS 请求时,Clash 不等待真实的 DNS 解析结果,而是立即从预留的 IP 段(默认 198.18.0.0/16)中分配一个"假"IP 返回给应用程序。应用程序收到这个假 IP 后立即发起连接请求,Clash 截获这个连接,根据假 IP 查找对应的域名,再根据规则决定如何处理。
这样做的好处非常明显:应用程序不需要等待 DNS 解析完成就能开始连接,大幅降低了首次连接的延迟;真实的 DNS 解析在后台异步进行,并且是通过代理发出的,完全避免了 DNS 污染;同时也杜绝了 DNS 泄漏——因为所有 DNS 请求都由 Clash 统一管理,不会有任何请求泄漏到本地 DNS 服务器。
DNS 完整配置示例
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
# 不使用 Fake-IP 的域名(直接返回真实 IP)
fake-ip-filter:
- "*.lan"
- localhost.ptlogin2.qq.com
# 国内 DNS:用于解析直连域名,速度快
nameserver:
- 223.5.5.5 # 阿里
- 119.29.29.29 # 腾讯
# 境外 DNS:用于解析代理域名,防污染
fallback:
- https://8.8.8.8/dns-query # Google DoH
- https://1.1.1.1/dns-query # Cloudflare DoH
- tls://8.8.4.4:853 # Google DoT
# 触发 fallback 的条件
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4 # 保留地址,通常是污染结果
nameserver 与 fallback 的分工
nameserver 是主 DNS 服务器组,负责处理大部分 DNS 请求,通常配置为国内速度快的 DNS(如阿里 223.5.5.5、腾讯 119.29.29.29)。fallback 是备用 DNS 服务器组,当 nameserver 返回的结果被 fallback-filter 规则判定为可疑(如返回的是境外 IP,或落在保留地址段)时,Clash 会转而使用 fallback DNS 重新查询,并以 fallback 的结果为准。
推荐 fallback DNS 使用 DoH(DNS over HTTPS)或 DoT(DNS over TLS)协议,这些协议对 DNS 请求进行加密传输,在网络传输过程中无法被中间节点篡改,彻底解决 DNS 污染问题。
fake-ip-filter:哪些域名不该用 Fake-IP
并非所有域名都适合使用 Fake-IP。以下几类域名需要加入 fake-ip-filter 排除列表,让 Clash 直接返回真实 IP:
- 局域网域名:如
*.local、*.lan,这些地址在局域网内使用,Fake-IP 会导致局域网设备无法正常发现 - 游戏平台相关域名:部分游戏客户端会对 DNS 解析结果进行校验,Fake-IP 可能触发反作弊机制
- NTP 时间同步服务:时间同步对 IP 的准确性有要求,应直接返回真实 IP
- 特定应用的认证域名:如 QQ 登录域名,使用 Fake-IP 可能导致登录失败
验证 DNS 是否存在泄漏
配置完成后,可以访问 dnsleaktest.com 或 bash.ws/dnsleak 进行 DNS 泄漏检测。如果检测结果只显示你代理服务器所在地区的 DNS 服务器,说明配置正确;如果显示了你本地 ISP 的 DNS 服务器,则存在 DNS 泄漏,需要检查 DNS 配置或结合 TUN 模式的 DNS 劫持功能来解决。