V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xianzhe
V2EX  ›  DNS

DNS 加密怎么设置?

  •  
  •   xianzhe · 2022-08-12 17:58:14 +08:00 · 1910 次点击
    这是一个创建于 816 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 条回复    2022-08-12 22:52:05 +08:00
    docx
        1
    docx  
       2022-08-12 18:31:45 +08:00 via iPhone
    我觉得的优先级:系统 > 代理 > 应用

    浏览器的只能覆盖它自己,系统的理论上可以覆盖所有 APP 。
    代理开启后,DNS 走隧道出去,直连和节点域名用代理工具的本地 DNS ,如果没有设置或者查询失败,再回落系统 DNS 。
    Constantping
        2
    Constantping  
       2022-08-12 18:40:31 +08:00
    @docx 查詢失敗不應該直接「 ERR_NAME_NOT_RESOLVED 」嗎?
    mschultz
        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/
    yfugibr
        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 冲突,不确定哪个优先
    mschultz
        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 ,而是直接跳过。
    xianzhe
        6
    xianzhe  
    OP
       2022-08-12 21:01:13 +08:00 via Android
    @mschultz 感谢,大体明白了。那么感觉使用 clash 来做 dns 解析更加可靠,如果没有 clash 做代理,系统或者其他软件设置了安全 dns ,可能访问国外的那些安全 dns 解析服务本身就成问题?另外,在 2*中您提到“clash 无法进行基于域名的规则匹配”,这是说 clash 的代理功能将会失效?
    xianzhe
        7
    xianzhe  
    OP
       2022-08-12 21:03:07 +08:00 via Android
    @yfugibr 在安卓上因为我有 root,所以 Adguard 用的是本地 http 代理+clash ,dns 应该是被 clash 处理了,佐证就是我开了 clash 后,Adguard dns 统计面板里只有零星几个 dns 解析记录。
    yfugibr
        8
    yfugibr  
       2022-08-12 21:09:26 +08:00
    @xianzhe #7 如果流量优先走 clash 的话,adgaurd 就无效了,因为流量到达 adguard 时已经被 clash 加密了(可以开 adguard 日志确认一下)
    docx
        9
    docx  
       2022-08-12 21:18:33 +08:00 via iPhone
    @yfugibr 可能没说清楚,我想表达的优先级属于另一维度。

    应用可能回落到代理,代理可能回落到系统。设置了系统的,理论上其他都不设置,都会交给系统去解析(兜底),所以优先级系统>代理>应用。
    优先设置系统,能够覆盖最全,也是最方便统一控制的。在前面两层出问题的情况下,设置系统 DNS 能保障解析依然是加密的。
    mschultz
        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 了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3440 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:06 · PVG 08:06 · LAX 16:06 · JFK 19:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.