![当同一台服务器上的两个 DNS 区域相交时会发生什么?](https://linux22.com/image/676442/%E5%BD%93%E5%90%8C%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84%E4%B8%A4%E4%B8%AA%20DNS%20%E5%8C%BA%E5%9F%9F%E7%9B%B8%E4%BA%A4%E6%97%B6%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我有一个 DNS 区域 example.com,其中的记录类型A
定义为foo.example.com
。在同一台服务器上,我还有另一个名为 的区域foo.example.com
,未定义 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。
答案1
当权威名称服务器上定义了重叠区域时,最具体的区域用于提供答案。
- 的查询
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描述了您的场景的正确行为:
此类服务器对某个区域中不属于其他区域的所有资源记录具有权威性。指示区域划分的 NS 记录是所创建子区域的属性,该子区域或其任何子域的来源的任何其他记录也是如此。某个区域的服务器不应返回与另一个区域中的名称相关的查询的权威性答案,该区域包括区域划分处的 NS 记录,也许还有 A 记录,除非它恰好也是其他区域的服务器。
除了下面立即提到的 DNSSEC 情况之外,服务器应该忽略 NS 记录以外的数据,以及定位 NS 记录中列出的服务器所需的 A 记录,这些数据可能恰好在区域切割时在区域中配置。
至于哪种做法最好,完全取决于您。您可以将所有记录放在一个区域中,或者如果更方便的话,为子域拆分单独的区域文件。(例如,由于每个子域包含数百条记录)我要提醒的一件事(不是很明显)是,验证工具通常named-checkzone
无法识别位于同一台服务器上的子区域,如果父区域包含对子区域内记录的引用,则可能会生成不正确的警告。(例如,CNAME 别名)