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

2023-07-17 11:30:18 +08:00
 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 友们不吝赐教。

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

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

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

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

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

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

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

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

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

结帖。
shyling
2023-07-17 14:35:18 +08:00
doh 这种不是更折腾吗,而且没有 edns , 不见得给你代理请求快的 ip
NoOneNoBody
2023-07-17 14:46:36 +08:00
@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