DNS 没配好,会出什么问题

如果客户端只接管了流量转发,却没有接管 DNS 查询,域名解析请求可能仍然直接发往本地运营商 DNS。这会带来两个问题:一是解析结果可能被污染,返回错误的 IP,导致本该走代理的网站直接连接失败;二是即使流量本身走了代理,DNS 查询本身也暴露了你正在访问哪个域名,也就是常说的「DNS 泄漏」。

fake-ip:目前最主流的解决方案

enhanced-mode: fake-ip 的思路是:客户端拦截 DNS 查询后,不直接返回真实 IP,而是从一个专用的虚拟地址段(fake-ip-range)里分配一个假 IP 给应用程序;应用程序拿着这个假 IP 发起连接时,客户端再在网络层还原出真实的目标域名,按规则判断该走代理还是直连。整个过程对应用程序完全透明,兼容性和速度都是目前几种方案里最好的。

dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - "*.lan"
    - "localhost.ptlogin2.qq.com"

fake-ip-filter 用来排除不需要走假 IP 机制的域名,比较典型的是局域网设备发现、内网服务这类必须拿到真实 IP 才能正常工作的场景,命中过滤规则的域名会直接返回真实解析结果。

按域名分流解析:nameserver-policy

只用一组 DNS 服务器解析所有域名并不是最优解——境内域名交给运营商 DNS 通常更快,境外域名则应该交给不容易被污染的 DNS 服务器。nameserver-policy 可以按域名归属(配合 GeoSite 分类)分别指定解析路径:

dns:
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  fallback:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query
  nameserver-policy:
    "geosite:cn": [223.5.5.5, 119.29.29.29]
    "geosite:geolocation-!cn": [https://1.1.1.1/dns-query]

没有命中 nameserver-policy 的域名会走默认的 nameserver 列表;如果需要进一步判断结果是否可信,还可以配合 fallback 和下面的 fallback-filter 使用。

fallback-filter:判断解析结果是否可信

fallback-filter 用于决定什么情况下应该放弃默认 DNS 的结果、转而使用 fallback 列表重新查询,最常见的判断依据是 geoip

dns:
  fallback-filter:
    geoip: true
    geoip-code: CN

开启后,如果默认 DNS 返回的 IP 不属于 geoip-code 指定的地区(这里是中国大陆),客户端会认为这个结果可能不可靠(常见于污染场景下返回一个错误的境外 IP),转而用 fallback 里更可信的 DNS 服务器重新解析一次。

提示: 多数客户端的默认配置已经包含了合理的 DNS 设置,日常使用不需要手动改动这部分;只有在自己手写配置、或者怀疑存在解析异常时,才需要按这篇的思路逐项排查。

排查清单

  • 确认 dns.enabletrue,否则整段 DNS 配置都不会生效;
  • 确认 enhanced-mode 已设置为 fake-ip(或明确知道自己为什么要用其他模式);
  • 局域网设备发现异常时,检查是否需要把相关域名加入 fake-ip-filter
  • 怀疑解析被污染时,检查 fallbackfallback-filter 是否已正确配置。

想再深入了解 DNS 配置在完整 config.yaml 里的位置,可以查看进阶配置文档;如果只是刚接触 Clash,多数客户端的默认 DNS 设置已经足够稳妥,不需要手动改动。

配好 DNS,就该正式用起来了

下载 Clash 客户端,粘贴订阅链接,几分钟就能完成从安装到联网的全部步骤。