IPv6解析又出问题了
最新的几个版本在启动后首次解析一个域名时,再次出现没有IPv6地址的现象,已经试过在配置文件中加入dualstack-ip-selection no,然而无济于事。 测试5月20号左右的版本解析的结果是符合预期的,且可以通过luci正确开关双栈优选。5月20号到现在更新过好几次,不想一一测试了,不知道是哪次更新后出了问题。
最新版本发下出问题时的log,带debug的log
重启了一下路由器,模拟刚开Smartdns的时候,待IPv4/v6上游均接通后,我nslookup了数次dgss3.bdstatic.com,始终未能解析到IPv6地址(使用114DNS可以解析到),问题成功复现,log如下:
看了log,原因是,上游dns,除了114,其他的DNS服务器都返回AAAA地址SOA,IPV6地址不存在。 所以,smartdns,按照多数先响应原则,返回了SOA。
这个我考虑下怎么处理吧。
你可以先把dns_server.c:2406行注释掉临时规避。 注释掉这个,会导致不存在的域名响应时间变长。但这种情况下有V6地址的话,就会返回V地址。
也可以试试将 2405改成:
if (atomic_inc_return(&request->soa_num) >= (dns_server_num() / 2)) {
实在是不太会编译,一直用的是@PikuZheng所编译的,故没法测试修改代码,如果可以的话,能否帮忙编译一个openwrt x64的呢?
可以确定的是,5月17日的版本在同样的配置下,也解析dgss3.bdstatic.com,第一次就会返回V6结果。解析其他域名时,也会有第一次无V6地址的情况,但第二次就会有,和目前6月17日的版本情况不完全相同。
我注意到,那个通过ping来检测是否ipv6 ready的功能,貌似在我这里并没有运行成功,显示没有权限?不知道和这个有没有关系
if (atomic_inc_return(&request->soa_num) >= (dns_server_num() / 2)) {
https://github.com/PikuZheng/smartdns/releases/tag/2022.06.18-2518873742
ping ipv6会导致禁用双栈ip优选,不影响ipv6结果返回。 ping 需要root权限
仔细看了log,你smartdns运行的设备IPV6是不可用的,导致smartdns无法启用ipv6测速。 在这种情况下,就是那个上游返回快,用那个的结果。如果返回快的dgss3.bdstatic.com是SOA,那就直接返回SOA给客户端了。
仔细看了log,你smartdns运行的设备IPV6是不可用的,导致smartdns无法启用ipv6测速。 在这种情况下,就是那个上游返回快,用那个的结果。如果返回快的dgss3.bdstatic.com是SOA,那就直接返回SOA给客户端了。
他设备有ipv6,但是提示没权限。我记得以前提到过需要root权限什么的。有issue说是openwrt版本问题,但我不确定
还有一种可能是smartdns启动时,openwrt的ipv6还没准备好
openwrt在设备没有获取到IPV6的情况下,所有ipv6通讯都是返回permission denied的。 可以查看下路由器是否有获取到ipv6地址。
还有,如果想要倾向使用ipv6,可以调整如下参数,表示当ip6,ipv4的速度大于设置阈值时,优选,当前默认时15ms: dualstack-ip-selection-threshold
你可以适当调整为30~50
还有一种可能是smartdns启动时,openwrt的ipv6还没准备好
有可能,但3分钟后,会在检测一次,如果有V6,就会使用V6测速功能。
我设备是绝对有IPv6的,而且可以ping通,开机后能进openwrt的luci界面时,IPv4和IPv6上游都还未连接,要等待30秒左右才能连上
你到路由器里面,往外部ping。smatdns能工作的前提是,ping生效。

Ping是生效的,问题就是那个检测IPv6连通的功能会让测试非常麻烦,如果不是看log,谁能知道开机的时候Smartdns没有启动测速呢
一般情况,下3分钟之后,就恢复测速了。路由设备,也不会经常重启。
问题就是,即使恢复测速后,dgss3.bdstatic.com也无法一次解析出IPv6地址。当我首次访问这样的网页时,是不会使用IPv6的
这是两个不同的问题了。在关闭双栈ip优选的情况下,smartdns将包含ipv4测速最快的上游结果原样返回。如果这个结果是没有ipv6(上游就没给下来ipv6),那么自然就没ipv6结果。 在开启了双栈ip优选的情况下,刚开机没有ipv6会导致ipv6测速禁用,那么的确符合你遇到的”首次没有ipv6结果,过了一会儿有ipv6结果“。 至于后来ipv6恢复后的几分钟内也没有ipv6结果,是因为有缓存命中。
这是两个不同的问题了。在关闭双栈ip优选的情况下,smartdns将包含ipv4测速最快的上游结果原样返回。如果这个结果是没有ipv6(上游就没给下来ipv6),那么自然就没ipv6结果。 在开启了双栈ip优选的情况下,刚开机没有ipv6会导致ipv6测速禁用,那么的确符合你遇到的”首次没有ipv6结果,过了一会儿有ipv6结果“。 至于后来ipv6恢复后的几分钟内也没有ipv6结果,是因为有缓存命中。
为什么关闭双栈优选是将包含ipv4测速最快的上游结果原样返回啊?这不符合逻辑啊,不应该是关闭了以后就不在V4和V6之间比较速度吗,然后两个结果都返回,这样设备就可以首先使用V6了
我觉得我使用Smartdns的目标很简单啊,就是尽可能多的返回V6地址,同时在仅有V4地址的域名启用测速。 实际上我添加的上游DNS中,114DNS就是IPV6结果返回最多的,而添加其他DNS服务器的原因,一是为了访问那些有IP限制的内网资源,二是获取更多的IPV6地址。 我觉得关闭双栈优选,就应当能达到这个目标,但目前反而是因为一些权重、检测等功能导致了返回不稳定。
这里相比之前的版本,行为上做过修改。 之前版本,即使IPV6不工作,也会测速,但会测速失效,失效后,会选择一个可能的结果。 当前版本是,IPV6不工作,就停止测速,返回相应最快的DNS结果。
之前的方案,在IPV6不工作的时候,客户端查询AAAA地址时,会导致查询延迟,查询延迟可能会有500ms。 改成后者的目的是,在没有IPV6的设备,又开启测速时,能保证很快有查询结果,查询延迟就是上游结果延迟。
这个修改针对的是,无IPV6网络的查询优化。
对于你的情况,比较特殊,这个域名dgss3.bdstatic.com,只有114有IPV6,其他服务器返回的都是SOA,正好114相应比其他DNS服务器响应慢,导致有SOA的结果,返回给了客户端,并进行了缓存。后面再缓存周期查询,一直都是无结果的。
针对你的情况,建议是使用smartdns默认的配置,不要关闭过期缓存serve-expired功能和缓存持久化功能。 smartdns是越用越快的。
cache-persist yes
cache-size 16384
dualstack-ip-selection yes
dualstack-ip-selection-threshold 50
prefetch-domain yes
serve-expired yes
serve-expired-ttl 259200
serve-expired-reply-ttl 1
force-qtype-SOA 65
这样,你后面再查询的话,应该是都会有V6地址。
但要避免频繁重启设备,重启设备会导致cache丢失。 smartdns.1.2022.06.18-1119.x86_64-openwrt-all.ipk.zip
不应该是关闭了以后就不在V4和V6之间比较速度吗,然后两个结果都返回
一个查询,ipv4的结果和ipv6的结果是在同一组中的,除非你的终端指明只要ipv4或只要ipv6(nslookup qt=aaaa)。 ~~smartdns之前的处理逻辑是仅返回一个测速最快的ip。但后来发现会丢失部分edns数据,于是改成了将整个上游结果完整返回。~~
~~开启双栈优选后,如果ipv4的测速结果比ipv6快,那也是会返回ipv4结果而不带ipv6的。~~ ~~关闭双栈优选后,如果~~
双栈优选和测速是两个不同的功能。按你的说法,需要既关闭双栈优选又关闭测速。这样得到的结果是首个应答的上游的完整结果。
我认为按你的需求,直接使用114作为单一上游并关闭优选和测速。对于ipv4单栈的域名,应单独写域名规则来发起测速。
确实是我的需求有些过分了,仔细想了想,目前我使用SmartDNS解决的问题还是比我对IPv6的过分需求更重要。 那些绝大部分上游都能解析出V6的域名解析没什么问题,对于绝大部分用户来说,这已经是非常好的解决方案了。 只是希望SmartDNS能多出一些给用户的选项,让那一少部分用户能满足更多的需求,毕竟接触到SmartDNS的人,多少还是对网络有些偏执的。
还有一个问题,就是一开机的时候如果路由器的V6还未连接,那么上游DNS中的V6DNS就被禁止了,之后的请求中就不使用了,而同样未连接的V4,上游DNS中的V4DNS只是closed,并未被禁止。
V6: [2022-06-17 22:59:36,697][DEBUG][ dns_client.c:2844] send query to server 2001:da8::666 [2022-06-17 22:59:36,697][DEBUG][ dns_client.c:2889] send query to 2001:da8::666 failed, Permission denied, type: 0 [2022-06-17 22:59:36,697][ INFO][ dns_client.c:2895] server 2001:da8::666 not alive, prohibit
V4: [2022-06-17 22:59:36,697][DEBUG][ dns_client.c:2844] send query to server 101.6.6.6 [2022-06-17 22:59:36,697][DEBUG][ dns_client.c:2882] send query to 101.6.6.6 failed, Network is unreachable, type: 0 [2022-06-17 22:59:36,698][DEBUG][ dns_client.c:1143] server 101.6.6.6 closed.
无法使用ipv6地址作为上游,不影响解析结果中有ipv6地址。 只有ipv6不通,又开了双栈ip优选的情况下,才会丢弃ipv6查询结果
无法使用ipv6地址作为上游,不影响解析结果中有ipv6地址。 只有ipv6不通,又开了双栈ip优选的情况下,才会丢弃ipv6查询结果
我知道,但我不希望我的上游中有DNS无法被使用,这是另外一个问题。