一年前我完美地设置了bind9,但忽略了准确记录我所做的事情,现在有些事情发生了变化,我正在努力修复它。该问题首先从 DHCP 客户端显现出来,这些客户端现在无法解析 LAN 上的 DHCP/NS 主机。
检查我的绑定配置会named-checkzone
出现错误:
adam@gondolin:~$ sudo named-checkzone 192.168.0 /var/cache/bind/db.192.168.0
/var/cache/bind/db.192.168.0:2: SOA record not at top of zone (0.168.192.in-addr.arpa.192.168.0)
zone 192.168.0/IN: loading from master file /var/cache/bind/db.192.168.0 failed: not at top of zone
zone 192.168.0/IN: not loaded due to errors.
当然named
也不加载区域。
这是区域文件:
adam@gondolin:~$ sudo cat /var/cache/bind/db.192.168.0
$TTL 86400
0.168.192.in-addr.arpa IN SOA localdomain. root.localdomain. (
1123 ; serial
604800 ; refresh (1 week)
86400 ; retry (1 day)
2419200 ; expire (4 weeks)
86400 ; minimum (1 day)
)
NS gondolin.localdomain.
$ORIGIN 0.168.192.in-addr.arpa.
adam@gondolin:~$
我唯一的其他区域文件给出了相同的结果:
adam@gondolin:~$ sudo cat /var/cache/bind/db.localdomain
$TTL 86400
localdomain IN SOA localdomain. root.localdomain. (
1650 ; serial
604800 ; refresh (1 week)
86400 ; retry (1 day)
2419200 ; expire (4 weeks)
86400 ; minimum (1 day)
)
NS gondolin.localdomain.
$ORIGIN localdomain.
adam@gondolin:~$
这是绑定配置:
adam@gondolin:~$ cat /etc/bind/named.conf.options
acl goodclients {
localhost;
localnets;
};
options {
listen-on {
192.168.0.3;
127.0.0.1;
};
listen-on-v6 {
fe80::2a37:37ff:fe03:4225/64;
::1;
#any;
};
directory "/var/cache/bind";
forwarders {
208.67.220.220;
208.67.222.222;
};
allow-query {
goodclients;
};
allow-recursion {
goodclients;
};
allow-transfer {
goodclients;
};
dnssec-enable no;
#dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
};
adam@gondolin:~$
和区域:
adam@gondolin:~$ cat /etc/bind/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";
include "/etc/bind/rndc.key";
zone "localdomain" {
type master;
notify no;
file "/var/cache/bind/db.localdomain";
allow-update {
key "rndc-key";
};
};
zone "0.168.192.in-addr.arpa" {
type master;
notify no;
file "/var/cache/bind/db.192.168.0";
allow-update {
key "rndc-key";
};
};
adam@gondolin:~$
我不太确定这里还有哪些相关的配置,所以我将展示我能想到的所有内容。
adam@gondolin:~$ cat /etc/hostname
gondolin
adam@gondolin:~$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain gondolin
127.0.1.1 gondolin
192.168.0.3 gondolin.localdomain gondolin
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
resolv.conf
可能是一个担心:
adam@gondolin:~$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 192.168.0.3
domain localdomain
search localdomain
adam@gondolin:~$
我认为该systemd-resolve
消息无关紧要,但执行状态显示了这一点:
adam@gondolin:~$ sudo systemd-resolve --status
Failed to get global data: Unit dbus-org.freedesktop.resolve1.service not found.
在主机上运行简单的查找:
adam@gondolin:~$ dig gondolin
; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> gondolin
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 58942
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 083d35c6e1daa489584481225d74b44000978776cbc340e9 (good)
;; QUESTION SECTION:
;gondolin. IN A
;; AUTHORITY SECTION:
. 3600 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2019090800 1800 900 604800 86400
;; Query time: 7 msec
;; SERVER: 192.168.0.3#53(192.168.0.3)
;; WHEN: Sun Sep 08 08:56:48 BST 2019
;; MSG SIZE rcvd: 140
adam@gondolin:~$
答案1
使用此区域配置:
zone "0.168.192.in-addr.arpa" {
type master;
notify no;
file "/var/cache/bind/db.192.168.0";
区域文件的开头如下所示:
$TTL 86400
0.168.192.in-addr.arpa IN SOA localdomain. root.localdomain. (
SOA 记录实际上指的是一个命名0.168.192.in-addr.arpa.0.168.192.in-addr.arpa.
明显不正确的区域。
你可能会问这是为什么?
因为你错过了一个句号。
在区域文件中,任何不以句号 ( ) 结尾的域名都会自动附加.
区域。$ORIGIN
如果您没有明确指定$ORIGIN
,则它是配置语句中的区域名称zone
...但在配置语句中,假定末尾有句号。在区域文件中,需要时必须明确指定。
一旦您意识到这一点,错误消息就应该有意义了:BIND 希望看到指向与配置行相同的域名的 SOA 记录zone
。
SOA 记录的第一行应如下所示(如果不使用@
):
0.168.192.in-addr.arpa. IN SOA localdomain. root.localdomain. (
0.168.192.in-addr.arpa 末尾的句号.
在这里非常重要。
你的localdomain
区也有同样的问题。它应该是:
localdomain. IN SOA localdomain. root.localdomain. (
答案2
在关于这个主题的大量不同网页中,我终于找到了这个,它解释了内容和原因,并给出了解决方案:
ftp://ftp.iitb.ac.in/LDP/en/DNS-HOWTO/DNS-HOWTO-5.html
我在上面的配置中的错误是在区域文件中,我需要在名称服务器中正确声明名称服务器 - 上面的配置有太多不必要的东西。这个有效,或者至少满足named-checkzone
:
$TTL 3D
@ IN SOA gondolin.localdomain. root.gondolin.localdomain. (
201909091 ; serial
8H ; refresh (8 hours)
2H ; retry (2 hours)
4W ; expire (4 weeks)
1D ; minimum (1 day)
)
NS gondolin
gondolin A 192.168.0.3