我认为第一个问题最简单的答案是“不,你对此有“A””,但我意外地使用指向 IP 地址的 CNAME 设置了一些子域,并且它在我办公室的几台计算机上运行。我想知道这是怎么可能的?
现在,当我从家检查它时,出现以下错误:
beast:~ viroos$ host somesubdomain.somedomain.com
Host somesubdomain.somedomain.com not found: 3(NXDOMAIN)
我确信它曾经在我的办公室里发挥作用(目前看起来好像不行,但我在另一台机器上检查了)。因此我不能 100% 确定它是否因为某些特殊的网络设置而起作用,或者因为我在添加 DNS 条目后就对其进行了测试。
我知道这个故事听起来有点疯狂/难以置信,但有人能帮我解开这个谜题吗?
//编辑:我正在添加挖掘输出
; <<>> 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
答案1
记录上的数据CNAME
必须始终是另一个 DNS 名称 - 这就是 的全部意义所在CNAME
。
正如 RFC 1034 简明扼要地指出的那样,a 中的数据CNAME
应该是:
CNAME a domain name.
但是,如果您希望指向 IP 地址,那么您的票是:
A For the IN class, a 32 bit IP address
CNAME
被设计和实现为 DNS 别名;它没有在数据字段中包含 IP 地址的概念。因此,按照设计,它被解释为另一个 DNS 名称的别名;毕竟,IP 地址符合 DNS 名称的语法。
因此,为了举例说明,假设您的 DNS 数据是:
somesubdomain.somedomain.com. 60 IN CNAME 192.0.2.1.
您正在查询的递归 DNS 服务器发现记录是CNAME
,并认为您需要它所包含的实际数据。除 之外没有CNAME
找到其他记录,因此无法向客户端提供任何答案。
192
它尝试查询域 中的主机名 的记录0.2.1
。它没有该名称的任何缓存,因此它会询问根服务器。它们为诸如.com
和 之类的 TLD 提供请求.net
,但此请求是对 的请求.1
。它们立即响应说没有这样的请求,这就是递归器发送给您的内容。
您看到的响应dig
是您的递归名称服务器说:“嗯,您寻找的名称指向其他地方,而那个地方并不存在 - 如果您不相信我,请询问根服务器”。
所以,是的,将 IP 地址放入CNAME
记录中永远是无效的,并且我怀疑正在运行的系统通过其他机制(如主机文件或本地名称解析)正常运行 - 调查它们的名称解析行为。
答案2
cname 是规范名称,它只是另一个名称的别名,通常是 A 记录或另一个 cname 等。如果您将 cname 设置为指向 IP,那么它只是该 IP 的别名。我不认为您的 DNS 服务器会检查目标是否合法,因为标准 RFC 并没有真正说明 cname 目标的数据格式/验证是什么。这不是通常的用法,但如果它对您有用,那么它就是有效的。我认为,有时它不起作用这一事实应该足以让您使用它的常规用法。
答案3
你可以有:
example IN CNAME 1.2.3.4.
其中 1.2.3.4 是有效的 IP 地址。不过请注意 CNAME 中的尾部点。您办公室中的某些机器确实可以使用此地址,而其他机器则不能,这让我相信那些可以使用此地址的机器在 或 文件中设置了子lmhosts
域/etc/hosts
。