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

297 天前
 zbatman

以 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 友们不吝赐教。

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

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

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

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

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

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

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

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

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

结帖。
shyling
297 天前
doh 这种不是更折腾吗,而且没有 edns , 不见得给你代理请求快的 ip
NoOneNoBody
297 天前
@zbatman #14
Y
参看 #15 ,不敷述了

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

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

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

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

© 2021 V2EX