我是在安卓和 Windows 上用 Adguard 和 Adguard DNS 的,同时两个设备都使用 clash 翻墙。 在设置 NDS 时有个疑问: 一般系统可以设置 DNS 加密,Adguard 也能设置,而浏览器也能设置,另外一些安全软件也能设置,使用 Clash 的 mixin 也能够设置,所以到底在哪设置比较合适呢?他们有优先级吗?使用 clash 了还有必要设置 DNS 加密吗(我没配置 mixin )?
1
docx 2022-08-12 18:31:45 +08:00 via iPhone
我觉得的优先级:系统 > 代理 > 应用
浏览器的只能覆盖它自己,系统的理论上可以覆盖所有 APP 。 代理开启后,DNS 走隧道出去,直连和节点域名用代理工具的本地 DNS ,如果没有设置或者查询失败,再回落系统 DNS 。 |
2
Constantping 2022-08-12 18:40:31 +08:00
@docx 查詢失敗不應該直接「 ERR_NAME_NOT_RESOLVED 」嗎?
|
3
mschultz 2022-08-12 19:45:31 +08:00 2
浏览器使用哪个 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.com https://www.astrill.com/vpn-leak-test References: - https://blog.skk.moe/post/what-happend-to-dns-in-proxy/ - https://blog.skk.moe/post/i-have-my-unique-dns-setup/ |
4
yfugibr 2022-08-12 19:45:36 +08:00 via Android
@docx
Windows 上 Tun 模式的话: 代理软件会劫持所有 53 端口流量并重定向,因为有部分软件不使用系统设定,如果设定了加密 dns 就无法被劫持了 优先级:其他软件加密 dns > 代理软件 > 非加密 dns 非 tun 就不太确定了,不清楚 AdGuard 的实现机理 楼主安卓上的设定应该是 AdGuard vpn + clash 仅代理? adguard 优先劫持并重定向 53 端口,如果使用加密 dns ,clash 就只能拿到解析后的 ip ,只能通过 ip 分流(如果 Adguard 使用非加密 dns 可能会被 clash 再劫持一遍?) 系统开启加密后会和 AdGuard 冲突,不确定哪个优先 |
5
mschultz 2022-08-12 19:56:13 +08:00
@mschultz #3 补充:
A. 看到 OP 说 Clash 似乎没开启内置 DNS ,那么 Clash 内部如果遇到需要 DNS 解析的情形(比如浏览器扔过来一个域名,且 Clash 判断为直连或者需要测试 IP-CIDR 规则),应该会直接请求系统默认的 DNS 解析。 B. IP-CIDR 规则后面如果加了 no-resolve 参数,Clash 拿着域名遇到这条 IP 规则的时候就不会尝试把域名解析成 IP ,而是直接跳过。 |
6
xianzhe OP @mschultz 感谢,大体明白了。那么感觉使用 clash 来做 dns 解析更加可靠,如果没有 clash 做代理,系统或者其他软件设置了安全 dns ,可能访问国外的那些安全 dns 解析服务本身就成问题?另外,在 2*中您提到“clash 无法进行基于域名的规则匹配”,这是说 clash 的代理功能将会失效?
|
7
xianzhe OP @yfugibr 在安卓上因为我有 root,所以 Adguard 用的是本地 http 代理+clash ,dns 应该是被 clash 处理了,佐证就是我开了 clash 后,Adguard dns 统计面板里只有零星几个 dns 解析记录。
|
8
yfugibr 2022-08-12 21:09:26 +08:00
@xianzhe #7 如果流量优先走 clash 的话,adgaurd 就无效了,因为流量到达 adguard 时已经被 clash 加密了(可以开 adguard 日志确认一下)
|
9
docx 2022-08-12 21:18:33 +08:00 via iPhone
@yfugibr 可能没说清楚,我想表达的优先级属于另一维度。
应用可能回落到代理,代理可能回落到系统。设置了系统的,理论上其他都不设置,都会交给系统去解析(兜底),所以优先级系统>代理>应用。 优先设置系统,能够覆盖最全,也是最方便统一控制的。在前面两层出问题的情况下,设置系统 DNS 能保障解析依然是加密的。 |
10
mschultz 2022-08-12 22:52:05 +08:00
@xianzhe #6
#3 楼第 2.* 点「无法基于域名进行规则匹配」,这种情况其实 #4 楼也提到了。 也不是说 Clash 代理功能会失效。考虑以下例子。假如你 Clash 有这么 3 条规则: DOMAIN-SUFFIX,google.com,proxy GEOIP,CN,direct MATCH,direct ==== 然后,假设你浏览器要访问 www.google.com ,但是它没有把域名交给 Clash 解析,而是自己解析出来了,比如说 172.217.27.36 ,然后它把这个 IP 发给 Clash 说,我要连接这个 IP 。 由于 Clash 只拿到了一个 IP ,它无法匹配到第一条规则,当然第二条也不行因为这个 IP 不是 CN 的,最后就 MATCH 了最后的兜底规则,然后直连,然后连不上。 ==== 如果你的浏览器配置为,将域名交给 Clash 解析,那么浏览器就会把 www.google.com 这个域名不解析直接交给 Clash ,Clash 一看,好,匹配第一条规则,甩给远端 proxy 。这样你就能上 Google 了。 |