我可以将 CNAME 与 IP 地址一起使用吗?为什么如果工作(有时)?

Mac*_*cki 14 domain-name-system

我相信第一个问题的最简单答案是“不,你有“A””,但我不小心使用指向 IP 地址的 CNAME 设置了一些子域,并且它在我办公室的几台计算机上工作。我想知道怎么可能?

现在,当我在家检查时,出现以下错误:

beast:~ viroos$ host somesubdomain.somedomain.com
Host somesubdomain.somedomain.com not found: 3(NXDOMAIN)
Run Code Online (Sandbox Code Playgroud)

我 100% 它曾经在我的办公室工作(目前看起来没有,但我正在不同的机器上检查它)。因此,如果由于某些特殊的网络设置或因为我在添加 DNS 条目后才对其进行了测试,我不是 100%。

我知道这个故事听起来有点疯狂/难以置信,但有人能帮我解决这个难题吗?

//编辑:我正在添加挖掘输出

; <<>> DiG 9.6-ESV-R4-P3 <<>> somesubdomain.somedomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 60224
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;somesubdomain.somedomain.com.      IN  A

;; ANSWER SECTION:
somesubdomain.somedomain.com.   67  IN  CNAME   xxx.xxx.xxx.xx1.

;; AUTHORITY SECTION:
.           1800    IN  SOA a.root-servers.net. nstld.verisign-grs.com. 2012040901 1800 900 604800 86400

;; Query time: 72 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Apr 10 00:11:01 2012
;; MSG SIZE  rcvd: 136
Run Code Online (Sandbox Code Playgroud)

Sha*_*den 20

CNAME记录上的数据必须始终是另一个 DNS 名称 - 这就是CNAME.

正如 RFC 1034 所言, a 中的数据CNAME应该是:

            CNAME           a domain name.
Run Code Online (Sandbox Code Playgroud)

同时,如果您想指向一个 IP 地址,那么您的票证是:

            A               For the IN class, a 32 bit IP address
Run Code Online (Sandbox Code Playgroud)

CNAME被设计和实现为一个 DNS 别名;它没有在该数据字段中具有 IP 地址的概念。因此,按照设计,它被解释为另一个 DNS 名称的别名;毕竟,IP 地址符合 DNS 名称的语法。

因此,例如,假设您的 DNS 数据是:

somesubdomain.somedomain.com.   60  IN  CNAME   192.0.2.1.
Run Code Online (Sandbox Code Playgroud)

您正在查询的递归 DNS 服务器看到记录是CNAME,并认为您需要它包含的实际数据。除了CNAME已找到的记录外,没有其他记录,因此无法向客户提供答案。

它尝试192在域内查询主机名的记录0.2.1。它没有为该名称缓存任何内容,因此它会询问根服务器。他们为像.com.net这样的TLD 请求提供服务,但这个请求是对.1. 他们迅速回应说没有这样的,这就是递归器发送给你的。

您看到的响应dig是您的递归名称服务器说,“好吧,您查找的名称指向其他地方,而某处不存在 - 如果您不相信我,请询问根服务器”。


所以,是的,将 IP 地址放在CNAME记录中永远不会有效,我怀疑正在工作的系统通过某种其他机制正常运行,例如主机文件或本地名称解析 - 调查它们的名称解析行为。