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.5k stars 1.09k forks source link

可能 Cache 中存在某些异常,仅有 Apple App Store 受到了影响 #1815

Open CallMeR opened 2 months ago

CallMeR commented 2 months ago

问题现象

当 SmartDNS 长时间运行(1~3天不等),打开 Apple App Store 会显示网络异常,必须多次点刷新 App ,或者重启 SmartDNS 才能回复 App Store 的访问。

我查看了日志,解析部分的 debug 没有 error 或者 waring ,均为正常解析,也尝试了去掉广告屏蔽列表,问题依旧。

或者让 Dnsmasq 不监听 53 端口,直接让 SmartDNS 监听 53 端口,该现象更为稳定复现,有时 12 小时内即可复现。

如果设置了 serve-expired yes ,该问题也能复现,但时间至少需要 1 天以上。

运行环境

  1. 固件型号

Debian12 x86_64

  1. 运营商

不相关

  1. smartdns来源以及版本

smartdns.1.2024.06.12-2222.x86_64-linux-all.tar.gz

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

其中 x.home.arpa 为内网域名,172.16.1.1 为主路由地址,主路由已经设置了放行来自 SmartDNS 服务器地址到任意地址 53 端口的流量。

conf-file /etc/smartdns.d/*.conf

cache-file /tmp/smartdns.cache

log-level notice

bind [::]:6053@lo
bind-tcp [::]:6053@lo

prefetch-domain yes

rr-ttl-min 60
rr-ttl-max 28800
rr-ttl-reply-max 14400

force-qtype-SOA 65
max-query-limit 1024
max-reply-ip-num 24

server 172.16.1.1 -group intranet -exclude-default-group
nameserver /x.home.arpa/intranet
domain-rules /x.home.arpa/ -speed-check-mode none -no-cache

server-tcp 223.5.5.5 -bootstrap-dns
server-tcp 52.80.66.66 -bootstrap-dns
server-tcp 2400:3200::1 -bootstrap-dns
server-tcp 2400:7fc0:849e:200::4 -bootstrap-dns

server-tls dot.pub
server-tls dns.alidns.com
server-tls dot-pure.onedns.net

server-https https://doh.pub/dns-query
server-https https://dns.alidns.com/dns-query
server-https https://doh-pure.onedns.net/dns-query

重现步骤

  1. 上游DNS配置。

除了主配置文件中的上游,还用了我自己写的 SmartDNS CN 域名加速脚本来生成配置。

https://gitee.com/callmer/smartdns_china_list_installer

server 223.5.5.5       -group flash -exclude-default-group
server 180.184.1.1     -group flash -exclude-default-group
server 119.29.29.29    -group flash -exclude-default-group
server 114.114.114.114 -group flash -exclude-default-group
server 2402:4e00::     -group flash -exclude-default-group
server 2400:3200::1    -group flash -exclude-default-group

每天自动获取 Adlist 并执行一次域名加速脚本(加速脚本中有重启 SmartDNS 的功能)

20 9 * * * /usr/bin/curl --retry-connrefused --retry 5 --retry-delay 5 --retry-max-time 60 -fsSLR -o /etc/smartdns.d/anti-ad.smartdns.conf https://anti-ad.net/anti-ad-for-smartdns.conf

30 9 * * * /usr/bin/bash /opt/smartdns-plugin.sh
  1. 访问的域名。
    Apple App Store 的域名
pymumu commented 2 months ago

只能发log看,可以打开audit log。看对应时间返回了什么地址给客户端,导致链接不上。

lalasou commented 2 months ago

我也有这种情况 一般 关掉App Store 重新打开就好了
不行就多试几次

为什么不知道...

CallMeR commented 2 months ago

捕获到了一次日志,但是很长,如果有更好的分享日志的方法麻烦告诉我一下。 大概出现的时间是 16:07 分左右,所以我把前后的日志也都包含进来了。 smartdns-audit.log smartdns.log

PS: 我发现了几个这样的日志:

[2024-09-03 16:07:45,148][DEBUG][     dns_client.c:2871] remote server not supported.
[2024-09-03 16:07:45,149][DEBUG][     dns_client.c:1324] server 54.223.159.81 closed.

经过查看这个是 *.onedns.net 的 DoT 、DoH ,不过这个地址是我最近才加上的,之前一直只有 Alidns 和 Dnspod 的 DoT 、DoH ,也同样是有这个问题,这个问题最早可以追溯到 R45 版本。

没想到 *.onedns.net 竟然没有证书来验证。。。

CallMeR commented 2 months ago

盲猜一下,不知道是不是和这个也有关: https://github.com/pymumu/smartdns/issues/1236#issuecomment-2246786370

lalasou commented 2 months ago

盲猜一下,不知道是不是和这个也有关:

https://github.com/pymumu/smartdns/issues/1236#issuecomment-2246786370

盲猜 关闭缓存应该解决...

CallMeR commented 2 months ago

盲猜一下,不知道是不是和这个也有关: #1236 (comment)

盲猜 关闭缓存应该解决...

现在 Alidns 和 Dnspod 都有 DNS 限速,关闭缓存,基本上就不太能用了,分分钟就超过限额,然后 DNS query failed

strayedstar commented 2 months ago

我这也是,搞得我一头雾水,测试了一下,只保留一个提供商的DNS短时间没问题,删除缓存重新启动以后可能恢复,但是多DNS一段时间就无法访问github等等网站了,即使设置了单独的组(cloudeflare,googles dns),看log,在不同的组里面是返回了正确的IP,但是依然无法使用,而且有的无法访问的页面会引用缓存,没法子,只能先单独使用移动的DNS了(呕).

lalasou commented 2 months ago

把cache size 改大点 明显好转

CallMeR commented 2 months ago

把cache size 改大点 明显好转

你改成了多大

lalasou commented 2 months ago

把cache size 改大点 明显好转

你改成了多大

29998 现在很少碰到那种情况了

CallMeR commented 2 months ago

把cache size 改大点 明显好转

你改成了多大

29998 现在很少碰到那种情况了

我的内存是 2GB ,按照代码,应该是 262144 这么个数字吧 ?

{
    uint64_t memsize = get_system_mem_size();
    if (dns_conf_cachesize >= 0) {
        return;
    }

    if (memsize <= 16 * 1024 * 1024) {
        dns_conf_cachesize = 2048; /* 1MB memory */
    } else if (memsize <= 32 * 1024 * 1024) {
        dns_conf_cachesize = 8192; /* 4MB memory*/
    } else if (memsize <= 64 * 1024 * 1024) {
        dns_conf_cachesize = 16384; /* 8MB memory*/
    } else if (memsize <= 128 * 1024 * 1024) {
        dns_conf_cachesize = 32768; /* 16MB memory*/
    } else if (memsize <= 256 * 1024 * 1024) {
        dns_conf_cachesize = 65536; /* 32MB memory*/
    } else if (memsize <= 512 * 1024 * 1024) {
        dns_conf_cachesize = 131072; /* 64MB memory*/
    } else {
        dns_conf_cachesize = 262144; /* 128MB memory*/
    }
}
lalasou commented 2 months ago

我也不知道 我只是改了后 明显好转

32768

CallMeR commented 2 months ago

我也不知道 我只是改了后 明显好转

32768

你的内存是多少?

lalasou commented 2 months ago

我也不知道 我只是改了后 明显好转

32768

你的内存是多少?

512 路由器 红米6000

CallMeR commented 2 months ago

如果是 512 的话,默认应该是 131072 ?

不过我也试了一下 32768 这个值,手机过了一晚上没碰,的确这个问题有缓解的迹象,没有出现无法联网的界面。

这么来看,似乎是手动改小缓存容量可以缓解这个问题。

$ sudo smartdns --cache-print /tmp/smartdns.cache | wc -l
3198

目前缓存只吃了 3198 。

lalasou commented 2 months ago

如果是 512 的话,默认应该是 131072 ?

不过我也试了一下 32768 这个值,手机过了一晚上没碰,的确这个问题有缓解的迹象,没有出现无法联网的界面。

这么来看,似乎是手动改小缓存容量可以缓解这个问题。


$ sudo smartdns --cache-print /tmp/smartdns.cache | wc -l

3198

目前缓存只吃了 3198 。

我是由小改大

CallMeR commented 1 month ago

这两天我把 force-qtype-SOA 65 这个参数去掉了,似乎也有所帮助。

EXHades commented 1 month ago

可以试下关闭特定域名的缓存

# apple app store
domain-rules /itunes.apple.com/ -no-cache
domain-rules /apps.apple.com/ -no-cache
domain-rules /mzstatic.com/ -no-cache
domain-rules /cdn-apple.com/ -no-cache
domain-rules /ocsp2.apple.com/ -no-cache
domain-rules /certs.apple.com/ -no-cache

我这边配置后,iOS/MacOS 的 AppStore 到现在 2 周多没出现过中断了

pymumu commented 1 month ago

打开prefetch看看

CallMeR commented 1 month ago

打开prefetch看看

prefetch-domain yes 这个是开着的呀

CallMeR commented 1 month ago

这两天我把 force-qtype-SOA 65 这个参数去掉了,似乎也有所帮助。

进一步测试了 3 天,还是会出现这个问题,那么应该不是这个参数导致的。