bind9 不安全证明解析失败

bind9 不安全证明解析失败

我有 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而不能永久放入配置文件中。

相关内容