本篇文章着重记录Clash.meta/mihomo的DNS运行特点(如DNS缓存状况、fallback机制等),作为备忘录使用。

乐观缓存

  • Clash的DNS拥有乐观缓存机制,测试时Clash提供了一个过期了24个小时的记录,其TTL为1(1秒),并且在提供过期记录之后触发了DNS记录更新,在下次解析时则为没过期的内容。
  • 根据配置文件,Clash应该没有持久化保存DNS缓存的机制,即在Clash重启或关闭后缓存就会丢失。
  • 乐观缓存目前是无法关闭的。

Fake-ip

  • 使用Fake-ip响应DNS解析时Clash不会在日志中显示解析记录。
  • 有些互联网连接不支持使用Fake-ip,所以需要利用fake-ip-filter字段将这些连接切换为普通的真ip模式(redir-host)。

Fallback

DNS的fallback组和nameserver组通常是并发解析的,即同时使用这两个组解析域名,这是为了防止DNS污染,这也是使用Clash时有DNS泄露的原因,并不是BUG或漏洞,这是正常现象。

1
2
3
4
5
6
7
8
9
10
11
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
ipcidr:
- 240.0.0.0/4
domain:
- '+.google.com'
- '+.facebook.com'
- '+.youtube.com'

fallback-filter

  • 两组解析时,根据fallback-filter的内容决定选择哪一个组的结果。比如:在geoip-code为CN时,检查nameserver结果的IP地址是否属于CN,如果不属于则采用fallback组的结果,同理nameserver结果如果在ipcidr字段中也会采用fallback组的结果。
  • fallback-filtergeosite字段已经被弃用,弃用的警告会在Clash启动时输出到日志中并且还建议用户改用nameserver-policy。
  • ipcidrgeoip-code不同,domaingeosite不会等到两个组都解析出结果时才起作用,而是直接交给fallback组解析,完全不使用nameserver

在连接页面中所有的连接目标都是IP,而不是域名

Clash通过DNS解析记录推测用户访问的网站。如果DNS配置有误,客户端的DNS请求绕过了Clash的DNS就会导致这个问题。可以通过开启域名嗅探解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sniffer:
enable: true
force-dns-mapping: true
parse-pure-ip: true
override-destination: false
sniff:
HTTP:
ports: [80, 8080-8880]
override-destination: true
TLS:
ports: [443, 8443]
QUIC:
ports: [443, 8443]
force-domain:
- +.v2ex.com
skip-domain:
- Mijia Cloud
skip-src-address:
- 192.168.0.3/32
skip-dst-address:
- 192.168.0.3/32