检查 DNS 区域中资源记录的有效性

检查 DNS 区域中资源记录的有效性

我正在使用 perl 执行一些 DNS 操作任务。

我在用国家发展部作为我的 DNS 服务器。

我想弄清楚检查 DNS 区域文件中所有资源记录的名称是否有效的最佳方法是什么。

似乎有几种可能性(我能想到的)可以进行检查:

  1. nsd-检查区
  2. 已制作的 Perl 模块https://metacpan.org/pod/Data::Validate::Domain
  3. 通过了解所有描述有效名称和无效名称的 RFC,在 perl 中手动进行检查。

在我看来,主要问题出现在资源记录的特殊名称受到质疑时。

例如:我在网上看到可以使用 * 作为资源记录的名称:

*                IN A      192.168.150.144

这应该意味着如果没有其他记录匹配则返回此记录。

我还看到了一些资源记录的“特殊”名称(在反向 DNS 区域中),例如RFC:

   192/26          NS      ns.C.domain.
   192/26          NS      some.other.third.name.server.
   0/25            NS      ns.A.domain.
   0/25            NS      some.other.name.server.

我还有一个问题:

  • 在哪里可以查看正向和反向 DNS 区域中允许的所有这些资源记录的特殊名称及其含义?(因为我想知道它们全部:))

答案1

我认为区域文件作为文本文件来操作很麻烦...

对于初学者:

每个 RR应该看起来像 name ttl record_class record_type record_data但 :

  • name可以省略,然后该记录会继承前一条记录的字段。
  • ttl可以省略,并将成为$TTL
  • record_class通常也会被省略,因为几乎没有人使用默认设置以外的任何设置IN

而这只是问题的开始。


尤其是如果您的区域是手工维护的,那么区分速记和拼写错误以及行业中非常狡猾的技巧会非常困难,这会使条目(甚至更加)依赖于上下文。当例如 $ 指令发挥作用时,您的解析困难可能会更加严重。

当然,区域文件与有效语法经确认,nsd-checkzonenamed-checkzone 和资源记录在语义上有效,并且按预期工作

一个相当典型的例子是 example.com 区域中的 CNAME 记录

www IN CNAME www.example.net

这是有效的,但由于没有尾随点,www.example.net因此不是 FQDN 和区域文件的简写。将附加 $ORIGIN 的值,默认情况下变为:

www IN CNAME www.example.net.example.com.

那不是总是情况并非如此。
人们有时会明确地使用 $ORIGIN 的隐式值,或者按照惯例明确地将 $ORIGIN 设置为区域名称,而不是使用 $ORIGIN 的隐式值,或者按照惯例明确地将 $ORIGIN 设置为区域名称。将 $ORIGIN 定义为仅一个.

再次以 example.com 区域中的 CNAME 记录为例

$ORIGIN .

www IN CNAME www.example.net

然后当附加 $ORIGIN 的值时,其变为:

www IN CNAME www.example.net.

本问答是 MX 记录的位置导致语法有效但电子邮件损坏的一个例子。

我的这个答案是一个糟糕的想法但却是有效语法的例子,其中资源记录的上下文取决于区域文件中的确切位置,并且速记的效果将由于重复使用/滥用 $ORIGIN $ 指令而改变。

相关内容