我有 2 台 ubuntu 服务器,两台上都安装了 bind9。
这是第一个的配置:
options {
directory "/var/cache/bind";
forwarders {
1.1.1.1;
};
dnssec-validation auto;
};
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
};
$TTL 604800
@ IN SOA dns-srv. root.dns-srv. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS dns-srv.
@ IN A 172.16.194.4
www IN A 172.16.194.4
这些是第二个的配置:
options {
directory "/var/cache/bind";
forwarders {
172.16.194.3;
};
dnssec-validation auto;
};
因此第一个 dns 服务器将请求转发到 1.1.1.1,第二个 dns 服务器将请求转发到第一个 dns 服务器 172.16.194.3。
我从第一台服务器上的公共 DNS 查询名称没有遇到任何问题,将查询转发到第二台服务器也没有遇到任何问题。它可以正常工作。使用第二台 DNS 服务器的每个主机都可以查询并获得答复。问题出在第一个 DNS 服务器上定义的区域“example.com”。当第二个 DNS 服务器向第一个 DNS 服务器查询“example.com”时,我收到错误:insecurity proof failed resolving 'example.com/A/IN': 172.16.194.3#53
为什么我会收到此错误?我该怎么做才能使第二个 DNS 服务器解析第一个 DNS 服务器上定义的区域?
两台服务器上的操作系统都是 ubuntu server 20.4,bind 版本是 9.16
答案1
为什么我会收到此错误
因为您正在篡改 DNSSEC 签名的区域。在这种情况下,错误消息是正常的,因为您正在做的事情正是 DNSSEC 应该阻止的事情。
这真实的 example.com
互联网上的区域是经过 DNSSEC 签名的,父com
区域具有指示其签名密钥的 DS 记录(与用于委派的常用 NS 记录一起)。当服务器 2 上的验证解析器找到这些 DS 记录时,它知道它应该接收 example.com 的签名数据,因此它从服务器 1 获取的未签名记录是未经授权的。
(“不存在证明”是指该com
区域对于实际未签名的区域所具有的 NSEC 记录 - NSEC 记录基本上表示“存在恰好这些类型的记录而没有其他类型”,在这种情况下它将用于证明合法未签名的区域没有 DS 记录。)
我必须做什么才能使第二个 DNS 服务器解析第一个 DNS 服务器上定义的区域?
首先,不要使用属于他人的区域名称。使用您自己控制的域名 - 您可以为其发布实际的 NS 授权。
即使由于某种原因你无法将域名委托给服务器#1,仍然要确保它被委托给一些名称服务器(即有 NS 记录),这样解析器就能得到他们想要的 NSEC 答案。委托指向哪里并不重要,验证器只检查 DS 记录,而不检查 NS。
(home.arpa
域名已按此方式设置 - 它专门用于被家庭网关“覆盖”,因此您可以将其用作如何设置自己的可安全覆盖的(子)域的示例。)
最后,如果它必须是一个完全不受你控制的名称(例如,如果你想实际使用example.com
,或者如果你想要创建一个像这样的整个顶级域名.blah
),你可以实际上自己进行 DNSSEC 签名并在解析器中直接将密钥配置为“信任锚”。验证过程会向上进行,直到找到信任锚为止 - 通常它会一直到达根,但 BIND 允许您trust-anchors{}
为所需的任何域进行配置。
一些验证解析器还支持“负信任锚”,允许您手动将某些域配置为从未验证过,但在 BIND 中,这仅作为自动过期设置支持,rndc nta
而不能永久放入配置文件中。