重叠委托DNS区域冲突致域名解析随机返回NXDOMAIN问题咨询
问题根因
异常由DNS子域委托链路断裂、跨层级配置委托导致,完全符合你观察到的随机返回结果、返回上层域SOA的现象,核心逻辑如下:
- DNS递归查询遵循权威应答原则:每一级权威服务器仅对自己管辖区域内的资源记录、以及本区域内明确配置的子域委托返回正确结果,不会感知其他层级权威上配置的跨级子域委托。
- 你当前的配置存在委托层级错误:在AWS Route53托管的根域
domain.com上,同时配置了两个不同层级的委托:sub.domain.com委托至GCPns-cloud-d[1..4].googledomains.com服务器dev.sub.domain.com(sub.domain.com的直属子域)直接委托至GCPns-cloud-b[1..4].googledomains.com服务器
- 配置遗漏点:GCP侧托管
sub.domain.com的d系列权威服务器管辖的区域内,没有配置dev.sub.domain.com的NS委托记录。此时递归DNS服务器迭代查询时会出现两种路径:- 路径1:递归服务器匹配到最长后缀的
dev.sub.domain.com委托,直接向b系列权威服务器发起请求,拿到正确的A记录,返回正常解析结果 - 路径2:递归服务器先匹配到
sub.domain.com的委托,向d系列权威服务器请求app.dev.sub.domain.com的解析。d系列服务器查询自身区域时,既找不到这条A记录,也没有dev.sub.domain.com的委托配置,会判定该域名不存在,返回自身区域的SOA记录,给出NXDOMAIN否定应答
- 路径1:递归服务器匹配到最长后缀的
- 8.8.8.8是任播架构的公共DNS集群,不同节点缓存的查询路径、正负缓存结果不统一,就会出现响应随机交替、运行一段时间后固定返回NXDOMAIN的现象——本质是节点拿到错误的否定应答后,会按照SOA中配置的负缓存TTL(你当前配置为300秒)缓存错误结果,TTL到期前不会重新发起迭代查询。
你观察到异常时返回sub.domain.com的SOA而非dev.sub.domain.com的SOA,也完全符合这个错误逻辑:请求被发往了不知道dev子域存在的sub域权威服务器,该服务器认为dev.sub.domain.com属于自身管辖范围,不存在时自然返回本域的SOA记录。
修复步骤
按照DNS协议的委托层级要求修正配置即可,操作如下:
- 登录AWS Route53控制台,进入
domain.com托管区域,删除之前配置的dev.sub.domain.comNS记录,禁止在根域直接配置跨层级的子域委托,保证委托链路连续:domain.com→sub.domain.com→dev.sub.domain.com - 登录GCP Cloud DNS控制台,进入
sub.domain.com对应的托管区域(即分配d系列谷歌NS的区域),新增一条NS记录:- 记录名称:
dev.sub.domain.com - 记录类型:
NS - 记录值:填写
dev.sub.domain.com托管区域分配的4个权威地址,即ns-cloud-b1.googledomains.com、ns-cloud-b2.googledomains.com、ns-cloud-b3.googledomains.com、ns-cloud-b4.googledomains.com
- 记录名称:
- 等待配置同步:GCP Cloud DNS的配置全球同步通常在1分钟内完成,由于之前的负缓存TTL为300秒,等待5分钟让旧的错误缓存过期即可。
验证方法
配置完成后可直接向权威服务器发起查询,确认链路正确性:
- 执行
dig app.dev.sub.domain.com @ns-cloud-d1.googledomains.com,正常返回结果中应携带dev.sub.domain.com的NS记录,不应出现sub.domain.com的SOA记录 - 执行
dig app.dev.sub.domain.com @ns-cloud-b1.googledomains.com,正常返回结果中应携带你配置的开发实例A记录
上述两个查询结果符合预期后,再通过8.8.8.8等公共DNS查询就不会出现随机NXDOMAIN的问题。
内容的提问来源于stack exchange,提问作者J.Lgl
相关产品推荐
相关产品推荐

