Clash 为什么自带一套 DNS
打开任意一份 Clash 或 Clash Meta(mihomo)的配置文件,都能看到一整段以 dns 开头的字段。它不是摆设,也不是只有进阶玩家才需要碰的部分。
系统代理模式下,浏览器把域名原样交给代理,由远端服务器解析,本机 DNS 看似无关紧要。但只要有一个应用不走代理、直接向运营商 DNS 发出 UDP 53 查询,污染和泄漏就回来了:拿到的可能是投毒后的假 IP,查询记录也完整留在本地网络侧。
TUN 模式下,整机流量都进虚拟网卡,域名解析必须先有着落。Clash 的内置 DNS 模块就是干这个的:统一接管 53 端口的查询,按配置决定每个域名问谁、怎么问、信哪边的结果。
所以 dns 段落填得对不对,直接决定三件事:网页打开快不快、会不会拿到被污染的地址、查询记录落在谁手里。
dns 段落字段逐个看
开关三件套:enable / listen / ipv6
enable:总开关。填 false 时整段不生效,Clash 不接管任何解析,所有字段等于白写。listen:内置 DNS 服务器的监听地址,常见写法0.0.0.0:53。TUN 劫持的终点、局域网设备把 Clash 当 DNS 用时的入口,都是这个端口。只在本机使用且走 TUN 劫持时,保持默认即可。ipv6:填 false 时丢弃 AAAA 查询结果。宽带没有 IPv6 时建议关掉,避免应用拿到 v6 地址后走一条不存在或更慢的路线。
enhanced-mode 与 fake-ip-filter
redir-host:传统模式,每个域名都做真实解析,兼容性最好,代价是多一次 DNS 往返。fake-ip:命中代理规则的域名直接返回 198.18.0.x 段的假地址,省掉真实解析,连接建立更快,也能绕开应用自己发 DNS 时被污染的环节。fake-ip-filter:例外名单,名单里的域名必须拿到真实 IP。典型条目包括局域网域*.lan、时间服务器、STUN 服务、部分厂商的登录域。某个应用在 fake-ip 下行为异常,第一动作就是把它的域名加进这个名单。
default-nameserver:引导 DNS
它只干一件事:把配置里写成域名形式的 DNS 服务器(例如 dns.alidns.com)解析成 IP;在没有单独配置 proxy-server-nameserver 时,也负责解析代理节点的域名。
这里必须填纯 IP 的 UDP DNS,例如 223.5.5.5、119.29.29.29。填 DoH 地址会形成「先解析才能解析」的死循环,整个 dns 段直接瘫痪。
nameserver:主力解析列表
默认的域名解析服务器,多台并发查询,取最快的应答。取值写法有四种:纯 IP 即 UDP 53;tls:// 开头是 DoT;https:// 开头是 DoH;写 system 表示沿用系统 DNS。
家用场景填国内 DoH 即可:https://dns.alidns.com/dns-query、https://doh.pub/dns-query,延迟低,返回结果贴近本地 CDN 调度。
fallback 与 fallback-filter
fallback 与 nameserver 同时发起查询,服务于「可能被污染、或本就应走代理」的域名,一般填境外可信 DNS,例如 https://dns.cloudflare.com/dns-query、tls://8.8.4.4:853。
fallback-filter 决定信哪边的结果,四个子字段各司其职:
geoip与geoip-code:nameserver 返回的 IP 不属于指定地区(如 CN)时判为污染,采用 fallback 的应答。geosite:域名命中 gfw 等分类时,直接采用 fallback 的结果。ipcidr:返回 IP 落在240.0.0.0/4这类保留段时判为污染。domain:名单内的域名无条件走 fallback。
补充一句:mihomo 后续版本更推崇 nameserver-policy 加分流向的写法,fallback 依旧兼容,老配置不必急着改。
nameserver-policy:按域名指派(进阶)
按域名或分类指定专用解析服务器,优先级高于 nameserver 与 fallback。典型写法:'geosite:cn' 指向国内 DoH,'+.internal.example.com' 指向公司内网 DNS。分流颗粒度比 fallback-filter 更细,适合对解析路径有明确要求的场景。
「DNS 劫持」到底劫持什么
配置里的劫持指的是 Clash 主动接管本机发出的 53 端口查询,交给内置 DNS 按上面的规则应答,而不是拦截别人的流量。
TUN 模式下,配置 tun.enable 与 dns-hijack 后,所有进入虚拟网卡的 DNS 请求都会被收编,这是覆盖最彻底的方式,任何应用都绕不开。
系统代理模式不劫持 DNS。浏览器把域名交给代理远端解析没有问题,但本机直连的应用仍走系统 DNS。想堵住这条缝,要么开 TUN,要么手动把系统 DNS 改成 listen 填的地址。
listen 保持本机或内网可达即可,不要把内置 DNS 暴露到公网。开放递归 DNS 会被扫描器发现并利用于放大攻击。
两套可直接套用的配置
方案一:家用常规
fake-ip 提速,国内域名走阿里与腾讯的 DoH,命中 gfw 分类或返回非 CN 结果的域名自动改用 fallback。适合绝大多数家庭宽带:网页秒开,国内 CDN 不绕路。
dns:
enable: true
listen: 0.0.0.0:53
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.msftconnecttest.com"
- "time.*.com"
- "localhost.ptlogin2.qq.com"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
fallback:
- https://dns.cloudflare.com/dns-query
- tls://8.8.4.4:853
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
ipcidr:
- 240.0.0.0/4
方案二:严格防泄漏
respect-rules: true 让发往 nameserver 的查询本身按规则走代理,查询内容不落地到本地运营商;direct-nameserver 负责直连域名,proxy-server-nameserver 负责节点域名,三者职责分开。
dns:
enable: true
listen: 0.0.0.0:53
ipv6: false
respect-rules: true
enhanced-mode: fake-ip
fake-ip-filter:
- "*.lan"
- "*.local"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
direct-nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
nameserver:
- https://dns.cloudflare.com/dns-query
- https://dns.google/dns-query
再叠加 TUN 把整机 53 端口收编,不留旁路:
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
代价也要说清楚:境外 DoH 走代理,首次解析略慢;代理不可用时解析会整体失败,需要接受这层耦合。
改完配置,三步验证
- 看日志:客户端日志里的 [DNS] 行会打印每个域名用了哪台服务器、命中了哪条策略,先确认分流符合预期。
- 开检测页:浏览器访问 DNS 泄漏检测站点,看到的出口服务器应当是配置里的 DoH 提供方或代理出口,而不是本地运营商。
- 命令行抽查:执行
nslookup example.com 127.0.0.1直接向内置 DNS 提问;fake-ip 模式下代理域名返回 198.18.x.x 是正常现象,不是故障。
YAML 缩进错误是 dns 段不生效的头号原因。字段前统一两个空格,改完重载配置或重启内核再测。
三个高频问题
- 国内网站打开慢:fallback 填了境外 DNS 却没有配 geosite 分流,国内域名被境外服务器解析,CDN 调度跑偏。
- 某个应用联网异常:多半需要真实 IP,把它的域名加进 fake-ip-filter。
- 配置看起来没生效:确认
enable: true、缩进正确,并确认所用客户端没有在图形界面上覆写 dns 段。