以 Clash 为例,配置如下
dns:
enable: true
listen: 127.0.0.1:5553
enhanced-mode: fake-ip
nameserver:
- tls://120.53.53.53:853
fallback:
- https://public.dns.iij.jp/dns-query
……
rules:
- GEOIP,CN,DIRECT
- MATCH,代理
不考虑系统 DNS 缓存和浏览器 DNS 缓存,我理解的流程是
- Clash 接收到 google.com 这个域名,执行规则匹配
- [GEOIP,CN,DIRECT]这条规则需要域名解析,执行域名解析流程
2.1 使用 nameserver 解析 google.com ,拿到一个错误(被污染)的境外 IP
2.2 Clash 判断此 IP 为境外 IP ,使用 fallback 重新解析,拿到正确 IP - [GEOIP,CN,DIRECT]规则不匹配,继续匹配下一条规则
- [MATCH,代理]规则匹配,将域名(而不是步骤 2 解析出来的 IP )转发到代理服务器
- 代理服务器重新解析 google.com 域名,拿到正确 IP ,建立连接
- 代理服务器返回网页内容
如果没有基于 IP 的规则
rules:
- direct_domain,DIRECT
- proxy_domain,代理
- MATCH,代理
则只进行域名匹配,也不需要在本地域名解析
参考文章
DNS 污染对 Clash ( for Windows )的影响
浅谈在代理环境中的 DNS 解析行为
综上,我的理解是包括 Clash 在内的一众代理软件,配置 dns 的意义仅在于分流和 tun 模式下的 fake-ip ,最终代理服务器会重新解析域名,拿到最近的 IP 。但是经常在一些讨论贴,或是 Clash 、mosdns 的 Issue 区看到“通过代理请求域名服务器(比如通过代理请求 8.8.4.4)”这种需求,不理解有何实际含义,请 V 友们不吝赐教。