一直没想明白,通过代理请求 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 友们不吝赐教。

13312 次点击
所在节点    DNS
56 条回复
xpn282
2023-07-18 10:19:22 +08:00
不需要搞 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
2023-07-18 11:48:28 +08:00
@dode #33 Firefox 默认的 Socks 代理会本地解析完,交给 clash 。用了 SwitchyOmega 插件走 Socks 代理,就不会本地解析。
starryloki
2023-07-18 11:49:33 +08:00
不仅有能准确访问 DNS 的原因,用落地 IP 去请求 DNS 能获取就近 CDN ,你也不想落地 US 再绕回来访问 HK 或 JP 的 CDN 吧
caneman
2023-07-19 18:14:23 +08:00
假设 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
2023-07-19 18:20:19 +08:00
其实你明白下面这几点,就知道为什么采用劫持的方案了,归根结底是一种妥协,而且没有完美的解决方案。
1. 域名是无限,网站是变化的,完全的基于域名的完美分流是不可能的
2. 基于 IP 的分流,必然存在 DNS 查询过程
3. DNS 查询,快(国内)必然有泄露和污染风险,无风险则必然慢(国外 DNS 服务器)

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

实际上无污染的 DNS 感觉没啥必要了,国内的域名走运营商或大厂的 DNS ,国外的本地不解析,让远程节点解析就可以了
yggjklkaytui
2023-11-12 11:44:31 +08:00
@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
2023-11-13 08:36:03 +08:00
@yggjklkaytui
tls://8.8.8.8#Proxy
可能是策略组的原因,你有“proxy”这个策略组吗,既然 dns 指向 proxy ,那策略组要有个叫“proxy”的策略组。
super131
2023-11-13 13:11:48 +08:00
@yggjklkaytui ipleak.net 不在规则列表内,所以走了 nameserver 的 dns 。
yggjklkaytui
2023-11-13 14:52:05 +08:00
@super131 geolocation-!cn 非中国域名就是包括了吧? nameserver-policy 的优先级更高,sing-box 这样设置都可以,反复看了 clash meta wiki ,用 nameserver-policy 走 geosite:cn,private,apple ,win10 会出现电脑休眠后,网络不可用
wcnmm
297 天前
@yggjklkaytui 我觉得还是把 nameserver 写国外 dns 合适一点,大概率是从上至下先查 nameserver 再看 policy 。这么做导致网页访问会慢,但是无泄漏。你这样就是先查一遍国内 dns 再去判断 geosite ,速度优先但是会泄露(看你个人对泄露的态度)个人还是用的 fallback ,也不想折腾那么多,上游套了 mosdns 防泄露蛮好用的
wcnmm
295 天前
@Jirajine 官方文档有写“Clash 是一个跨平台的基于规则的代理工具”,维基百科对代理的功能表述有“突破网络审查,访问被过滤网站”这一条。所以 DNS 查询应该是代理软件该做好的事,从 redir-host 到 fake-ip 的转变也说明作者意识到了。原版支持“nameserver-policy”分流,但是好的应用应该是傻瓜式的,上手就能用(大多数人对 clash 的评价如此,我也因此使用)而不是进阶用户自定义文件保护隐私。只是觉得默认配置帮助分流会做的更好,没有贬低的意思
dycwuxing
261 天前
想请教下关于这段的解析流程
2.1 使用 nameserver 解析 google.com ,拿到一个错误(被污染)的境外 IP

如果污染后返回的是境内 IP ,再走匹配流程是否就会导致最终无法访问成功?

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

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

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

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

© 2021 V2EX