CoreDNS是用Go开发的,可以配置多种插件来扩展其功能,非常灵活高效,它是Kubernetes的默认DNS服务器。笔者的平台采用CoreDNS来作单独的高并发域名解析服务器,在禁用ipv6解析后应用侧遇到反馈信息识别问题,本例全网独家提供了修改反馈信息的解决方法。
一、问题背景
CoreDNS在非双栈环境中为提升效率,最佳实践是禁用ipv6的DNS解析,方法是启用template插件,给所有IPV6的AAAA请求立即返回一个空结果的应答,避免请求forward到上游DNS。这是客户端会出现ipv6解析不成功,降级到ipv4的A解析。
template插件默认是在coredns启用的,只需要在配置文件中添加如下配置即可:
template ANY AAAA {
rcode NXDOMAIN
}
笔者的平台配置以后,性能得到极大提升,但某应用客户端说存在问题,称跟踪DNS解析包结果如下:
应答报文中的所询域名的ipv6应答码是:“No such name (3)”,非其期望值“No error (0)”,导致应用响应有问题。
二、问题分析及解决措施
从系统运行逻辑上来说,我既然不提供ipv6域名解析,你请求域名的ipv6地址,我反馈“No such name (3)”,结果非常ok呀。
但客户程序够严谨不怕麻烦,还去解析应答码,然后卡在那里了,如果DNS不改应答码,就需要应用侧改代码,然后还涉及大量客户端设备更新固件,也挺麻烦的。还是想办法试试能不能改改反馈信息吧。
首先测试一下当前反馈情况:
# nslookup -timeout=2 abc.test.com 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: abc.test.com
Address: 192.168.3.140
** server can't find abc.test.com: NXDOMAIN
目前全网给出的CoreDNS的ipv6禁用优化,均是以上配置,查了半天也没有什么有效办法。请教文心一言和ChatGPT,像哄小姑娘一样换了N多种问法,终于问到了以下内容:
CoreDNS 是一个灵活的 DNS 服务器,其主要作用是将域名解析为 IP 地址,以便服务之间进行通信。 CoreDNS 有许多错误类型,常见的如下:
-
SERVFAIL - DNS 服务器无法响应查询时,将返回 SERVFAIL 错误。
-
NXDOMAIN - 如果域名不存在,则返回 NXDOMAIN 错误。
-
NOERROR - 如果查询成功,则返回此错误。
-
REFUSED - 如果服务器拒绝查询,则返回此错误。
好吧,看到“NXDOMAIN”错误了,现在就是需要当查询ipv6域名不解析时,仍返回查询成功,那就改成“NOERROR”了,让ipv6域名虽不解析,但仍反馈查询成功。
尝试将coredns相关配置修改如下:
template ANY AAAA {
rcode NOERROR
}
重启服务,验证结果:
# nslookup -timeout=2 abc.test.com 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: abc.test.com
Address: 192.168.3.140
业务侧抓包验证:
客户端反馈问题已经解决。