CNAME 查询失败,但 A 查询返回 CNAME

CNAME 查询失败,但 A 查询返回 CNAME

我遇到了以下情况,想知道如何正确解决它:

名称服务器配置为不是返回 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.comCNAME,结果返回的是空响应。现在我们的查询已中断...

问题2:这个查找逻辑有问题吗?我查阅了很多 rfc 来弄清楚,但什么也没找到。正确的查找顺序是什么?

任何帮助是极大的赞赏。

答案1

问题 1

我不知道为什么,这听起来像是一个返回不一致结果的损坏的实现。

第二季度

是的,您描述的逻辑有错误;您没有理由更改查询类型。

听起来您真正在寻找的是递归解析器服务器行为的基本原理。

RFC1034 解析器内部/算法部分(5.3.3)

###5.3.3. 算法

顶层算法有四个步骤:

  1. 查看答案是否在本地信息中,如果是,则将其返回给客户端。

  2. 找到最好的服务器来询问。

  3. 向他们发送查询直到有人返回响应。

  4. 分析响应,可以:

    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,这是合适的。CNAMEA

更新:

5 秒后,CNAME 的 TTL 过期。由于数据已过时,我们需要刷新它。因此,我们查询 testa.hosta.com CNAME,结果返回了空响应。现在我们的查询已中断...

这没问题,但您不应该查询,CNAME而应该将其作为记录重新查询A。缓存值过期后,您就不能再假设自己知道它的任何信息;您必须假设它是一条A记录,并允许 DNS 系统执行其工作,让它告诉您其他信息。

你应该总是查询A记录,除非您正在尝试调试或诊断某些事情。

相关内容