以 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 缓存,我理解的流程是
如果没有基于 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 友们不吝赐教。
非常感谢大家用心的回答,在这里做个总结,也给未来看到这篇帖子的人一个参考
#13 @NoOneNoBody 解答了我的疑问,由于部分地区无法直连境外的DNS,所以要通过代理访问,获取正确IP。
至于部分V友提到的通过代理请求DNS可以获取离代理服务器最近的IP,这一点是无意义的(至少对于Clash是这样),因为在分流过程中,即使获取了正确IP,大部分代理软件还是会将域名(而不是分流过程中获取到的正确IP)发送到代理服务器,由代理服务器重新进行域名解析。
对于Clash,在分流规则配置完善的前提下,DNS污染不会影响它的工作,参考文章《DNS污染对Clash(for Windows)的影响》。
还有很多V友担心的DNS泄露问题,对于Clash也可以通过配置分流规则解决,具体可以观看Youtube博主 不良林 的相关视频。
再次感谢大家的回答!
1
xiwh 2023-07-17 12:30:21 +08:00 4
因为在国内,不能保证你访问的是真正要访问 DNS 服务器,比如说你把你的 DNS 地址设置 8.8.8.8 就是访问的谷歌 DNS 服务器了吗?因为历史原因 DNS 是纯明文的,数据中抓过程中每一层都可以轻易的篡改 DNS 请求内容,很多时候运营商会劫持掉一些不和谐和请求,返回无效的 ip 地址,这样也就产生了 DNS 污染,所以说 Clash 等一众软件会让 DNS 请求也走代理,防止 DNS 污染
|
2
gyang1111 2023-07-17 12:33:18 +08:00
提一点,第一个 ip 分流的方案不只是考虑到 dns 污染,还存在 dns 泄漏的问题
|
3
gyang1111 2023-07-17 12:36:09 +08:00
@gyang1111 第二个方案还有个好处 根本不需要填 fallback 的地址 只配一个运营商 dns 就够了 只要有正确的域名分流规则,参考油管不良林关于 dns 泄漏的一个视频
|
4
0o0O0o0O0o 2023-07-17 12:47:24 +08:00 via iPhone
没用过 clash ,我就是代理请求国外 dns 的那类人,或者直连国外的 DoT 、DoH ,对我来说最重要的意义就是防止对国内运营商/国内 DNS 服务器泄露隐私。
分流是额外的事情,我是白名单直连模式,国外走 vps 落地,未知走 warp 落地,不让 GFW 拿到我的一针一线。 |
5
zbatman OP @xiwh 代理的 dns 一般会配置 DoT 或 DoH ,而且默认设置下 clash 是不会通过代理请求 dns 的
|
6
tool2d 2023-07-17 13:28:15 +08:00
"通过代理请求域名服务器(比如通过代理请求 8.8.4.4)"
其实就是 DNS 污染解决了,大部分情况就可以不需要走代理服务了。 墙封死 IP 地址的情况越来越少了,一般都暴力 DNS 污染。 |
7
docx 2023-07-17 13:31:07 +08:00 via Android
不知道 Clash 是不是一样。有些代理工具内填的 nameserver 只是用来解析 DIRECT (也包括远程节点本身)的域名,其余都通过远程节点去解析
|
8
zbatman OP @gyang1111 这个明白,写的配置只是为了辅助说明“即使获得了正确 ip ,最终代理服务器还是会重新解析一次”这一点
|
9
zbatman OP @tool2d 这种情况大部分会出现在一些小众域名吧,只被 DNS 污染,没封 IP 。但是像这种的可以通过可直连的境外 DoT 、DoH 解决,也没必要去走代理请求 dns
|
10
TESTFLIGHT2021 2023-07-17 13:45:11 +08:00
不会被污染
|
11
tool2d 2023-07-17 13:49:49 +08:00
"但是像这种的可以通过可直连的境外 DoT 、DoH 解决"
国内裸连挺难的,会出现各种未知问题。一个是 853 端口,另一个需要 https 标准签名握手,很容易被针对。 还有看客户端具体怎么写的,你如果是浏览器,那么会把域名发给代理服务器,做二次 DNS 解析。但是如果你是 TCP 代理网游客户端,那么有可能代理服务器收到的就是一个纯 IP ,而不是域名。 |
12
baobao1270 2023-07-17 13:51:12 +08:00
1. 防止 DNS 泄露
2. 基于域名的分流总是不完善的,需要基于 GeoIP 的规则来补漏 |
13
NoOneNoBody 2023-07-17 13:55:37 +08:00 1
没用过早年梯子的人有这疑问很正常
早年梯子是 http(s),不具备 dns 功能,随着 dns 污染越来越频繁,才逐步转向 socks4a/socks5 现在的梯子基本都 socks5 起步,dns+数据 这样可知,dns 和数据是两件事,各自都可以使用代理,只不过现在的梯子一起做了 但这不能说两者分开没有意义,有部份访问,只是 dns 污染了,纯 ip 仍能直接访问,尤其 ipv6 ,只要解决 dns 问题,后面可以直连,至少有“省流”作用,对绕道的服务器来说,是减轻负担,对末端用户来说,是省点流量费,也可能省时间(指直连更快的情况) |
14
zbatman OP @NoOneNoBody
@tool2d 那其实归根结底还是解决“DNS 污染”的问题,为了获取正确的 IP ,就得走境外的 DNS 。而大部分境外的 DNS 无法直连,所以通过代理请求,这样理解没问题吧? |
15
tool2d 2023-07-17 14:17:52 +08:00
|
16
cndns 2023-07-17 14:23:35 +08:00
因为明文 UDP 的 dns 已经被劫持污染,DOT 的常规 TCP 853 又被封了,DOH 的呢 SIN 干扰严重
|
17
popzuk 2023-07-17 14:25:01 +08:00
clash 和 surge 是靠 fakeip 解决的,有的人可能不喜欢 fakeip 。
|
18
zthxxx 2023-07-17 14:34:33 +08:00 1
|
19
shyling 2023-07-17 14:35:18 +08:00
doh 这种不是更折腾吗,而且没有 edns , 不见得给你代理请求快的 ip
|
20
NoOneNoBody 2023-07-17 14:46:36 +08:00
|
21
mohumohu 2023-07-17 15:18:27 +08:00
你自己都假设一个前提“如果没有基于 IP 的规则”了,那你又谈“ Issue 区看到“通过代理请求域名服务器(比如通过代理请求 8.8.4.4)”这种需求”不理解有何实际含义,那别人就是有基于 IP 的规则呢?
|
22
jujusama 2023-07-17 15:42:02 +08:00
1. DIRECT 仅会请求本地 dns
2. PROXY 最终会由代理服务器请求 dns 以拿到距离最近的 ip 3. 通常分流规则下,本地 dns 的请求免不了 |
23
zbatman OP @jujusama
'1. DIRECT 仅会请求本地 dns',意思是如果请求 google.com ,正文中的 2.2 步骤是不会走的是吗,2.1 判断为境外 IP 的话,这条规则就跳过了? '3. 通常分流规则下,本地 dns 的请求免不了',这个通常分流规则有具体示例吗? |
24
byteroam 2023-07-17 16:19:44 +08:00
那不就是掩耳盗铃吗,以为别人不知道你访问了啥
|
25
jujusama 2023-07-17 16:32:32 +08:00
@zbatman #23
1. fallback 通常用于非 PROXY 的情况,如某些被污染但没有被阻断的网站 2. 如 nameserver 返回非 cn ip ,那么会取 fallback 的结果去 geoip 匹配,一般来说都会走到 MATCH ,然后提交到代理 3. 任意 ipcidr 的规则都会导致本地 dns 请求,否则如果域名匹配到 PROXY ,会直接发送给远端代理 |
26
jianzhao123 2023-07-17 16:38:52 +08:00
@baobao1270 你好,最近我也在看代理 DNS 泄露的问题,想请教一下基于域名分流确实不完美,但是基于 Geoip 的分流前提是得解析到一个 IP ,那么访问一下机场之类的域名还是要走本地的 DNS 解析,这个情况怎么避免呢?
|
27
mohumohu 2023-07-17 17:10:49 +08:00
@jianzhao123 可以单独跑第三方 DNS 服务来查询,或者在配置的 hosts 选项里面写死域名的解析,机场的域名的 IP 一般不经常变。
|
28
jianzhao123 2023-07-17 17:40:18 +08:00 via iPhone
@mohumohu 好的,感谢🙏
|
29
littlewing 2023-07-17 19:59:08 +08:00
@zbatman 那如果 DoH 或 DoT 被墙呢
|
30
mohumohu 2023-07-17 20:21:02 +08:00
举两个使用 GEOIP 规则用得到的场景:
1 、我要不同 IP 段走不同的节点;比如域名解析结果是 JP 的 IP 只走 JP 节点,其他走 HK ; 2 、回国线路,如果使用本地 IP 解析的是海外地址,使用代理解析符合 CN 的 IP 走代理; |
31
qiany 2023-07-17 20:21:32 +08:00
1.dns 泄露,不在乎隐私可以无视
2.dns 污染. 3.cdn 优化 |
32
ysc3839 2023-07-17 20:59:50 +08:00 via Android 1
@NoOneNoBody http proxy 默认是代理解析域名,即使要自己走代理解析,也可以用 http CONNECT 请求连接 TCP DNS 服务器。
而 SOCKS 就复杂了,如果把 http_proxy 环境变量设置成 socks4 或 socks5 开头,curl 会在本地解析 DNS ,要改成 socks4a 或 socks5h ,改了之后别的程序可能就不认了。 |
34
Lightbright 2023-07-17 21:21:07 +08:00
DNS 泄露问题可以参考这里,说的很详细
|
35
zhishixiang 2023-07-17 21:40:44 +08:00
国内互联网环境还不清楚? dns 又不加密,谁都能抢答,还能通过 dns 监听你正在访问什么网站
|
37
datocp 2023-07-18 00:04:29 +08:00
嘿嘿,想起当年 socks5+支持远程 DNS 查询?这都是多少年前的事情了。不解 2015 年的 1 月 1 日, ss 的 windows 客户端为什么因为一个 DNS 问题而导致无法访问,从那天开始弃用 ss 。内置 dns 软件见多了。记得 360/qq 打架那会儿,原来 QQ 浏览器也内置 DNS 查询。发现那天只好弃用。
|
38
chancat 2023-07-18 05:58:57 +08:00 via Android
fakeip fakedns
|
39
Jirajine 2023-07-18 08:47:41 +08:00 1
因为 clash 是网络加速工具而非审查绕过工具,使用过程中也只是看剧查资料等正常用户的需求,而非任何违反法律的事情,所以“拿到一个被污染的 ip (同时向国家暴露你在尝试访问被污染的域名)”和“将域名转发到代理服务器(让代理服务器知道你在访问的域名)”都是可以接受的,毕竟只要能连上就行,身正不怕影子斜的人不需要向任何人隐藏任何事,所以代理 dns 没有实际意义。
|
40
cheng6563 2023-07-18 09:14:16 +08:00
DNS 污染的域名多了去了,而且是"海关"污染的,用国内的 DoH 照样污染。
|
41
xpn282 2023-07-18 10:19:22 +08:00 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 感觉不出差别。。。 |
42
ProphetN 2023-07-18 11:48:28 +08:00
@dode #33 Firefox 默认的 Socks 代理会本地解析完,交给 clash 。用了 SwitchyOmega 插件走 Socks 代理,就不会本地解析。
|
43
starryloki 2023-07-18 11:49:33 +08:00
不仅有能准确访问 DNS 的原因,用落地 IP 去请求 DNS 能获取就近 CDN ,你也不想落地 US 再绕回来访问 HK 或 JP 的 CDN 吧
|
44
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 查询过慢的缺点 算是一种权衡吧,虽然优点很多,但是缺点也不少,我现在就被它的缺点搞得游戏打不了 |
45
caneman 2023-07-19 18:20:19 +08:00
其实你明白下面这几点,就知道为什么采用劫持的方案了,归根结底是一种妥协,而且没有完美的解决方案。
1. 域名是无限,网站是变化的,完全的基于域名的完美分流是不可能的 2. 基于 IP 的分流,必然存在 DNS 查询过程 3. DNS 查询,快(国内)必然有泄露和污染风险,无风险则必然慢(国外 DNS 服务器) clash 的 dns 劫持,本质上是在为了在 3 中建立一种平衡,尽可能的实现 快&安全,同时还有基于域名分流时的额外好处。(要实现 fake-ip 必须 DNS 劫持) |
46
slack 2023-07-25 23:06:41 +08:00
因为国内的运营商很可能对 53 端口进行挟持,即使使用 DoH\DoT 仍然可能会被 SNI 阻断,这是就必须代理 DNS 了。
|
48
jesky 2023-10-11 12:00:06 +08:00
|
49
zbatman OP @jesky
第一个我用过一段时间,感受就是不太稳定,有时会断,偶尔会换 IP ,不像 iij 那样固定是两个 IP 第二个没用过 实际上无污染的 DNS 感觉没啥必要了,国内的域名走运营商或大厂的 DNS ,国外的本地不解析,让远程节点解析就可以了 |
50
yggjklkaytui 362 天前
@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 优先级在前? |
51
xpn282 361 天前
|
52
super131 361 天前 via Android
@yggjklkaytui ipleak.net 不在规则列表内,所以走了 nameserver 的 dns 。
|
53
yggjklkaytui 361 天前
@super131 geolocation-!cn 非中国域名就是包括了吧? nameserver-policy 的优先级更高,sing-box 这样设置都可以,反复看了 clash meta wiki ,用 nameserver-policy 走 geosite:cn,private,apple ,win10 会出现电脑休眠后,网络不可用
|
54
wcnmm 281 天前
@yggjklkaytui 我觉得还是把 nameserver 写国外 dns 合适一点,大概率是从上至下先查 nameserver 再看 policy 。这么做导致网页访问会慢,但是无泄漏。你这样就是先查一遍国内 dns 再去判断 geosite ,速度优先但是会泄露(看你个人对泄露的态度)个人还是用的 fallback ,也不想折腾那么多,上游套了 mosdns 防泄露蛮好用的
|
55
wcnmm 279 天前
@Jirajine 官方文档有写“Clash 是一个跨平台的基于规则的代理工具”,维基百科对代理的功能表述有“突破网络审查,访问被过滤网站”这一条。所以 DNS 查询应该是代理软件该做好的事,从 redir-host 到 fake-ip 的转变也说明作者意识到了。原版支持“nameserver-policy”分流,但是好的应用应该是傻瓜式的,上手就能用(大多数人对 clash 的评价如此,我也因此使用)而不是进阶用户自定义文件保护隐私。只是觉得默认配置帮助分流会做的更好,没有贬低的意思
|
56
dycwuxing 245 天前 via iPhone
想请教下关于这段的解析流程
2.1 使用 nameserver 解析 google.com ,拿到一个错误(被污染)的境外 IP 如果污染后返回的是境内 IP ,再走匹配流程是否就会导致最终无法访问成功? |