我有两个子区域可以说:
zone "first.com" { type master; file "/etc/bind/zones/first.com.primary";};
zone "second.com" { type master; file "/etc/bind/zones/second.com.primary";};
首先我定义里面
$TTL 300
@ IN SOA ns1.org.com. postmaster.org.com. (
2022050902 ; serial
14400 ; refresh
1800 ; retry
604800 ; expire
86400 ) ; minimum
@ IN NS ns1.org.com.
subdomain IN A 127.0.0.1
第二我想先参考一下
$TTL 86400
@ IN SOA ns1.org.com. postmaster.org.com. (
2019032601 ; serial
14400 ; refresh
1800 ; retry
604800 ; expire
86400 ) ; minimum
@ IN NS ns1.org.com.
@ IN CNAME subdomain.first.com.
www IN CNAME @
localhost IN A 127.0.0.1
loopback IN CNAME localhost
那可能吗?
答案1
一条CNAME
记录指定了该名称左边记录的一侧CNAME
是名称的别名正确的边 -适用于所有类型的 DNS 记录,不仅仅是为了A
记录。粗体部分是导致此处问题的原因,因为“所有记录类型”还包括区域SOA
和NS
记录。
您正在尝试使用CNAME
位于该区域顶部的记录second.com
,该SOA
记录也位于该区域的顶部。因此,以完全限定的形式编写,您的第一个CNAME
内容是:
second.com. IN CNAME subdomain.first.com.
因此,当请求 的 SOA 记录时,应该返回second.com
的 SOA 记录。subdomain.first.com
但是,真正的 SOA 记录second.com
将无法访问,并且如果没有该 SOA 记录,整个second.com
域将被破坏 - 这意味着CNAME
指向的记录subdomain.first.com
实际上无效。
此外,如果subdomain.first.com
不是其自己区域的顶点,而只是较高级别区域中的子域,则它没有自己的 SOA 记录:遵循 CNAME 映射意味着对second.com
的 SOA 记录的请求必须得到的回答是“绝对不存在这样的记录”。但如果该区域没有 SOA 记录second.com
,则该区域不存在。
second.com
同样,当请求 的NS 记录时,CNAME
将需要用 的 NS 记录进行响应subdomain.first.com
。但 的名称服务器subdomain.first.com
根本不需要了解任何有关 的信息second.com
。
为了防止出现这样的矛盾情况,RFC 1034 第 3.6.2 节说:
如果节点上存在 CNAME RR,则不应存在其他数据;这确保规范名称及其别名的数据不能不同。此规则还确保可以使用缓存的 CNAME,而无需与权威服务器检查其他 RR 类型。
(请注意,RFC 1034 早于使用词语的约定应该,必须和可能严格按照要求等级,按照 RFC 2119 中的定义。虽然它说“没有其他数据应该存在”,这是一个要求,而不是建议,因为 DNS 缓存的正确性取决于它。)
此规则使得CNAME
记录不可能存在于区域的顶点,因为SOA
和NS
记录需要位于顶点才能使区域有意义地存在,并且任何CNAME
与它们一起的记录都将违反此规则。
有关更多详细信息,请参阅:https://www.isc.org/blogs/cname-at-the-apex-of-a-zone/
@ IN CNAME subdomain.first.com.
www IN CNAME @
此外,将一个CNAME
记录指向另一个CNAME
记录是低效且糟糕的风格,尽管它在技术上是可行的。您应该始终直接转到链末尾的规范名称:
@ IN CNAME subdomain.first.com.
www IN CNAME subdomain.first.com.