mosdns icon indicating copy to clipboard operation
mosdns copied to clipboard

[Feature request] 希望 fast_forward 也支持 bootstrap dns,否则可能导致循环解析

Open ihipop opened this issue 2 years ago • 9 comments

希望 fast_forward 也支持 bootstrap dns 否则可能导致循环解析

网关透明代理,网关本身也要使用mosdns解析,但是mosdns的 fast_forward 文档未见到 有支持 bootstrap 的配置,导致网关的dns请求触发mosdns的请求,但上级是doh等,需要解析域名,mosdns又去解析这个域名,这个请求又进入mosdns

  1. forward 虽然支持 bootstrap dns 但是已经不维护了
  2. AdGuardHome 本身也有bootstrap的DNS,防止出现这种情况。
  3. dial_addr 可临时解决这个问题但是不能解决IP变动问题

ihipop avatar Sep 16 '22 17:09 ihipop

fast_forward 本意就是不用bootstrap,让用户手动指定 dial_addr IP。按作者的意思是如果一个DNS服务器IP会变则它不适合作为DNS服务器。

DNS服务器的IP不应该随意变。所以大的DNS服务商自服务正式上线起,没有谁的IP变过。所以不停解析一个不变的域名没意义。

dial_addr 可临时解决这个问题但是不能解决IP变动问题

即使服务器自身的IP变了,AdGuardHome 本身bootstrap也没有自动更新的能力,会直接不可用,除非手动重启。boot strap,只管 boot,不管更新。

urlesistiana avatar Sep 17 '22 00:09 urlesistiana

DNS服务器的IP不应该随意变。所以大的DNS服务商自服务正式上线起,没有谁的IP变过。所以不停解析一个不变的域名没意义。

DNS.SB 就变过 虽然承诺平滑下线,但是其实如果不盯着看不会注意

DNS.PUB 也变过, 1.12.12.12 / 120.53.53.53 都是后来引入的 IP

即使服务器自身的IP变了,AdGuardHome 本身bootstrap也没有自动更新的能力,会直接不可用,除非手动重启。boot strap,只管 boot,不管更新。

那么其实我的想法就是有些偏差,bootstrap 应该改成 resolver 也就是为这些 doh/dot 的域名指定resolver 原因是 这个resolver是可以在国内的。他不为用户端的DNS解析负责 ,还可以很显式的避免循环解析

还有一个重要的原因是,目前 dial_addr 也不支持指定多个 IP地址,但是这些 doh/dot 的域名 可能是双栈解析或者多IP解析的。

ihipop avatar Sep 17 '22 02:09 ihipop

DNS.PUB 确实变过 IP,应该是内测的时候。现在 1.12.12.12 / 120.53.53.53 IP 应该已经定死了。

循环解析,resolver 还有双栈多 IP 问题。

以前和作者讨论过。

  1. 如果让系统取解析域名,系统自身就带有很完善的resolver 。双栈自带选择,多 IP,实时更新,这些问题都能帮你处理,如果让 mosdns 去实现这些功能,很麻烦,是造轮子,而且最后肯定没系统自带的好。比如 AdGuardHome 虽然看起来支持多 IP,给人一种会自动选择最优 ip的感觉。但其实就是简单的一个IP连不上后继续试下一个IP。如果第一个IP永远也连不上,比如失效了,则接下来每次连接都要hang一段时间。所以 fast_forward 选择用系统去解析。
  2. 即使网关本身也要使用mosdns解析,避免循环解析也不难。可以用 docker,给容器指定一个 dns 服务器。
  3. dial_addr 设 IP地址主要是为了加速,因为可以跳过解析服务器域名这一步(如果系统有缓存,不耗时,但也有可能会进行一次的dns查询),直接建立连接。

urlesistiana avatar Sep 17 '22 02:09 urlesistiana

  1. 即使网关本身也要使用mosdns解析,避免循环解析也不难。可以用 docker,给容器指定一个 dns 服务器。

这个有点重 我暂时想到的办法是用bubblewrap来进行文件系统劫持 bwrap --dev-bind / / --bind /tmp/resolv.conf /etc/resolv.conf mosdns 这样mosdns能读取到的/etc/resolv.conf 就变成了实际磁盘上的 /tmp/resolv.conf

如果程序能支持指定resolver.conf的文件路径就最好了,这样不影响其他程序

ihipop avatar Sep 17 '22 08:09 ihipop

如果程序能支持指定resolver.conf的文件路径就最好了,这样不影响其他程序

调研了一下,golang设计导致想要每个客户端custom一个dnsresolver还是很麻烦的,后续都得维护,估计作者也不会接受这样的PR, 目前看 bwrap 还是最经济的方案,但是需要主机支持fs namespace

ihipop avatar Sep 17 '22 09:09 ihipop

调研了一下,golang设计导致想要每个客户端custom一个dnsresolver还是很麻烦的,后续都得维护,估计作者也不会接受这样的PR, 目前看 bwrap 还是最经济的方案,但是需要主机支持fs namespace

是,golang runtime 这部分很抽象不好自定义。linux 好处理,win跟mac不容易。作者之前似乎动过手,有代码但还没完成...

他最近很忙....

https://github.com/IrineSistiana/mosdns/blob/main/pkg/upstream/bootstrap/bootstrap.go

我觉得可以先实现 linux 上的 bootstrap,因为是用的go runtime,实现很容易,而且网关基本上都是 linux,有刚需。其他平台可以以后再说。

urlesistiana avatar Sep 17 '22 09:09 urlesistiana

我有空开个 PR。

urlesistiana avatar Sep 17 '22 10:09 urlesistiana

我有空开个 PR。

你们两个的名字很像,你们是在 Sistiana 认识的么?

ihipop avatar Sep 17 '22 12:09 ihipop

PR, 目前看 bwrap 还是最经济的方案,但是需要主机支持fs names

调研了一下,golang设计导致想要每个客户端custom一个dnsresolver还是很麻烦的,后续都得维护,估计作者也不会接受这样的PR, 目前看 bwrap 还是最经济的方案,但是需要主机支持fs namespace

是,golang runtime 这部分很抽象不好自定义。linux 好处理,win跟mac不容易。作者之前似乎动过手,有代码但还没完成...

他最近很忙....

https://github.com/IrineSistiana/mosdns/blob/main/pkg/upstream/bootstrap/bootstrap.go

我觉得可以先实现 linux 上的 bootstrap,因为是用的go runtime,实现很容易,而且网关基本上都是 linux,有刚需。其他平台可以以后再说。

他这个的实现还是用的bootstrap,但是在我们之前的的讨论中,结论应该是给mosdns一个单独的和其他程序不同的 resolve.conf 或者指定个单独的DNS,就像K8S做的那样。

ihipop avatar Sep 17 '22 12:09 ihipop