【问题标题】:dig returns wrong record typedig 返回错误的记录类型
【发布时间】:2019-05-11 19:29:37
【问题描述】:

这似乎是我遗漏了一些明显的东西,或者以前有人问过。当我使用-t 参数查询dig 以指定DNS 记录类型时,即使返回的记录是不同的记录类型,结果似乎也包含答案。这是一个例子:

$ dig -t A -q polestar.databaseguy.com.

; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> -t A polestar.databaseguy.com.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33130
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;polestar.databaseguy.com.      IN      A

;; ANSWER SECTION:
polestar.databaseguy.com. 3600  IN      CNAME   databaseguy.ddns.net.
databaseguy.ddns.net.   60      IN      A       173.19.127.251

;; Query time: 30 msec
;; SERVER: 10.0.10.1#53(10.0.10.1)
;; WHEN: Mon Dec 10 14:41:50 STD 2018
;; MSG SIZE  rcvd: 103

ANSWER SECTION 中列出的 CNAMEA 记录是正确的。但是,CNAME 用于polestar.databaseguy.com.A 用于databaseguy.ddns.net.polestar.databaseguy.com.没有A记录,这是我查询的,所以我预计没有结果。

我非常有信心这是正确的行为,但我不理解它,也没有在man dig 页面中看到任何解释。我也找不到其他在线讨论,无论是在这个网站上还是在其他地方。有人可以帮我理解这一点吗?

【问题讨论】:

  • 反对者,请解释您的投票。从这个问题中,我了解到我认为这是一个 nslookup/dig 问题,而它实际上是一个协议问题,因此我应该查看 DNS 文档而不是 dig 文档。如果它可以帮助其他人在未来更快地穿越该知识路径,那几乎算不上什么。我确实理解投反对票的冲动,但在我的 OP 中,我什至提到我认为这种行为是正确的,所以这不像是我在左场一百万英里,是吗?

标签: dns cname dig a-records


【解决方案1】:

这是预期的行为,它减少了所需的交换量,并且特定于 CNAME 记录。

DNS 上的核心文档涵盖了它:RFC1034,第 3.6.2 节

看这个:

CNAME RR 会导致 DNS 软件中的特殊操作。当一个名称服务器 未能在与 域名,它检查资源集是否包含 CNAME 用匹配的类记录。如果是这样,名称服务器包括 响应中的 CNAME 记录并在域名处重新开始查询 在 CNAME 记录的数据字段中指定。一个例外 此规则是匹配 CNAME 类型的查询不 重新启动。

使用与您的情况完全匹配的清晰示例:

例如,假设名称服务器正在处理带有 for 的查询 USC-ISIC.ARPA,要求 A 类信息,并具有以下内容 资源记录:

USC-ISIC.ARPA   IN      CNAME   C.ISI.EDU

C.ISI.EDU       IN      A       10.0.0.52

这两个 RR 都会在类型 A 的响应中返回 查询,而类型 CNAME 或 * 查询应该只返回 CNAME。

有关其他要点,请参见第 5.2.2 节。 6.2.7 和 6.2.8 节也给出了例子。

这还取决于您查询的是递归名称服务器还是权威名称服务器。

databaseguy.com 用于域名服务器:

pdns01.domaincontrol.com.
pdns02.domaincontrol.com.

如果您查询其中之一:

$ dig A polestar.databaseguy.com. @pdns01.domaincontrol.com.

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @pdns01.domaincontrol.com.
;; global options: +cmd
;; Sending:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64115
;; flags: rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: e45ebc418c94c90a
;; QUESTION SECTION:
;polestar.databaseguy.com. IN A

;; QUERY SIZE: 65

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64115
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;polestar.databaseguy.com. IN A

;; ANSWER SECTION:
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.

您只获得 CNAME 值,因为此权威名称服务器只知道这一点,并且对 ddns.net 没有权威。

但是,如果您询问任何 recursive 域名服务器,它会执行递归并给您“完整”答复:

$ for ns in 1.1.1.1 8.8.8.8 9.9.9.9 80.80.80.80 ; do dig A polestar.databaseguy.com. @$ns +noall +ans ; done

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @1.1.1.1 +noall +ans
;; global options: +cmd
;; connection timed out; no servers could be reached

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @8.8.8.8 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 59m59s IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net.   59s IN A 173.19.127.251

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @9.9.9.9 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net.   1m IN A 173.19.127.251

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @80.80.80.80 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net.   1m IN A 173.19.127.251

1.1.1.1 没有回复我的查询,但这与此问题无关)

关于“没有针对polestar.databaseguy.com.的A记录,这是我查询的,所以我预计不会有结果。”这是错误的一半,因为该名称具有 CNAME,这意味着另一个规范名称,并且该规范名称具有 A 记录,因此在一天结束时,就好像起始名称具有 A 记录一样。任何在本地向操作系统询问该主机的 IP 地址的应用程序都将获得 A 记录,因为操作系统将负责完整的递归解析并“取消引用”CNAME。

【讨论】:

  • 感谢您的精彩回答!我不知道在哪里可以找到该文档,这不仅为我解决了问题,而且还给了我一个想法(事后看来很明显),当我遇到问题时,我应该考虑协议文档,而不仅仅是应用程序文档喜欢这个。
猜你喜欢
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
相关资源
最近更新 更多