我有以下设置:
一个 bind9 实例(下文中称为 L),它位于非常有限的硬件上,用于解析我本地网络上的名称。它是区域 home.mydomain.com 的权威主服务器。对该服务器的查询有效,并将 homedns.home.mydomian.com 返回为 NS,并将其 IP 192.168.1.77 返回为附加记录。
一个 bind9 实例(下文中称为 M)用于解析互联网和本地名称。此处未使用全局转发选项。配置了一个转发区域:
zone "home.mydomain.com" in {
type forward;
forward only;
forwarders { 192.168.1.77; };
};
注 1:mydomain.com 是现有的已注册域名,但没有 home.mydomain.com 的记录
注2:M的bind9版本非常旧:9.8.1-P1
只要互联网连接正常,此设置即可工作,但当连接断开时,本地名称查询将得不到答复。日志是 syslog
Aug 30 09:05:42 M named[1611]: error (no valid DS) resolving 'xxx.home.mydomain.com/A/IN': 192.168.1.77#53
当连接建立后,捕获网络以进行成功解析,结果显示 M 在收到 L 的答复后在互联网上查询 mydomain.com。在 M 发给客户端的答复中,AUTHORITY SECTION 发生了变化:
挖掘到 L:
;; ANSWER SECTION:
syslog.home.mydomain.com. 3600 IN A 192.168.1.99
;; AUTHORITY SECTION:
home.mydomain.com. 3600 IN NS homedns.home.mydomain.com.
;; ADDITIONAL SECTION:
homedns.home.mydomain.com. 3600 IN A 192.168.1.77
挖掘到 M:
;; ANSWER SECTION:
syslog.home.mydomain.com. 2134 IN A 192.168.1.99
;; AUTHORITY SECTION:
net. 171334 IN NS j.gtld-servers.net.
net. 171334 IN NS m.gtld-servers.net.
net. 171334 IN NS i.gtld-servers.net.
net. 171334 IN NS k.gtld-servers.net.
net. 171334 IN NS g.gtld-servers.net.
net. 171334 IN NS e.gtld-servers.net.
net. 171334 IN NS h.gtld-servers.net.
net. 171334 IN NS a.gtld-servers.net.
net. 171334 IN NS d.gtld-servers.net.
net. 171334 IN NS f.gtld-servers.net.
net. 171334 IN NS b.gtld-servers.net.
net. 171334 IN NS c.gtld-servers.net.
net. 171334 IN NS l.gtld-servers.net.
我不明白为什么 M 不直接将 L 的答案返回给客户端,我也没有任何想法,我可以尝试避免向互联网查询转发的区域。
答案1
问题中引用的日志条目表明该错误与没有互联网连接时 DNSSEC 验证失败有关。
请注意错误消息中的“无有效 DS”部分:
Aug 30 09:05:42 M named[1611]: error (no valid DS) resolving 'xxx.home.example.com/A/IN': 192.168.1.77#53
据推测,对于击中该前向区域的查询的答案通常仅被接受,因为公共example.com
区域作为未签名的区域存在(即,有证据证明不存在DS
作为适当区域委派的一部分example.com
),但是当由于没有互联网连接而无法再获取此证明时,答案将不再被接受,因为不再可能验证是否/如何必须签名这些答案。
一个选项是签署home.example.com
区域并添加静态信任锚专门针对这个区域。
另一种方法是选择性地禁用验证;当前 BIND 有一个validate-except
选项允许您指定不应执行验证的域名列表,如下所示:
validate-except
这指定了不应在其上执行 DNSSEC 验证的域名列表,无论这些名称上或上方是否存在信任锚。例如,在配置仅供本地使用的顶级域时可以使用此功能,这样根区域中缺少该域的安全委派不会导致验证失败。(这类似于设置负信任锚,只是它是一种永久性配置,而负信任锚会在设定的时间段后过期并被删除。)
也可以使用以下方法完全禁用验证:dnssec-validation
选项,如果这个 BIND 实例比这个特定的转发有更广泛的用途,我不会推荐这个选项。
(请注意,我已经用替换了问题中使用的域名,example.com
因为该问题似乎不太可能与它引用的域名或拥有该域名的企业有任何关系。)