Clash DNS 配置完全指南:Fake-IP、DNS 污染与自建解析
规则写得再精确,如果域名解析出来的 IP 本身就是错的,分流也无从谈起。这篇把 DNS 污染的原理、Clash 两种解析模式的区别、加密 DNS 与分域名解析策略讲透,帮你从根上排查"规则明明对了,却还是走错线路"的问题。
为什么 DNS 会成为分流翻车的元凶
很多人调了半天规则,发现某个网站还是走错线路,第一反应是"规则写错了",但真正的原因往往在更前面一步——域名解析。
规则分流的前提是"先知道这个域名/IP 该不该走代理",而这个判断有两种输入:域名本身(DOMAIN、DOMAIN-SUFFIX 等规则)和解析出的 IP(IP-CIDR、GEOIP 等规则)。如果 DNS 解析这一步就出了问题,后面所有基于 IP 的判断都会跟着错:
- DNS 污染 / 劫持:部分网络环境会对特定域名返回错误、甚至无法访问的 IP,常见于对某些境外域名的解析请求。
- 运营商 DNS 就近解析:出于 CDN 加速目的返回的 IP 未必是你期望连接的节点,可能影响
GEOIP判断。 - 本地 hosts / 缓存污染:系统或路由器层面的缓存记录了错误结果,重启客户端也没用,因为问题不在 Clash 里。
排查"规则不生效"问题时,DNS 应该是除了规则语法本身之外,第一个要检查的环节,而不是最后一个。
Fake-IP 与 Redir-Host:两种模式的取舍
Clash 的 dns.enhanced-mode 决定了解析行为的底层逻辑,两种模式各有取舍:
Fake-IP 模式
- 给每个域名分配一个虚假的、仅本机可见的 IP,真正解析延后到实际发起连接时才做
- 规则匹配可以直接按域名进行,兼容性最好,是 TUN 模式下的默认推荐
- 缺点:某些依赖"拿到真实 IP 做校验"的程序(部分游戏、企业内网客户端)可能不兼容
Redir-Host 模式
- 直接返回真实解析结果,行为更接近传统网络
IP-CIDR/GEOIP规则判断会更准确,路由器/网关场景更常用- 缺点:需要真实发起一次 DNS 查询才能决定走哪个代理,多一次往返延迟
没有绝对的"更好",一般建议:桌面客户端 + TUN 模式优先用 fake-ip;如果发现某个特定应用连接异常,可以在 fake-ip-filter 里把它的域名单独排除,而不是直接切换整个模式。
用加密 DNS 对抗污染:DoH 与 DoT
传统 DNS 查询是明文的 UDP 53 端口通信,容易被中间网络设备识别并篡改返回结果,这正是"DNS 污染"的常见成因之一。解法是把 DNS 查询包裹在加密通道里:
| 方式 | 全称 | 特点 |
|---|---|---|
DoH | DNS over HTTPS | 伪装成普通 HTTPS 流量,抗识别能力强,写法形如 https://1.1.1.1/dns-query |
DoT | DNS over TLS | 使用独立的 853 端口加密,特征比 DoH 明显一些,写法形如 tls://1.1.1.1 |
| UDP(传统) | DNS over UDP | 明文、速度最快,但完全暴露给中间网络,适合作为国内 DNS 的查询方式 |
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- https://1.1.1.1/dns-query
- tls://8.8.8.8
fallback-filter:
geoip: true
geoip-code: CN
思路和进阶手册里介绍的一致:nameserver 用国内明文 DNS 保证速度,fallback 用境外加密 DNS 保证准确性,fallback-filter 负责判断什么时候该切换到 fallback。
按域名分流解析:nameserver-policy
有时候你不想用"国内/国外"这种粗粒度的判断,而是想给特定域名指定专用的 DNS 服务器——比如公司内网域名必须用内网 DNS 才能解析成功,这时候需要 nameserver-policy:
dns:
nameserver-policy:
'geosite:private': '223.5.5.5'
'+.internal.company.com': '10.0.0.1'
'+.google.com': 'https://1.1.1.1/dns-query'
nameserver-policy 的匹配优先级高于全局的 nameserver / fallback,可以理解成"针对某几个域名的例外规则",非常适合公司内网、自建服务等有专属解析要求的场景。
内网域名如果被 Fake-IP 接管、又没有走到正确的内网 DNS,会导致内网服务"看起来能连上,但一直超时",遇到这种情况先检查 nameserver-policy 和 fake-ip-filter 是否把内网域名排除在外。
怎么验证解析结果是否正确
光靠"感觉网速慢/连不上"很难判断问题出在 DNS 还是别处,更靠谱的方式是直接查看实际解析到的地址:
- Dashboard 面板:几乎所有 Clash 客户端的控制面板都能看到每条连接实际使用的目标 IP,是最直接的排查入口,不需要额外工具。
- 命令行工具:Windows 下用
nslookup 域名,macOS/Linux 下用dig 域名或nslookup 域名,可以对比开启 Clash 前后同一个域名解析出的 IP 是否一致。 - Fake-IP 模式下的特殊情况:这种模式下系统层面
nslookup拿到的是虚拟 IP(通常落在198.18.0.0/16这个网段),这是正常现象,不代表解析出错,只有实际发起连接时内核才会去做真正的解析。
判断"是不是 DNS 污染"最简单的办法:临时把系统 DNS 或 Clash 的 nameserver 换成一个加密 DNS(比如 DoH),如果同一个域名换了 DNS 之后就能正常访问,基本可以确认是原来的 DNS 被污染或劫持。
要不要自建 DNS 服务器
对大多数人来说,用公共的加密 DNS(如 1.1.1.1、8.8.8.8)已经足够解决污染问题,不需要自己搭一套。但如果你在维护家庭网关、路由器这类需要给多台设备统一提供解析服务的场景,自建 DNS(比如搭配 AdGuard Home、dnsmasq)会更合适:
- 可以在网关层统一做广告过滤和分流解析,不需要每台设备单独配置
- 可以自定义本地域名解析(比如给内网设备起好记的名字),配合 Clash 的
nameserver-policy指向自建 DNS - 可以做请求日志和统计,方便排查哪些设备、哪些域名的解析请求异常
如果只是单机日常使用,直接用 Clash 内置的 DNS 模块配好 nameserver / fallback 就完全够用,自建 DNS 更多是网关级用户才需要考虑的进阶选项。
三步排查 DNS 相关问题
- 打开 Dashboard 的连接详情,确认出问题的连接实际解析到了哪个 IP,判断是"解析错了"还是"解析对了但规则没匹配上"。
- 临时把
enhanced-mode从fake-ip切到redir-host(或反过来)做对比测试,缩小问题范围。 - 确认
fallback-filter.geoip是否开启、geoip-code是否填的是你所在地区,这是最容易被忽略的一处细节。
如果以上都排查过依然无法定位,建议参考常见问题里的连接故障排查清单,或对照进阶手册的 DNS 章节重新检查一遍完整配置。