DNS 区域文件返回有关我的 A 记录的错误。绑定9 Ubuntu 22.04

0 domain-name-system bind dns-zone ubuntu-22.04

我正在尝试在 ProxMox 主机上设置访客 ubuntu 22.04 DNS/DHCP 服务器。我运行时的错误信息

我通过 cloudfare 注册了我的域名(“文件中未显示”,当 cloudfare 是我的域名服务器之一时,该域名可以返回积极的挖掘结果”)所以这应该是本地域,直到我可以配置我的互联网面对路由器(奇怪的情况)。

sudo named-checkzone example.local /etc/bind/db.example.local

zone example.local/IN: NS 'ns.example.local' has no address records (A or AAAA)
zone example.local/IN: not loaded due to errors.
Run Code Online (Sandbox Code Playgroud)

我的前向区域文件是:

;
; BIND data file for local loopback interface
;
$TTL    604800
@   IN  SOA ns.example.local. root.example.local. (
                  7     ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL
;Name Server Information
@   IN  NS  ns.example.local.
ns.example.local    IN  A   192.168.4.100
clientlongname.example.local    IN  A   192.168.4.97
client2.example.local   IN  A   192.168.4.98
client3.example.local   IN  A   192.168.4.99
client4.example.local   IN  A   192.168.4.96

Run Code Online (Sandbox Code Playgroud)

当我的反向查找区域文件使用named-checkzone时,它会返回正值。

如果需要的话,下面是我的named.conf.local文件

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
zone "example.local" IN {
    type master;
    file "/etc/bind/db.example.local";
    allow-update { none; };
};
zone "4.168.192.in-addr.arpa" IN {
    type master;
    file "/etc/bind/db.r.example.local";
    allow-update { none; };
};

Run Code Online (Sandbox Code Playgroud)

我尝试在 NS 记录之前删除 @,并将 FQDN 添加到客户端的主机名中。不知道我还能尝试什么,这些该死的记录“看起来”非常简单。

任何的意见都将会有帮助。

谢谢。

Nik*_*nov 5

是的,有一个错误。你所想的记录,

\n
ns.example.local    IN  A   192.168.4.100\n
Run Code Online (Sandbox Code Playgroud)\n

被解释为ns.example.local.example.local相反。要修复此问题,请添加点,使标识符完全限定:

\n
ns.example.local.    IN  A   192.168.4.100\nclientlongname.example.local.    IN  A   192.168.4.97\nclient2.example.local.   IN  A   192.168.4.98\nclient3.example.local.   IN  A   192.168.4.99\nclient4.example.local.   IN  A   192.168.4.96\n\n
Run Code Online (Sandbox Code Playgroud)\n

或利用设置的原点删除后缀:

\n
ns    IN  A   192.168.4.100\nclientlongname    IN  A   192.168.4.97\nclient2   IN  A   192.168.4.98\nclient3   IN  A   192.168.4.99\nclient4   IN  A   192.168.4.96\n
Run Code Online (Sandbox Code Playgroud)\n

或者,通过在区域开头或至少在第一个非合格记录之前将源设置为 DNS 根来同时修复所有记录:

\n
$ORIGIN .\n
Run Code Online (Sandbox Code Playgroud)\n

我更喜欢删除多余的内容,通常选择第二种方式:利用原点。

\n
\n

在 DNS 中,末尾带有点的记录(被视为完全限定标识符)和末尾没有点的记录之间存在区别。

\n

完全合格的内容将立即按原样阅读和解释。例如,单独的点.(DNS 根)和example.com..

\n

非限定标识符根据当前origin进行解析。在区域起始处设置为 BIND 中的区域名称,在您的情况下,example.local对于第一个区域和4.168.192.in-addr.arpa第二个区域。然后,当解析每条记录时,如果存在非限定名称,则附加origin 。这种情况会发生在记录名称(如您的情况ns.example.local)和记录数据中,例如,CNAME、PTR、SOA、NS、MX、SRV 和其他记录中的目标名称。例如,如果在 SOA 之前不更改原点,则记录

\n
@ IN SOA ns root 7 604800 86400 2419200 604800\n
Run Code Online (Sandbox Code Playgroud)\n

将被解释为与您的区域 \xe2\x80\x94 中的当前 SOA 记录完全相同,ns并且root将附加原点。这也是为什么反向区域中的 PTR 记录几乎总是以点结尾的 \xe2\x80\x94 拼写的原因,我们通常不希望它们被解释为诸如 , 之类的名称foo.bar.x.y.z.in-addr.arpa.,而是解释为foo.bar.。您可以随时在区域文件中更改原点,新值将用于所有后续记录,直到再次更改。

\n