浏览器使用哪个 DNS 一般受到设置影响,这个问题涉及到的 cases 有点儿多,我以 macOS + Firefox + Clash 的组合举几个例子。假设 Clash 开启了内置 DNS 功能:
========
1. Firefox 网络设置中,Clash 为 SOCKS5 代理,且勾选了 "Proxy DNS when using SOCKS v5",那么 Firefox 会将域名解析工作交给 Clash 。Clash 拿到 Firefox 给过来的域名后,开始自上而下进行规则匹配,又分为如下情况:
1.1.1 如果遇到了一条 IP-CIDR/GEOIP 类规则,Clash 就会用内置的 DNS 将这个域名解析成 IP ,然后继续比对规则,直到匹配到一条规则或者 MATCH 。
1.1.2 如果 Clash 在比对规则过程中,在遇到任何 IP-CIDR 规则 **之前** 就抢先匹配上了一条域名规则,且这个规则要求该域名走代理节点,那么 Clash 不会解析该域名,而是会直接把域名扔给远端代理节点去解析。如果这个规则要求该域名直连,则 Clash 会解析该域名然后直连。
========
2. Firefox 网络设置中,Clash 为 SOCKS5 代理,但是不 "Proxy DNS when using SOCKS v5",那么 Firefox 会首先以自己的默认方式尝试解析这个域名(即请求操作系统解析)为 IP ,然后将建立连接的请求转发给 SOCKS v5 代理即 Clash 。
2.* 此时如果打开 Clash 的面板,你会观察到一个现象就是 Firefox 过来的连接全都是 IP 地址,看不出连了哪个域名。因此,在这种工况下,Clash 无法进行基于域名的规则匹配。
========
在 1 情况下,Firefox 内开启「浏览器内置 DoH 」没什么用。
在 2 情况下,开启浏览器内置 DoH ,Firefox 自行解析域名时会优先使用内置 DoH ,其次 Fallback 到系统(具体是否 Fallback 理论上取决于 network.trr.mode 设置 )
========
你可以看一下这些过程里有哪些步骤发生了 DNS 解析。也可以顺着这个思路自己分析、测试、观察一下其他情况下浏览器实际使用了什么 DNS 。
2 个测试 DNS leak 的网站:
https://www.dnsleaktest.comhttps://www.astrill.com/vpn-leak-testReferences:
-
https://blog.skk.moe/post/what-happend-to-dns-in-proxy/-
https://blog.skk.moe/post/i-have-my-unique-dns-setup/