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.25k stars 1.06k forks source link

关于DNS缓存的一些问题 #1774

Open maojianyou opened 1 month ago

maojianyou commented 1 month ago

问题现象
简要描述问题出现的现象 关于DNS缓存的一些问题

具体配置

开启缓存功能

cache-size 32768 根据内存自动设置,无需设置

cache-persist yes 开启缓存后,cache-file可以报存下来 cache-file /etc/smartdns/cache 保存路径

设置cache定时保存,避免cache因为系统或进程复位丢失

cache-checkpoint-time 86400

过期缓存开关

serve-expired yes

此时间表示过期缓存多长时间未访问,则从缓存中释放

serve-expired-ttl 259200

此时间表示当缓存中域名TTL超时时,返回给客户端的TTL时间,让客户端在下列TTL时间后再次查询

serve-expired-reply-ttl 3

过期缓存在多长时间未访问,主动进行预先获取,以避免IP无效

prefetch-domain yes serve-expired-prefetch-time 21600

问题1、/etc/smartdns/cache 是保存的缓存文件,但内容无法查看,能否支持查看,主要目的是看保存的请求域名跟解析结果是否存在错误,比如地址不通的,跟当前解析结果不一致的情况,做对比验证

问题2、我这边看文档有提示注意,开启过期缓存,仅当域名要从缓存中过期时,才进行预读取,而不是ttl超时获取,这个域名从缓存过期时,是指那个时间? ttl 超时我理解是默认一般上级DNS解析结果ttl是 600秒,600秒过后就算超时了,如果开启过期缓存加预先获取功能,是不是也是600秒之内的最后5秒就开始预获取,提这个问题,主要是想高度跟上级DNS解析结果保持一致,如果不一致就存在问题,所以才问这个问题

注意:prefetch-domain yes功能,在开启过期缓存功能的情况下,行为和未开启有差别,开启过期缓存的情况下,仅当域名要从缓存中过期时,才进行预读取,而不是TTL超时获取。 所以,开启了过期缓存的情况下,推荐开启域名预获取功能。

运行环境

  1. 固件型号
    linux 虚拟机centos7

  2. 运营商
    电信

  3. smartdns来源以及版本 smartdns 1.2024.02.08-0828 (Release43-141-g9ee27e7)

  4. 涉及的配置(注意去除个人相关信息)

重现步骤

  1. 上游DNS配置。
    114.114.114.114

  2. 访问的域名。
    www.baidu.com

PikuZheng commented 1 month ago

问题1、/etc/smartdns/cache 是保存的缓存文件,但内容无法查看,能否支持查看,主要目的是看保存的请求域名跟解析结果是否存在错误,比如地址不通的,跟当前解析结果不一致的情况,做对比验证

smartdns --cache-print /etc/smartdns/cache

问题2、我这边看文档有提示注意,开启过期缓存,仅当域名要从缓存中过期时,才进行预读取,而不是ttl超时获取,这个域名从缓存过期时,是指那个时间? ttl 超时我理解是默认一般上级DNS解析结果ttl是 600秒,600秒过后就算超时了,如果开启过期缓存加预先获取功能,是不是也是600秒之内的最后5秒就开始预获取,提这个问题,主要是想高度跟上级DNS解析结果保持一致,如果不一致就存在问题,所以才问这个问题

域名要从缓存中过期就是ttl超时啊 ttl取决于上游但不完全是上游,由于有很多可以更改ttl的配置项 既开启过期缓存又开启预先获取,理论上所有参与预读的域名都不会产生过期(即过期缓存相关的配置不会起作用 记录常变动的域名(比如ddns)建议配置成不缓存

maojianyou commented 1 month ago

问题1、/etc/smartdns/cache 是保存的缓存文件,但内容无法查看,能否支持查看,主要目的是看保存的请求域名跟解析结果是否存在错误,比如地址不通的,跟当前解析结果不一致的情况,做对比验证

smartdns --cache-print /etc/smartdns/cache

问题2、我这边看文档有提示注意,开启过期缓存,仅当域名要从缓存中过期时,才进行预读取,而不是ttl超时获取,这个域名从缓存过期时,是指那个时间? ttl 超时我理解是默认一般上级DNS解析结果ttl是 600秒,600秒过后就算超时了,如果开启过期缓存加预先获取功能,是不是也是600秒之内的最后5秒就开始预获取,提这个问题,主要是想高度跟上级DNS解析结果保持一致,如果不一致就存在问题,所以才问这个问题

域名要从缓存中过期就是ttl超时啊 ttl取决于上游但不完全是上游,由于有很多可以更改ttl的配置项 既开启过期缓存又开启预先获取,理论上所有参与预读的域名都不会产生过期(即过期缓存相关的配置不会起作用 记录常变动的域名(比如ddns)建议配置成不缓存

问题1、当我配置 cache存储文件后 cache-persist yes cache-file /etc/smartdns/cache 需要先在/etc/smartdns/ 目录下 touch cache才会有这个文件,能否实现配置文件加了cache-file /etc/smartdns/cache ,然后重启后就自动创建cache 文件,不需要手工创建,然后我用smartdns --cache-print /etc/smartdns/cache 可以看到缓存域名,但看不到缓存的IP,这样就无法对比当时解析结果IP是否正确 image

问题2、等于只要开启预先获取,就是在上游dns ttl 有些是 600,有些是300,过期前5秒就自动重新查询解析一次,是这个意思吧,不考虑本DNS,或者上游DNS突然修改ttl的情况,如果是这样,那我理解,那其实都不用开启过期缓存,只要开启预先获取,因为我考虑的问题就是解析高度跟上游DNS保持一致,避免不同步,导致源站已经故障了,还是解析之前不通的IP。

PikuZheng commented 1 month ago
  1. cache文件在smartdns正常退出时或配置的定期保存时间到了才会保存,不需要预先touch一个

  2. 上游应答的ttl不一定是300或600,上游也会缓存域名结果导致ttl递减的。而且也有可能上游给出的结果就是ttl过期后的结果。也不是所有的查询结果都会继续被预读查询,这个取决于客户端查查询这个域名的频率。一个域名一段时间没有客户端查询后,这个域名就不再预读了。

pymumu commented 1 month ago

代码增加了A,AAAA结果的IP地址显示。

maojianyou commented 1 month ago
  1. cache文件在smartdns正常退出时或配置的定期保存时间到了才会保存,不需要预先touch一个
  2. 上游应答的ttl不一定是300或600,上游也会缓存域名结果导致ttl递减的。而且也有可能上游给出的结果就是ttl过期后的结果。也不是所有的查询结果都会继续被预读查询,这个取决于客户端查查询这个域名的频率。一个域名一段时间没有客户端查询后,这个域名就不再预读了。

代码增加了A,AAAA结果的IP地址显示。

我这边还验证给客户端设置的ttl是 30,但没有一直递减,这个是不是存在bug,正常应该ttl开始逐渐递减,不然如果当前IP故障了,比如是43.141.69.148,那是不是一直解析这个IP,会自动换成43.141.70.114不,当然测速跟预读取都开启了的,但如果当前这个IP故障,ttl没有递减,都不确定会不会故障 rr-ttl-reply-max 30 image

只所以想改ttl是,默认看解析有的ttl是 383想让返回给用户的时候变小,避免第一个IP故障,感知上游DNS变化慢,如果返回给用户60然后依次递减也可以的,或者实时跟随上游DNS变化 image 我进一步实验,发现关闭过期探测,缓存还是开启,域名预取也开启,然后开启rr-ttl 30,就可以实现上游ttl 30秒变化,需要就是这种结果,避免上游DNS变了,然后本DNS还是没有实时感知上游DNS变化 image

还有一个问题比如我分组的txoc跟 默认114.114.114.114我可以开启探测,就是2个解析结果找最快的IP,这种可以实现不,看分组的域名还是解析优先级高些,虽然114.114.114.114解析出来的IP有时延ping比较小的

分组

server 119.29.29.29 -group txoc

使用server 配置上游服务器

server 114.114.114.114

rampageX commented 1 month ago

这里也发现类似问题:

假设用 domain-rules /*.12345.xyz/ rr-ttl-reply 30 设置某泛域名的 ttl,如果查询其中一个域名 比如 a.12345.xyz, 当它正在生效过程中(或者因为查询故障)返回了 SOA 而不是 A 地址,则这个域名的 ttl 一直会是 30 不会变小。

好像 smartdns 没有像 dnsmasq 那个类似 neg-ttl=60 的参数?

PikuZheng commented 1 month ago

都设rr-ttl-reply 30了 当然是一直是30

maojianyou commented 1 month ago

都设rr-ttl-reply 30了 当然是一直是30

嗯咯,给客户端需要感知上游DNS ttl变化是 rr-ttl 30 ,我之前以为是rr-ttl-reply 30 一直是固定,还有就是max-reply-ip-num 6 我返回IP设置为6,但偶尔返回都是一个IP,是不是加了探测ping之类导致的,ttl rr-ttl 30变成0之后,偶尔变成解析1个IP image

PikuZheng commented 1 month ago

嗯咯,给客户端需要感知上游DNS ttl变化是 rr-ttl 30 ,我之前以为是rr-ttl-reply 30 一直是固定,还有就是max-reply-ip-num 6 我返回IP设置为6,但偶尔返回都是一个IP,是不是加了探测ping之类导致的,ttl rr-ttl 30变成0之后,偶尔变成解析1个IP image

这个应该是首次应答模式限制了。客户端二次查询是从cache取,是多个上游合并的结果

maojianyou commented 1 month ago

代码增加了A,AAAA结果的IP地址显示。

image

版本smartdns -v 目前cache还没IP记录的,最新的代码增加了对吧? smartdns 1.2024.06.12-2222 (Release46)

PikuZheng commented 1 month ago

版本smartdns -v 目前cache还没IP记录的,最新的代码增加了对吧?

需要7月14日之后的版本