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.37k stars 1.07k forks source link

过期缓存功能开启后,同域名第2次查询时dns响应时间超过100ms #586

Closed yyysuo closed 4 years ago

yyysuo commented 4 years ago

已查明原因。 1.pdnsd本身有缓存,大部分dns请求在pdnsd层面就拦截了,所以smartdns本身接到的dns请求非常少。 2.开启了IPV6,但是SS服务器本身不支持IPV6,在查询internal.akadns.net这种网址时,返回AAAA记录是NXDOMAIN,响应时间为本机到SS服务器时间,约100MS。因为没有返回结果,所以下次还会再次请求,积累了大量响应时间为100MS的dns请求,抬高了平均处理时间。 3.类似抬高dns响应时间的请求还有PTR请求。

在smartdns层面用force-AAAA-SOA yes禁用IPV6结果返回后,问题解决

主路由:10.10.10.1 开启了koolss及dns劫持。 smartdns所在主机:10.10.10.100,通过koolss强制国外dns 853 443端口都通过koolss走代理。 国外网址DNS查询路径:koolss劫持53端口->Adguard Home->smartdns->1.1.1.1:853 smartdns版本:release 31/32 RC1/32 RC2 硬件:i 7100u软路由 软件:ESXI+Koolshare LEDE 2.36 内核 5.4.52(10.10.10.1/100系统相同)

现象:在Adguard Home中可以查看dns响应时间,开启过期缓存功能后,绝大部分访问过的国外域名dns响应时间超过100ms,而国内的dns响应时间绝大部分在1ms以下。

配置: server-name mydns bind [::]:6053 bind-tcp [::]:6053 serve-expired yes cache-size 102400 rr-ttl 600 rr-ttl-min 600 rr-ttl-max 600 log-size 64K log-num 1 log-level error server-tls 8.8.8.8:853
server-tls 1.1.1.1:853
server-https https://dns.google/dns-query
server-https https://1.1.1.1/dns-query
conf-file /etc/smartdns/address.conf conf-file /etc/smartdns/blacklist-ip.conf conf-file /etc/smartdns/custom.conf speed-check-mode tcp:443,tcp:80 此选项是否启用不影响结果

yyysuo commented 4 years ago

另外32 RC1的平均响应时间在100ms左右,RC2的平均响应时间在200ms左右,这是否说明RC1更好呢?

anafkk commented 4 years ago

@yyysuo 31的平均响应时间是多少?

pymumu commented 4 years ago

确认国外是否走了smartdns,正常情况下,访问过的域名是即时响应的。 测速模式不会影响缓存功能。

yyysuo commented 4 years ago

确认国外是否走了smartdns,正常情况下,访问过的域名是即时响应的。 测速模式不会影响缓存功能。

国外网址DNS查询路径:koolss劫持53端口,用PDNSD通过TCP 1053端口发送到Adguard Home 10.10.10.100:1053->Adguard Home上游只配smartdns 172.17.0.1:6053(Adguard Home运行在docker中)->smartdns->1.1.1.1:853->通过koolss代理通道获取结果

我打开了smartdns的debug模式,从日志来看,确实是收到了dns请求的,但是我从局域网内笔记本上nslookup www.google.com 10.10.10.100:6053或者 slookup www.google.com 10.10.10.100:1053,都是提示无法找到服务器地址。ssh登陆到10.10.10.100运行相同的操作,提示如下: root@Openwrt:~# nslookup www.google.com 10.10.10.100:6053 Server: 10.10.10.100 Address 1: 10.10.10.100

Name: www.google.com Address 1: 2404:6800:4003:c01::68 sb-in-x68.1e100.net Address 2: 172.217.24.4 tsa01s07-in-f4.1e100.net

附上debug日志 smartdns.log

pymumu commented 4 years ago

nslookup不支持指定端口号,要用dig命令,直接用dig命令查询smartdns的端口号,确认是否正常。再看是否其他服务导致了问题。

yyysuo commented 4 years ago

@yyysuo 31的平均响应时间是多少?

31的跟rc2差不多,200ms,rc1感觉快点,100ms,不过我不觉得200ms和100ms有多大的差别,虽然是同一代理节点,但是毕竟网络环境有波动的,和内网不一样。

想了一下,100ms和200ms都是同一节点几天下来几千次dns查询的平均结果,还是有一定意义的。只是奇怪过期缓存为什么不行。

pymumu commented 4 years ago

检查请求走向或配置,过期缓存服务是不区分国内外的。除配置-no-cache外。

可以检查是否配置了-no-cache,另外,就是看分流是否正确。

yyysuo commented 4 years ago

新发现一个现象, 1:如果请求是来自于主路由10.10.10.1,由koolss劫持发送到10.10.10.100的Adguard Home中,则响应时间是100ms左右,Adguard Home中客户端显示是主路由10.10.10.1 2:如果是ssh登陆到10.10.10.100,用nslookup www.google.com,响应时间是100ms,Adguard Home中客户端显示是主路由10.10.10.1 3:如果是ssh登陆到10.10.10.100,直接用dig命令,指定Adguard Home,则反应时间是1ms以下。Adguard Home中客户端显示是10.10.10.100

看来是我网络结构的问题,与smartdns无关,请大神指点一下,可能是哪个方向有问题。

yyysuo commented 4 years ago

进一步总结一下,局域网内包括主路由通过dig命令,无论是指定10.10.10.100上的Adguard Home还是smartdns,响应时间全是1ms以下,直接dig不指定dns服务器,通过koolss劫持转发dns请求,响应时间全是100ms。这2种方式最后全是从Adguard Home转发到smartdns,没什么区别。

yyysuo commented 4 years ago

已查明原因。 1.pdnsd本身有缓存,大部分dns请求在pdnsd层面就拦截了,所以smartdns本身接到的dns请求非常少。 2.开启了IPV6,但是SS服务器本身不支持IPV6,在查询internal.akadns.net这种网址时,返回AAAA记录是NXDOMAIN,响应时间为本机到SS服务器时间,约100MS。因为没有返回结果,所以下次还会再次请求,积累了大量响应时间为100MS的dns请求,抬高了平均处理时间。 3.类似抬高dns响应时间的请求还有PTR请求。

在smartdns层面用force-AAAA-SOA yes禁用IPV6结果返回后,问题解决。