我正在使用 perl 执行一些 DNS 操作任务。
我在用国家发展部作为我的 DNS 服务器。
我想弄清楚检查 DNS 区域文件中所有资源记录的名称是否有效的最佳方法是什么。
似乎有几种可能性(我能想到的)可以进行检查:
- nsd-检查区
- 已制作的 Perl 模块https://metacpan.org/pod/Data::Validate::Domain
- 通过了解所有描述有效名称和无效名称的 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-checkzone
或named-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 $ 指令而改变。