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

一直没想明白,通过代理请求 dns 有何实际意义?

  •  2
     
  •   zbatman · 285 天前 · 10803 次点击
    这是一个创建于 285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以 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 缓存,我理解的流程是

    1. Clash 接收到 google.com 这个域名,执行规则匹配
    2. [GEOIP,CN,DIRECT]这条规则需要域名解析,执行域名解析流程
      2.1 使用 nameserver 解析 google.com ,拿到一个错误(被污染)的境外 IP
      2.2 Clash 判断此 IP 为境外 IP ,使用 fallback 重新解析,拿到正确 IP
    3. [GEOIP,CN,DIRECT]规则不匹配,继续匹配下一条规则
    4. [MATCH,代理]规则匹配,将域名(而不是步骤 2 解析出来的 IP )转发到代理服务器
    5. 代理服务器重新解析 google.com 域名,拿到正确 IP ,建立连接
    6. 代理服务器返回网页内容

    如果没有基于 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 友们不吝赐教。

    第 1 条附言  ·  283 天前

    非常感谢大家用心的回答,在这里做个总结,也给未来看到这篇帖子的人一个参考
    #13 @NoOneNoBody 解答了我的疑问,由于部分地区无法直连境外的DNS,所以要通过代理访问,获取正确IP。

    至于部分V友提到的通过代理请求DNS可以获取离代理服务器最近的IP,这一点是无意义的(至少对于Clash是这样),因为在分流过程中,即使获取了正确IP,大部分代理软件还是会将域名(而不是分流过程中获取到的正确IP)发送到代理服务器,由代理服务器重新进行域名解析。

    对于Clash,在分流规则配置完善的前提下,DNS污染不会影响它的工作,参考文章《DNS污染对Clash(for Windows)的影响》

    还有很多V友担心的DNS泄露问题,对于Clash也可以通过配置分流规则解决,具体可以观看Youtube博主 不良林 的相关视频。

    再次感谢大家的回答!

    56 条回复    2024-03-08 17:35:05 +08:00
    xiwh
        1
    xiwh  
       285 天前   ❤️ 4
    因为在国内,不能保证你访问的是真正要访问 DNS 服务器,比如说你把你的 DNS 地址设置 8.8.8.8 就是访问的谷歌 DNS 服务器了吗?因为历史原因 DNS 是纯明文的,数据中抓过程中每一层都可以轻易的篡改 DNS 请求内容,很多时候运营商会劫持掉一些不和谐和请求,返回无效的 ip 地址,这样也就产生了 DNS 污染,所以说 Clash 等一众软件会让 DNS 请求也走代理,防止 DNS 污染
    gyang1111
        2
    gyang1111  
       285 天前
    提一点,第一个 ip 分流的方案不只是考虑到 dns 污染,还存在 dns 泄漏的问题
    gyang1111
        3
    gyang1111  
       285 天前
    @gyang1111 第二个方案还有个好处 根本不需要填 fallback 的地址 只配一个运营商 dns 就够了 只要有正确的域名分流规则,参考油管不良林关于 dns 泄漏的一个视频
    0o0O0o0O0o
        4
    0o0O0o0O0o  
       285 天前 via iPhone
    没用过 clash ,我就是代理请求国外 dns 的那类人,或者直连国外的 DoT 、DoH ,对我来说最重要的意义就是防止对国内运营商/国内 DNS 服务器泄露隐私。

    分流是额外的事情,我是白名单直连模式,国外走 vps 落地,未知走 warp 落地,不让 GFW 拿到我的一针一线。
    zbatman
        5
    zbatman  
    OP
       285 天前 via Android
    @xiwh 代理的 dns 一般会配置 DoT 或 DoH ,而且默认设置下 clash 是不会通过代理请求 dns 的
    tool2d
        6
    tool2d  
       285 天前
    "通过代理请求域名服务器(比如通过代理请求 8.8.4.4)"

    其实就是 DNS 污染解决了,大部分情况就可以不需要走代理服务了。

    墙封死 IP 地址的情况越来越少了,一般都暴力 DNS 污染。
    docx
        7
    docx  
       285 天前 via Android
    不知道 Clash 是不是一样。有些代理工具内填的 nameserver 只是用来解析 DIRECT (也包括远程节点本身)的域名,其余都通过远程节点去解析
    zbatman
        8
    zbatman  
    OP
       285 天前
    @gyang1111 这个明白,写的配置只是为了辅助说明“即使获得了正确 ip ,最终代理服务器还是会重新解析一次”这一点
    zbatman
        9
    zbatman  
    OP
       285 天前
    @tool2d 这种情况大部分会出现在一些小众域名吧,只被 DNS 污染,没封 IP 。但是像这种的可以通过可直连的境外 DoT 、DoH 解决,也没必要去走代理请求 dns
    TESTFLIGHT2021
        10
    TESTFLIGHT2021  
       285 天前
    不会被污染
    tool2d
        11
    tool2d  
       285 天前
    "但是像这种的可以通过可直连的境外 DoT 、DoH 解决"

    国内裸连挺难的,会出现各种未知问题。一个是 853 端口,另一个需要 https 标准签名握手,很容易被针对。

    还有看客户端具体怎么写的,你如果是浏览器,那么会把域名发给代理服务器,做二次 DNS 解析。但是如果你是 TCP 代理网游客户端,那么有可能代理服务器收到的就是一个纯 IP ,而不是域名。
    baobao1270
        12
    baobao1270  
       285 天前
    1. 防止 DNS 泄露
    2. 基于域名的分流总是不完善的,需要基于 GeoIP 的规则来补漏
    NoOneNoBody
        13
    NoOneNoBody  
       285 天前   ❤️ 1
    没用过早年梯子的人有这疑问很正常

    早年梯子是 http(s),不具备 dns 功能,随着 dns 污染越来越频繁,才逐步转向 socks4a/socks5
    现在的梯子基本都 socks5 起步,dns+数据
    这样可知,dns 和数据是两件事,各自都可以使用代理,只不过现在的梯子一起做了

    但这不能说两者分开没有意义,有部份访问,只是 dns 污染了,纯 ip 仍能直接访问,尤其 ipv6 ,只要解决 dns 问题,后面可以直连,至少有“省流”作用,对绕道的服务器来说,是减轻负担,对末端用户来说,是省点流量费,也可能省时间(指直连更快的情况)
    zbatman
        14
    zbatman  
    OP
       285 天前
    @NoOneNoBody
    @tool2d
    那其实归根结底还是解决“DNS 污染”的问题,为了获取正确的 IP ,就得走境外的 DNS 。而大部分境外的 DNS 无法直连,所以通过代理请求,这样理解没问题吧?
    tool2d
        15
    tool2d  
       285 天前
    @zbatman 现在新的安卓手机都有私人 DNS ,可以随便输入域名,也就是你说的 DoT/DoH 。

    但是你会发现,很难真的能连上国外的主流服务器地址。
    cndns
        16
    cndns  
       285 天前
    因为明文 UDP 的 dns 已经被劫持污染,DOT 的常规 TCP 853 又被封了,DOH 的呢 SIN 干扰严重
    popzuk
        17
    popzuk  
       285 天前
    clash 和 surge 是靠 fakeip 解决的,有的人可能不喜欢 fakeip 。
    zthxxx
        18
    zthxxx  
       285 天前   ❤️ 1
    浅谈在代理环境中的 DNS 解析行为
    https://blog.skk.moe/post/what-happend-to-dns-in-proxy/

    结帖。
    shyling
        19
    shyling  
       285 天前
    doh 这种不是更折腾吗,而且没有 edns , 不见得给你代理请求快的 ip
    NoOneNoBody
        20
    NoOneNoBody  
       285 天前
    @zbatman #14
    Y
    参看 #15 ,不敷述了
    mohumohu
        21
    mohumohu  
       285 天前
    你自己都假设一个前提“如果没有基于 IP 的规则”了,那你又谈“ Issue 区看到“通过代理请求域名服务器(比如通过代理请求 8.8.4.4)”这种需求”不理解有何实际含义,那别人就是有基于 IP 的规则呢?
    jujusama
        22
    jujusama  
       285 天前
    1. DIRECT 仅会请求本地 dns
    2. PROXY 最终会由代理服务器请求 dns 以拿到距离最近的 ip
    3. 通常分流规则下,本地 dns 的请求免不了
    zbatman
        23
    zbatman  
    OP
       285 天前
    @jujusama
    '1. DIRECT 仅会请求本地 dns',意思是如果请求 google.com ,正文中的 2.2 步骤是不会走的是吗,2.1 判断为境外 IP 的话,这条规则就跳过了?
    '3. 通常分流规则下,本地 dns 的请求免不了',这个通常分流规则有具体示例吗?
    byteroam
        24
    byteroam  
       285 天前
    那不就是掩耳盗铃吗,以为别人不知道你访问了啥
    jujusama
        25
    jujusama  
       285 天前
    @zbatman #23
    1. fallback 通常用于非 PROXY 的情况,如某些被污染但没有被阻断的网站
    2. 如 nameserver 返回非 cn ip ,那么会取 fallback 的结果去 geoip 匹配,一般来说都会走到 MATCH ,然后提交到代理
    3. 任意 ipcidr 的规则都会导致本地 dns 请求,否则如果域名匹配到 PROXY ,会直接发送给远端代理
    jianzhao123
        26
    jianzhao123  
       285 天前
    @baobao1270 你好,最近我也在看代理 DNS 泄露的问题,想请教一下基于域名分流确实不完美,但是基于 Geoip 的分流前提是得解析到一个 IP ,那么访问一下机场之类的域名还是要走本地的 DNS 解析,这个情况怎么避免呢?
    mohumohu
        27
    mohumohu  
       285 天前
    @jianzhao123 可以单独跑第三方 DNS 服务来查询,或者在配置的 hosts 选项里面写死域名的解析,机场的域名的 IP 一般不经常变。
    jianzhao123
        28
    jianzhao123  
       285 天前 via iPhone
    @mohumohu 好的,感谢🙏
    littlewing
        29
    littlewing  
       285 天前
    @zbatman 那如果 DoH 或 DoT 被墙呢
    mohumohu
        30
    mohumohu  
       285 天前
    举两个使用 GEOIP 规则用得到的场景:
    1 、我要不同 IP 段走不同的节点;比如域名解析结果是 JP 的 IP 只走 JP 节点,其他走 HK ;
    2 、回国线路,如果使用本地 IP 解析的是海外地址,使用代理解析符合 CN 的 IP 走代理;
    qiany
        31
    qiany  
       285 天前
    1.dns 泄露,不在乎隐私可以无视
    2.dns 污染.
    3.cdn 优化
    ysc3839
        32
    ysc3839  
       285 天前 via Android   ❤️ 1
    @NoOneNoBody http proxy 默认是代理解析域名,即使要自己走代理解析,也可以用 http CONNECT 请求连接 TCP DNS 服务器。
    而 SOCKS 就复杂了,如果把 http_proxy 环境变量设置成 socks4 或 socks5 开头,curl 会在本地解析 DNS ,要改成 socks4a 或 socks5h ,改了之后别的程序可能就不认了。
    dode
        33
    dode  
       285 天前 via Android
    @ysc3839 浏览器设置 clash 的 socks 服务,会走 clash 解析域名吗
    Lightbright
        34
    Lightbright  
       285 天前
    DNS 泄露问题可以参考这里,说的很详细
    zhishixiang
        35
    zhishixiang  
       285 天前
    国内互联网环境还不清楚? dns 又不加密,谁都能抢答,还能通过 dns 监听你正在访问什么网站
    ysc3839
        36
    ysc3839  
       285 天前 via Android
    @dode 看浏览器设置,Firefox 好像是有个远程解析 DNS 的选项,不选就会本地解析
    datocp
        37
    datocp  
       285 天前
    嘿嘿,想起当年 socks5+支持远程 DNS 查询?这都是多少年前的事情了。不解 2015 年的 1 月 1 日, ss 的 windows 客户端为什么因为一个 DNS 问题而导致无法访问,从那天开始弃用 ss 。内置 dns 软件见多了。记得 360/qq 打架那会儿,原来 QQ 浏览器也内置 DNS 查询。发现那天只好弃用。
    chancat
        38
    chancat  
       284 天前 via Android
    fakeip fakedns
    Jirajine
        39
    Jirajine  
       284 天前   ❤️ 1
    因为 clash 是网络加速工具而非审查绕过工具,使用过程中也只是看剧查资料等正常用户的需求,而非任何违反法律的事情,所以“拿到一个被污染的 ip (同时向国家暴露你在尝试访问被污染的域名)”和“将域名转发到代理服务器(让代理服务器知道你在访问的域名)”都是可以接受的,毕竟只要能连上就行,身正不怕影子斜的人不需要向任何人隐藏任何事,所以代理 dns 没有实际意义。
    cheng6563
        40
    cheng6563  
       284 天前
    DNS 污染的域名多了去了,而且是"海关"污染的,用国内的 DoH 照样污染。
    xpn282
        41
    xpn282  
       284 天前   ❤️ 1
    不需要搞 fallback ( fallback-filter )之类的了。fallback 太过复杂,什么 Nameserver 解析等结果,然后不是 cn 的 IP 又怎么样。。又采用什么 fallback 的结果,什么时候采用 fallback 结果又要看 fallback- filter 的配置,已经弃了。。

    现在直接用 nameserver-policy 方案,nameserver-policy 根据 geosite:cn 分流,dns 指向运营商,然后 nameserver 指向国外 dns 。现在国内外的 dns 就分流了。不管你用 fake-ip 还是 Redir-Host 模式,哪些所谓的 dns 测试网站都可以测试通过。
    nameserver:
    - tls://1.1.1.1
    - tls://8.8.4.4
    nameserver-policy:
    geosite:cn,private,apple:
    - 运营商 dns-

    至于国外 dns 需不需要代理看个人需求,我也试过代理 dns ,发现我日常使用起来代不代理 dns 感觉不出差别。。。
    ProphetN
        42
    ProphetN  
       284 天前
    @dode #33 Firefox 默认的 Socks 代理会本地解析完,交给 clash 。用了 SwitchyOmega 插件走 Socks 代理,就不会本地解析。
    starryloki
        43
    starryloki  
       284 天前
    不仅有能准确访问 DNS 的原因,用落地 IP 去请求 DNS 能获取就近 CDN ,你也不想落地 US 再绕回来访问 HK 或 JP 的 CDN 吧
    caneman
        44
    caneman  
       283 天前
    假设 clash 不劫持 DNS 请求,那么 chrome 发起一个对 google.com 的请求(假设没有 DNS 缓存)

    1. 发起一个 DNS 请求,因为国外的 DNS 服务器比较远,一般都是写国内的或者运营商分配的,速度最快,得到 google.com 的地址 1.1.1.1 (这样存在两个问题,①因为国内 DNS ,这个地址是假的( DNS 污染)②DNS 运营商知道了你在访问 google.com ( DNS 泄露))
    2. Chrome 发起 TCP 请求,目标 IP1.1.1.1, 端口 80 ,域名 google.com
    3. clash 针对 google.com 执行基于域名的分流
    4. 转发到代理服务器
    5. 代理服务器并不会信任 1.1.1.1 的 ip 地址,它会再一次发起 DNS 请求查询 google.com 的地址,得到 2.2.2.2
    6. 代理服务器对 2.2.2.2 发起 TCP 请求并将结果转发给你


    单从这个例子上看,,第一步的 DNS 请求其实是没必要的,而且会导致 DNS 污染和泄露。fake-ip,就是在这一步直接给你个假的 ip 地址,然后 2 、3 、4 、5 、6 不变,结果上看没什么区别,但是少一次 DNS ,网页速度加载快了很多。

    但是问题是基于域名的分流策略是有限的,不可能把所有域名都加里面,还有基于 IP 的分流做补充。现在访问一个不在域名分流列表的域名,是需要获取真实 IP 的,你得先有 IP ,才能基于 IP 做分流。所以还是会有:需要在本地做一次 DNS 查询的情况。

    这种情况下,能用国内的 DNS 服务器肯定先用国内的(速度快),但是国内的又不可信,所以 fake-ip 就采用了多路并发,一路是你 nameserver 下的国内 DNS 查询,一路是 fallback 的国外 DNS 查询,如果 namesever 的查询到的结果 IP 是国内的,就认为它是可信的。如果它查询到的地址是国外的,就信任 fallback 的结果,无论如何会有一个 IP ,然后再根据这个 IP 做 IP 策略的分流,后面的过程就是 4 、5 、6 。

    所以它的分流特性决定,基于 IP 的分流,必然存在真实的 DNS 查询情况



    那么为什么 clash 要劫持 DNS ,是不是必须的?

    答:不是必须的,是一种拖鞋的优点很多的方案

    1. 域名分流的情况下,可以加快访问(不发起真实 DNS 查询)

    2. 真实 DNS 查询的情况下,存在下面这两种问题(如果 clash 不劫持)

    a. 如果写国内的 DNS 服务器地址,那么结果被污染,基于 IP 分流失去意义

    b. 如果写国外的 DNS 服务器地址,那么查询太慢

    3. clash 劫持 DNS 可以尽可能保证使用国内的 DNS 解析不会被污染,同时又规避了全部走国外 DNS 查询过慢的缺点

    算是一种权衡吧,虽然优点很多,但是缺点也不少,我现在就被它的缺点搞得游戏打不了
    caneman
        45
    caneman  
       283 天前
    其实你明白下面这几点,就知道为什么采用劫持的方案了,归根结底是一种妥协,而且没有完美的解决方案。
    1. 域名是无限,网站是变化的,完全的基于域名的完美分流是不可能的
    2. 基于 IP 的分流,必然存在 DNS 查询过程
    3. DNS 查询,快(国内)必然有泄露和污染风险,无风险则必然慢(国外 DNS 服务器)

    clash 的 dns 劫持,本质上是在为了在 3 中建立一种平衡,尽可能的实现 快&安全,同时还有基于域名分流时的额外好处。(要实现 fake-ip 必须 DNS 劫持)
    slack
        46
    slack  
       277 天前
    因为国内的运营商很可能对 53 端口进行挟持,即使使用 DoH\DoT 仍然可能会被 SNI 阻断,这是就必须代理 DNS 了。
    wcnmm
        47
    wcnmm  
       237 天前
    @caneman 完全讲明白了,感谢
    jesky
        48
    jesky  
       199 天前
    挖一个:
    那么如果直接使用国内提供的所谓无污染 DNS 是否可靠呢?
    如:
    https://iqiq.io/servers.html
    https://apad.pro/dns-doh/
    zbatman
        49
    zbatman  
    OP
       199 天前
    @jesky
    第一个我用过一段时间,感受就是不太稳定,有时会断,偶尔会换 IP ,不像 iij 那样固定是两个 IP
    第二个没用过

    实际上无污染的 DNS 感觉没啥必要了,国内的域名走运营商或大厂的 DNS ,国外的本地不解析,让远程节点解析就可以了
    yggjklkaytui
        50
    yggjklkaytui  
       167 天前
    @xpn282 请教一下,我的设置 nameserver-policy 是刚好与你相反,但 https://ipleak.net 检测还是是国内 dns ,
    nameserver:
    - 192.168.1.1
    - 119.29.29.29
    - 223.5.5.5
    fake-ip-filter:
    - '*.lan'
    - localhost.ptlogin2.qq.com
    nameserver-policy:
    "geosite:geolocation-!cn":
    - 'tls://8.8.8.8#Proxy'
    - 'tls://8.8.4.4#Proxy'
    rules:
    - GEOSITE,youtube,GlobalTV
    - GEOSITE,github,Proxy

    这里的 nameserver ,nameserver-policy 的优先级与下面的规则的优先级,那个更高?比如在这个规则下,我访问 YouTube ,clash mete 是首先比对- GEOSITE,youtube,GlobalTV 这个,使用远程解析,还是首先 nameserver-policy 判断,走 - 'tls://8.8.8.8#Proxy'?
    我这里设置不成功的原因是什么?按照道理,在 nameserver-policy 的规则下,ipleak.net 是非中国域名,应该走 tls://8.8.8.8#Proxy ,是不是兜底的那条规则- MATCH,DIRECT 优先级在前?
    xpn282
        51
    xpn282  
       166 天前
    @yggjklkaytui
    tls://8.8.8.8#Proxy
    可能是策略组的原因,你有“proxy”这个策略组吗,既然 dns 指向 proxy ,那策略组要有个叫“proxy”的策略组。
    super131
        52
    super131  
       166 天前 via Android
    @yggjklkaytui ipleak.net 不在规则列表内,所以走了 nameserver 的 dns 。
    yggjklkaytui
        53
    yggjklkaytui  
       166 天前
    @super131 geolocation-!cn 非中国域名就是包括了吧? nameserver-policy 的优先级更高,sing-box 这样设置都可以,反复看了 clash meta wiki ,用 nameserver-policy 走 geosite:cn,private,apple ,win10 会出现电脑休眠后,网络不可用
    wcnmm
        54
    wcnmm  
       86 天前
    @yggjklkaytui 我觉得还是把 nameserver 写国外 dns 合适一点,大概率是从上至下先查 nameserver 再看 policy 。这么做导致网页访问会慢,但是无泄漏。你这样就是先查一遍国内 dns 再去判断 geosite ,速度优先但是会泄露(看你个人对泄露的态度)个人还是用的 fallback ,也不想折腾那么多,上游套了 mosdns 防泄露蛮好用的
    wcnmm
        55
    wcnmm  
       84 天前
    @Jirajine 官方文档有写“Clash 是一个跨平台的基于规则的代理工具”,维基百科对代理的功能表述有“突破网络审查,访问被过滤网站”这一条。所以 DNS 查询应该是代理软件该做好的事,从 redir-host 到 fake-ip 的转变也说明作者意识到了。原版支持“nameserver-policy”分流,但是好的应用应该是傻瓜式的,上手就能用(大多数人对 clash 的评价如此,我也因此使用)而不是进阶用户自定义文件保护隐私。只是觉得默认配置帮助分流会做的更好,没有贬低的意思
    dycwuxing
        56
    dycwuxing  
       50 天前 via iPhone
    想请教下关于这段的解析流程
    2.1 使用 nameserver 解析 google.com ,拿到一个错误(被污染)的境外 IP

    如果污染后返回的是境内 IP ,再走匹配流程是否就会导致最终无法访问成功?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1001 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:55 · PVG 02:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.