我遇到了以下情况,想知道如何正确解决它:
名称服务器配置为不是返回 CNAME 记录(不受我的控制),仅当请求 A 记录(针对同一名称)时,才会在附加部分返回 CNAME。
问题 1:为什么有人会将 DNS 服务器配置成这样?我觉得这没有意义?(问了他们几次,但从未得到答案)
实际问题:当我们解析主机名时,例如testa.hosta.com
,我们查询 A 记录。在响应中我们得到:
# query for A of `hosta.com`
testa.hosta.com CNAME testb.hostb.com TTL=5
testb.hostb.com A 1.2.3.4 TTL=60
因此,我们将这两条记录都存储在缓存中。由于我们没有得到我们正在寻找的 A 记录,我们现在尝试 CNAME 记录。但这条记录在缓存中,它指向testb.hostb.com
。现在尝试 的 A 记录testb.hostb.com
,它也在缓存中,所以我们最终解析为1.2.3.4
。所以到目前为止一切都很好。
5 秒后,CNAME 的 TTL 过期。由于数据已过时,我们需要刷新它。因此我们查询testa.hosta.com
CNAME,结果返回的是空响应。现在我们的查询已中断...
问题2:这个查找逻辑有问题吗?我查阅了很多 rfc 来弄清楚,但什么也没找到。正确的查找顺序是什么?
任何帮助是极大的赞赏。
答案1
问题 1
我不知道为什么,这听起来像是一个返回不一致结果的损坏的实现。
第二季度
是的,您描述的逻辑有错误;您没有理由更改查询类型。
听起来您真正在寻找的是递归解析器服务器行为的基本原理。
###5.3.3. 算法
顶层算法有四个步骤:
查看答案是否在本地信息中,如果是,则将其返回给客户端。
找到最好的服务器来询问。
向他们发送查询直到有人返回响应。
分析响应,可以:
a. 如果响应回答了问题或者包含名称错误,则缓存数据并将其返回给客户端。
b.如果响应包含对其他服务器的更好的委托,则缓存委托信息,并转到步骤2。
c. 如果响应显示 CNAME,而这不是答案本身,则缓存 CNAME,将 SNAME 更改为 CNAME RR 中的规范名称,然后转到步骤 1。
d. 如果响应显示服务器故障或其他异常内容,则从 SLIST 中删除该服务器并返回步骤 3。
答案2
根据此信息:
实际问题:当我们解析主机名(例如 hosta.com)时,我们会查询 A 记录。在响应中我们得到:
# query for A of `hosta.com`
hosta.com CNAME hostb.com TTL=5
hostb.com A 1.2.3.4 TTL=60
这是完全可以预料到的。如果您查询一条A
记录,但只得到一条CNAME
返回结果(如您发布的此简介中所示),则表明该域没有A
记录,而是指向CNAME
另一条A
记录。
问题 1:为什么有人会将 DNS 服务器配置成这样?这对我来说毫无意义?(问了他们几次,但从未得到答案)
正如 @michaelhampton 指出的那样,您为什么CNAME
首先要查询?如果您尝试执行主机查找以将主机名解析为 IP 地址,那么您应该查询A
记录。如果域所有者选择为此主机名使用记录,那么您将在响应中收到并记录回来CNAME
,这是合适的。CNAME
A
更新:
5 秒后,CNAME 的 TTL 过期。由于数据已过时,我们需要刷新它。因此,我们查询 testa.hosta.com CNAME,结果返回了空响应。现在我们的查询已中断...
这没问题,但您不应该查询,CNAME
而应该将其作为记录重新查询A
。缓存值过期后,您就不能再假设自己知道它的任何信息;您必须假设它是一条A
记录,并允许 DNS 系统执行其工作,让它告诉您其他信息。
你应该总是查询A
记录,除非您正在尝试调试或诊断某些事情。