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 类型是怎么回事、丢包比延迟更致命,以及一份面向低延迟的配置调整清单。