CNAME指向多值通配符A记录时部分工具解析失败的问题咨询
问题描述
我尝试将 access.domain.intra 的CNAME记录指向带有多个A记录的通配符FQDN *.sub.domain.intra,Dig查询结果如下:
;; QUESTION SECTION: ;access.domain.intra. IN A ;; ANSWER SECTION: access.domain.intra. 3600 IN CNAME *.sub.domain.intra. *.sub.domain.intra. 3600 IN A 192.168.1.1 *.sub.domain.intra. 3600 IN A 192.168.1.2 *.sub.domain.intra. 3600 IN A 192.168.1.3 *.sub.domain.intra. 3600 IN A 192.168.1.4 *.sub.domain.intra. 3600 IN A 192.168.1.5
目前Chrome可以正常解析访问,但curl、Firefox、wget、ping这些工具都无法解析:
$ ping access.domain.intra ping: access.domain.intra: System error $ wget -v access.domain.intra --2023-06-28 12:39:41-- http://access.domain.intra/ Resolving access.domain.intra (access.domain.intra)... failed: Success. wget: unable to resolve host address ‘access.domain.intra’
我的需求是通过特定FQDN(比如access.domain.intra)访问集群,同时只维护*.sub.domain.intra的A记录(新增集群节点时只更新这一处),不想每次新增站点都创建5条A记录。想知道是不是我的配置有问题,或者有没有更好的实现方式?
问题分析
这是因为大部分标准DNS解析器(包括curl、wget、ping依赖的系统DNS库)不支持将CNAME记录指向通配符域名。虽然Chrome的DNS解析逻辑可能做了特殊兼容处理(比如自定义解析缓存或更宽松的规则),但遵循DNS规范的解析工具会认为这种配置是无效的——通配符记录的设计初衷是匹配符合规则的子域名,而非作为CNAME的目标指向。
解决方案
推荐你调整DNS配置,避免直接将CNAME指向通配符,改用以下更规范的方式:
创建一个专用的集群域名(非通配)
比如设置cluster.sub.domain.intra,给它配置那5个A记录(后续新增节点时只更新这个域名的A记录即可):cluster.sub.domain.intra. 3600 IN A 192.168.1.1 cluster.sub.domain.intra. 3600 IN A 192.168.1.2 cluster.sub.domain.intra. 3600 IN A 192.168.1.3 cluster.sub.domain.intra. 3600 IN A 192.168.1.4 cluster.sub.domain.intra. 3600 IN A 192.168.1.5将业务域名CNAME到这个专用集群域名
把access.domain.intra的CNAME记录指向cluster.sub.domain.intra,而不是通配符:access.domain.intra. 3600 IN CNAME cluster.sub.domain.intra.
这种方式既满足了你“只维护一处A记录”的需求,又符合DNS规范,所有工具(包括ping、curl、wget等)都能正常解析到对应的IP地址。
备注:内容来源于stack exchange,提问作者b24sti

