很多人排查"规则明明写对了,网站却还是打不开"的问题时,最后发现根源出在 DNS 上——规则再准确,如果域名解析出的 IP 本身就是错的,后面的分流逻辑就无从谈起。这篇文章讲清楚 DNS 污染、DNS 泄露分别是什么问题,以及 Clash 里对应的解决方式。
01DNS 污染是什么
DNS 污染指的是:你查询一个域名的 IP 地址时,网络中间设备"抢答"返回了一个错误或者被屏蔽的 IP,而不是该域名真实指向的服务器地址。结果就是即使代理规则判断正确该走代理,但因为拿到的 IP 本身是错的,连接依然会失败或者被跳转到错误的页面。
解决方式:使用可信的上游 DNS
在 config.yaml 中配置使用境外或经过加密的 DNS 服务器(DoH/DoT),可以绕开中间网络设备对普通 UDP DNS 查询的干扰:
dns:
enable: true
nameserver:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query02DNS 泄露是什么
DNS 泄露指的是:代理连接本身走了代理节点,但发出 DNS 查询请求时却绕过了代理、直接用本机网络环境去查询,导致你的真实网络运营商仍然能看到你访问了哪些域名,代理只保护了后续的数据传输,没有保护"你访问过什么"这个信息本身。
解决方式:开启 fake-ip 模式
fake-ip 模式让 Clash 内核接管 DNS 解析过程:应用查询域名时,Clash 先返回一个虚构的本地 IP,等实际发起连接时再根据规则决定真正的解析方式和出口,这样 DNS 查询本身也被纳入了 Clash 的统一处理流程,不会绕过代理直接泄露给本地网络。
dns:
enable: true
mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "localhost.ptlogin2.qq.com"03nameserver-policy:按域名分流 DNS 查询
有些域名你希望强制使用特定的 DNS 服务器解析(比如国内域名用国内 DNS 换取更快的 CDN 节点,境外域名用境外 DNS 避免污染),这时可以用 nameserver-policy 按域名规则分别指定:
dns:
enable: true
nameserver-policy:
"geosite:cn": ["223.5.5.5", "119.29.29.29"]
nameserver:
- https://1.1.1.1/dns-query上面的写法表示:命中 geosite:cn(国内域名分类规则)的查询走国内 DNS,其余域名走默认的 nameserver 列表。
04常见字段速查
| 字段 | 作用 |
|---|---|
| enable | 是否启用 Clash 内置 DNS 服务器接管解析过程,通常应设为 true。 |
| mode | 解析模式:fake-ip(推荐,防泄露)或 redir-host(兼容性更好但防泄露效果较弱)。 |
| nameserver | 默认使用的上游 DNS 服务器列表,建议使用 DoH/DoT 加密查询。 |
| nameserver-policy | 按域名规则指定专属 DNS 服务器,优先级高于默认 nameserver。 |
| fake-ip-filter | 排除不适合使用虚构 IP 的域名列表。 |
05如何验证 DNS 配置是否生效
改完配置后,不要凭感觉判断,用几个简单的办法就能确认 DNS 是否按预期工作:
- 看客户端的连接日志:大多数客户端在"日志"或"连接"面板里会显示每次请求实际解析到的目标地址,如果开启 fake-ip,能看到域名被解析成 198.18.x.x 段的虚构地址,说明 fake-ip 已生效。
- 用在线工具检测 DNS 泄露:在开启代理的状态下访问 DNS 泄露检测类网站,如果显示的 DNS 服务器归属地和你实际所在地区、运营商一致,说明查询请求没有走代理出去,存在泄露风险,需要重新检查 fake-ip 或 nameserver-policy 配置。
- 对比国内外域名的解析结果:访问一个国内网站和一个境外网站,分别查看实际连接使用的出口节点是否符合预期(国内直连、境外走代理),如果出口不对,通常是 nameserver-policy 里的域名分类规则没有覆盖到,需要补充对应的 geosite 规则。
大多数订阅生成的配置已经包含一份可用的 DNS 设置,普通用户不需要从零手写;但如果你遇到"规则正确却连不上"或者"担心 DNS 层面暴露隐私"的情况,回头检查这部分配置往往能定位到问题所在。