Clash: [疑问]dns中fallback的作用

创建于 2020-04-17  ·  6评论  ·  资料来源: Dreamacro/clash

比如配置中这样配置

dns:
  enable: true
  listen: :53
  enhanced-mode: redir-host
  nameserver:
    - 223.5.5.5
  fallback:
    - 8.8.8.8

我的问题是fallback的作用是?

我看了这篇文章:DNS污染对Clash(for Windows)的影响

文章里说
从nameserver和fallback里的DNS进行并发请求,并且选取nameserver中最先响应的结果作为基准
使用GEOIP判断此IP的所属区域,如果属于国内(CN)或保留地址则直接响应给客户端
其他情况则把fallback中的结果响应给客户端

但是文章里又说
当污染IP被判定为需要代理时,此时Clash依然能正常工作,这是因为Clash实际上并不会向代理服务器发送这个IP地址,而是直接将host发送给代理服务器,在代理服务器中进行DNS解析,这样可以让请求获取到更合适的IP地址,更好的利用CDN资源。

我很疑惑 既然nameserver里能直接判断出污染IP 污染IP就直接将host发送给代理服务器 由代理服务器解析出正确且对CDN友好的IP 那不是就不需要fallback这一项吗?

我知道我肯定哪里想错了,特来求教,大佬别笑话我...

question

最有用的评论

判断不出污染IP,只是当第一个DNS返回的GeoIP不是CN的时候就会取fallback DNS的值,因为污染的GeoIP都是境外,所以从这个层面来说clash可以防污染,当然前提是要设置好fallback组的DNS上游才行(比如无污染DNS[墙内公开的基本绝迹]、通过非标准端口、DNS over TLS/HTTPS)。
可以参考:https://github.com/Dreamacro/clash/issues/621#issuecomment-614702773

至于cfw wiki里说的即使被污染不受影响是指,如果当前连接匹配规则结果是走代理,clash会把对IP发起的连接重新改为其原本的hostname发往远端节点,所以即使客户端/浏览器拿到的是被污染后的IP也不会影响最终连接,因为这个污染的IP经过clash发往远端代理的时候就已经被丢弃且重新套上原本的hostname,这也就是redir-host模式的名字的由来。
另外参考:浅谈在代理环境中的 DNS 解析行为 | Sukka's Blog

所有6条评论

内置dns是为了解决透明代理时的dns解析问题的,正常使用没必要开启

判断不出污染IP,只是当第一个DNS返回的GeoIP不是CN的时候就会取fallback DNS的值,因为污染的GeoIP都是境外,所以从这个层面来说clash可以防污染,当然前提是要设置好fallback组的DNS上游才行(比如无污染DNS[墙内公开的基本绝迹]、通过非标准端口、DNS over TLS/HTTPS)。
可以参考:https://github.com/Dreamacro/clash/issues/621#issuecomment-614702773

至于cfw wiki里说的即使被污染不受影响是指,如果当前连接匹配规则结果是走代理,clash会把对IP发起的连接重新改为其原本的hostname发往远端节点,所以即使客户端/浏览器拿到的是被污染后的IP也不会影响最终连接,因为这个污染的IP经过clash发往远端代理的时候就已经被丢弃且重新套上原本的hostname,这也就是redir-host模式的名字的由来。
另外参考:浅谈在代理环境中的 DNS 解析行为 | Sukka's Blog

  • nameserver 中的服务器不受污染的情况下(比如本地搭建的无污染 DNS 服务器) fallback 就没有必要设置
  • 规则里匹配到需要走 Proxy 的, 干脆就不使用解析到的 IP, 会直接向代理服务器发送域名, 这样也就解决了 CDN 的问题
  • 而规则里匹配 DIRECT 的, 则向解析到的 IP 直接发起连接

.

  • 使用 Socks5/Http(s) 代理时, 系统无需知道目标 IP 地址进行连接, 只需要将简单得将域名请求丢给代理服务器即可
  • 而使用透明代理时, 由于是标准 TCP/IP 实现, Clash拿到的包是不包含域名信息的, 所以Clash必须使用内置的 DNS 功能进行一次 IP <-> 域名 映射, 这样Clash才能把系统发送的 TCP/UDP 包中的 DST-IP 还原为域名并进行规则匹配

.
我这样的理解应该没错吧? @Dreamacro
ps: Clash的文档真的不是很详细, 到处查资料......

  • nameserver 中的服务器不受污染的情况下(比如本地搭建的无污染 DNS 服务器) fallback 就没有必要设置
  • 规则里匹配到需要走 Proxy 的, 干脆就不使用解析到的 IP, 会直接向代理服务器发送域名, 这样也就解决了 CDN 的问题
  • 而规则里匹配 DIRECT 的, 则向解析到的 IP 直接发起连接

.

  • 使用 Socks5/Http(s) 代理时, 系统无需知道目标 IP 地址进行连接, 只需要将简单得将域名请求丢给代理服务器即可
  • 而使用透明代理时, 由于是标准 TCP/IP 实现, Clash拿到的包是不包含域名信息的, 所以Clash必须使用内置的 DNS 功能进行一次 IP <-> 域名 映射, 这样Clash才能把系统发送的 TCP/UDP 包中的 DST-IP 还原为域名并进行规则匹配

.
我这样的理解应该没错吧? @Dreamacro
ps: Clash的文档真的不是很详细, 到处查资料......

请问下,如果不是用作透明代理,只是客户端的话,那么使用redir-host会比fake ip模式多一次解析吗(假设连一个走代理的域名),还是说大家都一样了呢?

@akw5454521
fake-ip 模式实际上不涉及dns解析, clash拿到dns请求后直接把保留ip发给用户, 并通过dns请求中的域名通过socks5直接在远端服务器建立连接, 再回头通过刚才的保留ip与用户建立实际连接
redir-host 模式需要解析, 解析结果只有在匹配直连规则情况下才有意义(直接建立连接). 而需要走代理的域名的解析结果即便是假的也没关系, 因为这个步骤和上面fake-ip要达到的目的是一样的, 仅仅是为了让用户和clash双方建立域名和ip之间的对应关系, 到达远端服务器的请求是域名而不是解析得到的ip

至于速度问题, fake-ip只要可能1

我想问一下,如果在redir-host模式下,被GeoIP判定不为CN时走fallback,如果同时又符合代理条件,那么直接将host发送到远端解析,也就是说客户端拿到的ip是否是真的都没关系了(因为如果判定为代理还要从远端解析),那么,我想问下fallback组的意义何在,不如直接用nameserver中的污染的,反正也要从远端解析。
(ps: 我个人认为,只有当一个域名的被污染了且判定不是走代理的时候,fallback才真正起效)

另外,请求fallback中的dns(如tls://dns.google等)时可能会有非常高的延迟,这样的话客户端等待的时间太长了吧

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

lichen0501 picture lichen0501  ·  3评论

HuLian21 picture HuLian21  ·  7评论

dazirangege picture dazirangege  ·  3评论

h0cheung picture h0cheung  ·  6评论

Tsahao picture Tsahao  ·  4评论