是否允许设置空的 DNS A 记录?

是否允许设置空的 DNS A 记录?

我正在尝试理解 DNS 上的奇妙世界。

我为 example.com 创建了一个区域文件,其中包含:

@     A    1.2.3.4
*     A    1.2.3.4

但是,我还设置了我的本地 DNS local.example.com,我为其创建了一个单独的区域文件,其中包含以下内容:

machine1     A    192.168.0.1
machine2     A    192.168.0.2

当我挖掘 machine1.local.example.com 时,它返回 A 记录 192.168.0.1,太棒了。

遗憾的是,badmachine.local.example.com 返回 1.2.3.4,local.example.com 也是如此。

我不确定防止这种情况的最佳方法。如果我将以下内容添加到 local.example.com,则上述 2 个示例将返回空的 A 记录,这正是我想要的行为:

@     A
*     A

我希望anything.example.com 使用通配符,但local.example.com 子域中的任何内容除外,除非指定,否则我不想给出响应。本质上我需要一个带有一个排除项的通配符。

这是允许的吗?这是最佳实践吗,还是我做错了?我正在使用带有 BIND 后端的 PowerDNS。

感谢您的想法!

答案1

首先,您对 Chris S 的上述评论澄清了(实际上是修改了)您最初的问题,我希望您能原谅我将其编辑到您最初的问题中。

其次,正如其他人所指出的,不允许出现空记录。

第三,我认为做你想做的事情的方法是声明local.example.com一个适当的子域:

local                       IN      NS      ns1.example.com
local                       IN      NS      ns2.example.com

列出与您当前为 example.com 运行的相同的两个名称服务器(注意:我不知道 PowerDNS,所以上面的条目是 BIND 格式)。然后在这些名称服务器(我假设是这个名称服务器)上,您为 local.example.com 声明一个区域文件,其中仅包含您要解析的主机,而不包含通配符记录。

因此,当人们查找时foo.example.com,假设未列出,它将匹配现有的通配符记录并返回1.2.3.4(或其他)。但是当人们查找时 foo.local.example.com,将返回的名称服务器记录local.example.com,并将进行进一步的递归,您的名称服务器现在查看区域文件local.example.com,并说(在没有 foo 的特定记录的情况下local.example.com 中的通配符)“不,没有这样的记录”。

答案2

确切地知道您想要什么响应会很有用。问题中引用的前两行设置了域的默认响应以及不匹配记录的响应。因此,example.com 将由“@”记录提供服务,而anything-that-doesnt-exist.exmaple.com 将由“*”记录提供服务。它们不是必需的,您可以删除它们。将它们设置为空值是无效的配置(在大多数系统上)。

答案3

我想不出有什么办法“清空”条目。不允许使用空的 A 记录。

也许*.example.com A 1.2.3.4可以防止覆盖 .local.example.com 条目?听起来 PowerDNS 的行为不符合规范。定义 local.example.com 域应该可以防止通配符破坏该域中的任何内容。您可以发布完整的区域文件吗?这将解决一些小问题。

答案4

您应该查看正在运行的服务器的具体行为,因为此功能尚未得到一致实现:

引用 RFC 4592,许多 DNS 实现以不同的方式与通配符的原始定义有所不同。

通配符的实践

您希望通配符条目执行的操作是正确的,因为我理解通配符用法的定义(最好将其视为最后的默认值)。我会尽量抽出时间阅读澄清的 RFC 并在此处更新...

相关内容