我正在尝试理解 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 并在此处更新...