我有一个 example.com 的 DNS 区域,其中包含A
为foo.example.com
. 在同一台服务器上,我有另一个名为foo.example.com
with 的区域,并且在该区域的顶部没有定义 A 记录。如果我的服务器收到对 的查询foo.example.com
,它会返回example.com
区域中定义的记录吗?(或者搜索算法会在到达更具体的区域后停止,然后回答“未找到”吗?)
一个类似的问题:
如果我具备以上所有条件,然后在区域 ( )A
顶部设置一条指向不同 IP 地址的记录,将返回哪个地址?foo.example.com
@
例子.com
foo.example.com. 3600 IN A <location A>
foo.example.com
@ 3600 IN A <location B>
显然你不需要两者 - 我正在梳理 DNS 的行为。但是有一个标准的方法来解决这个问题 - 一个标准的地方吗?
我正在使用 BIND。
在权威名称服务器上定义重叠区域时,将使用最具体的区域来提供答案。
example.com. IN A?
命中example.com
区域的查询。foo.example.com. IN A?
命中foo.example.com
区域的查询。如果foo.example.com
在example.com
区域中定义,它将被忽略。sub.foo.example.com. IN A?
命中foo.example.com
区域,因为它比请求更具体example.com
。在您的具体示例中,查询的返回值将是
NXDOMAIN
因为该foo.example.com
区域没有为自身提供 A 记录定义。使用 DNS 术语,在父区域和更具体的区域之间的边界处有效地切割了一个区域。RFC2181 §6.1描述了您的场景的正确行为:
至于哪个是最佳实践,这完全取决于您。您可以将所有记录放在一个区域中,或者为您的子域拆分单独的区域文件,如果这样更方便的话。(例如,由于它们每个都包含数百条记录)我要警告的一件事并不是很明显,那就是验证工具
named-checkzone
通常不知道位于同一服务器上的子区域,并且如果父级可能会生成不正确的警告zone 包括对子区域内记录的引用。(例如,CNAME 别名)