DNS 加密怎么设置?

2022-08-12 17:58:14 +08:00
 xianzhe

我是在安卓和 Windows 上用 Adguard 和 Adguard DNS 的,同时两个设备都使用 clash 翻墙。 在设置 NDS 时有个疑问: 一般系统可以设置 DNS 加密,Adguard 也能设置,而浏览器也能设置,另外一些安全软件也能设置,使用 Clash 的 mixin 也能够设置,所以到底在哪设置比较合适呢?他们有优先级吗?使用 clash 了还有必要设置 DNS 加密吗(我没配置 mixin )?

1627 次点击
所在节点    DNS
10 条回复
docx
2022-08-12 18:31:45 +08:00
我觉得的优先级:系统 > 代理 > 应用

浏览器的只能覆盖它自己,系统的理论上可以覆盖所有 APP 。
代理开启后,DNS 走隧道出去,直连和节点域名用代理工具的本地 DNS ,如果没有设置或者查询失败,再回落系统 DNS 。
Constantping
2022-08-12 18:40:31 +08:00
@docx 查詢失敗不應該直接「 ERR_NAME_NOT_RESOLVED 」嗎?
mschultz
2022-08-12 19:45:31 +08:00
浏览器使用哪个 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/
yfugibr
2022-08-12 19:45:36 +08:00
@docx
Windows 上 Tun 模式的话:
代理软件会劫持所有 53 端口流量并重定向,因为有部分软件不使用系统设定,如果设定了加密 dns 就无法被劫持了

优先级:其他软件加密 dns > 代理软件 > 非加密 dns

非 tun 就不太确定了,不清楚 AdGuard 的实现机理

楼主安卓上的设定应该是 AdGuard vpn + clash 仅代理? adguard 优先劫持并重定向 53 端口,如果使用加密 dns ,clash 就只能拿到解析后的 ip ,只能通过 ip 分流(如果 Adguard 使用非加密 dns 可能会被 clash 再劫持一遍?)
系统开启加密后会和 AdGuard 冲突,不确定哪个优先
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 ,而是直接跳过。
xianzhe
2022-08-12 21:01:13 +08:00
@mschultz 感谢,大体明白了。那么感觉使用 clash 来做 dns 解析更加可靠,如果没有 clash 做代理,系统或者其他软件设置了安全 dns ,可能访问国外的那些安全 dns 解析服务本身就成问题?另外,在 2*中您提到“clash 无法进行基于域名的规则匹配”,这是说 clash 的代理功能将会失效?
xianzhe
2022-08-12 21:03:07 +08:00
@yfugibr 在安卓上因为我有 root,所以 Adguard 用的是本地 http 代理+clash ,dns 应该是被 clash 处理了,佐证就是我开了 clash 后,Adguard dns 统计面板里只有零星几个 dns 解析记录。
yfugibr
2022-08-12 21:09:26 +08:00
@xianzhe #7 如果流量优先走 clash 的话,adgaurd 就无效了,因为流量到达 adguard 时已经被 clash 加密了(可以开 adguard 日志确认一下)
docx
2022-08-12 21:18:33 +08:00
@yfugibr 可能没说清楚,我想表达的优先级属于另一维度。

应用可能回落到代理,代理可能回落到系统。设置了系统的,理论上其他都不设置,都会交给系统去解析(兜底),所以优先级系统>代理>应用。
优先设置系统,能够覆盖最全,也是最方便统一控制的。在前面两层出问题的情况下,设置系统 DNS 能保障解析依然是加密的。
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 了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872494

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX