pymumu / smartdns

A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT。
https://pymumu.github.io/smartdns/
GNU General Public License v3.0
8.49k stars 1.09k forks source link

基于DNS查询类型的EDNS分流,解决多运营商双栈网络环境中的准确性问题 #1860

Open lonecale opened 1 day ago

lonecale commented 1 day ago

需求应用场景 当前网络环境涉及两个不同的运营商,分别单独管理IPv4和IPv6连接(IPv4由一个运营商负责,IPv6由另一个运营商负责),在使用公共DNS服务(如阿里DNS)时,IPv6请求因运营商问题可能因识别不准确而导致不必要的路由绕行。为解决这一问题,我只能通过EDNS客户子网选项来手动指定不同的出口。

建议的方案 目前,我已使用mosdns按DNS查询类型(QTYPE)配置对应的EDNS

对于smartdns 暂时没发现可以根据QTYPE分流的办法,变相的想法是: IPv4地址(A记录,QTYPE=1):通过smartdns配置一个端口,指定IPv4的EDNS客户子网。 IPv6地址(AAAA记录,QTYPE=28):通过smartdns配置另一个端口,指定IPv6的EDNS客户子网。 使用支持QTYPE分流请求的DNS工具,将不同类型的请求分发到相应端口。这样可以选择合适的出口运营商,从而避免请求的不必要绕路。

请问: 1.如果单独使用smartdns是否有更优的实现方式?并且可以保留双栈优选? 2.smartdns是否支持接收其他DNS传递的EDNS信息,并将其用于后续查询?

PikuZheng commented 1 day ago

设blacklist为0.0.0.0/0,whitelist为::0/0 server ipv4上游 -whitelist -edns… server ipv6上游 -blacklist -edns…

未测试,理论上应该是成立的

lonecale commented 17 hours ago

设blacklist为0.0.0.0/0,whitelist为::0/0 server ipv4上游 -whitelist -edns… server ipv6上游 -blacklist -edns…

未测试,理论上应该是成立的

感谢您提供的方案。我仔细考虑了一下,发现可能有一些问题。 按照提议,IPv4配置设置了白名单为 ::0/0,根据文档,这会使我们只接受IPv6地址,,而不是期望的IPv4地址。 对于IPv6的配置,使用了黑名单 0.0.0.0/0,根据文档,这样的设置确实会阻止IPv4地址的返回,这部分是正确的。 但这也意味着IPv4配置不会正确返回IPv4地址,而只会返回IPv6地址。

是否支持 黑白名单 名单都设置相同的ip地址? 例如下面这样 server ipv4上游 -whitelist -edns… server ipv6上游 -blacklist -edns… whitelist-ip 0.0.0.0/0 blacklist-ip 0.0.0.0/0

假设这样成立的话,这种设置可能导致DNS请求次数加倍。特别是在双栈环境中,一个域名至少需要进行两次DNS查询(一次为A记录,一次为AAAA记录)。通过这样的配置,每种查询都可能再次触发额外的DNS请求,从而导致至少四次查询。在实际应用中,这很容易触及上游服务的请求限制,例如阿里DNS。

PikuZheng commented 17 hours ago

smartdns本来就是向所有上游同时发起请求的,额外设置不会导致流量加倍