我一直在努力理解 BIND9 的 DNS。
我使用了两台机器 A 和 B,它们通过 LAN 连接,并不供全球使用。
A 正在运行一个管理“example”域和名为“www”的 Web 服务器的名称服务器。
B 正在运行一个名称服务器,该名称服务器管理“sub.example”域作为子域,并由 A 委派,并且也管理名为“www”的 Web 服务器。
配置文件如下。
机器 A 上的“named.conf”为“示例”。
options {
directory "C:\dns\etc";
recursion yes;
version "XXX DNS Server 1.0X";
};
logging {
channel my_file {
file "c:\dns\etc\named.run" versions 5 size 1m;
severity debug 0;
print-category yes;
print-severity yes;
print-time yes;
};
category default {my_file;};
category queries {my_file;};
category lame-servers {my_file;};
category config {my_file;};
};
zone "." {
type hint;
file "named.root";
};
zone "localhost" {
type master;
file "localhost/fwd";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost/rev";
allow-update { none; };
};
zone "example" {
type master;
file "example/fwd";
allow-update { none; };
};
zone "72.11.16.172.in-addr.arpa" {
type master;
file "example/rev";
allow-update { none; };
};
机器 A 上的“区域文件”作为“示例”。
$TTL 1H
@ 1H IN SOA example. postmaster.example. (
200508291 ; Serial
15M ; Refresh
5M ; Retry
1D ; Expire
15M) ; TTL
IN NS ns.example.
IN A 172.16.11.72
ns IN A 172.16.11.72
www IN A 172.16.11.72
sub IN NS ns.sub.example.
ns.sub.example. IN A 172.16.10.37
机器 B 上的“named.conf”为“示例”。
options {
directory "C:\dns\etc";
recursion yes;
version "unknown";
allow-transfer {172.16.11.72; };
};
logging {
channel my_file {
file "c:\dns\etc\named.run" versions 5 size 1m;
severity debug 0;
print-category yes;
print-severity yes;
print-time yes;
};
category default {my_file;};
category queries {my_file;};
category lame-servers {my_file;};
category config {my_file;};
};
zone "." {
type hint;
file "named.root";
};
zone "localhost" {
type master;
file "localhost/fwd";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost/rev";
allow-update { none; };
};
zone "sub.example" {
type master;
file "example/fwd";
allow-update { none; };
};
zone "37.10.16.172.in-addr.arpa" {
type master;
file "example/rev";
allow-update { none; };
};
zone "example" {
type forward;
forward only;
forwarders {
172.16.11.72;
};
};
机器 B 上的“sub.example”的“区域文件”。
$TTL 1H
@ 1H IN SOA sub.example. postmaster.sub.example. (
200508291 ; Serial
15M ; Refresh
5M ; Retry
1D ; Expire
15M) ; TTL
IN NS ns.sub.example.
IN A 172.16.10.37
ns IN A 172.16.10.37
www IN A 172.16.10.37
现在我在两台机器上有四台服务器,如下所示。
"ns.example" and "www.example" in machine A.
"ns.sub.example" and "www.sub.example" in machine B.
我可以解析来自 A 的“www.example”和来自 B 的“www.sub.example”。
但是我无法解析来自 A 的“www.sub.example”和来自 B 的“www.example”。
dig 命令显示的消息和写入 BIND 日志的消息位于底部。
A 和 B 都响应“SERVFAIL”或“连接超时;无法访问服务器”,但 BIND 的日志中没有错误消息。
实际上它们是 Windows2008 服务器,我已经更改了 Windows 防火墙过滤器以相互接受 UPD 53 端口。
奇怪的是,防火墙日志 A 和 B 中都没有 DROP 消息,甚至也没有 ALLOW 消息。
我的意思是,如果我从 AI 挖掘“www.example”,可以看到 ALLOW 消息,但如果我挖掘“www.sub.exaple”,我看不到 ALLOW 和 DROP 消息。
我想我必须将此问题归类为由 BIND 引起或由 Windows 防火墙引起。
我首先要做什么?
例如,我猜想 DNS 查询无法发送到名称服务器的另一台机器。这就是 dig 显示“无法访问任何服务器”消息的原因。
我如何检查 DNS 查询是否已发送以及未发送的原因?
在机器 A 处挖掘。
C:\dns\bin>dig www.sub.example
; <<>> DiG 9.9.2-P1 <<>> www.sub.example
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 1777
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.sub.example. IN A
;; Query time: 0 msec
;; SERVER: 172.16.11.72#53(172.16.11.72)
;; WHEN: Wed Mar 13 08:42:04 2013
;; MSG SIZE rcvd: 44
C:\dns\bin>dig @172.16.10.37 www.sub.example. a
; <<>> DiG 9.9.2-P1 <<>> @172.16.10.37 www.sub.example. a
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
在机器 B 处挖掘。
C:\dns\bin>dig www.example
; <<>> DiG 9.9.2-P1 <<>> www.example
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 39790
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.example. IN A
;; Query time: 4015 msec
;; SERVER: 172.16.10.37#53(172.16.10.37)
;; WHEN: Wed Mar 13 09:40:31 2013
;; MSG SIZE rcvd: 40
C:\dns\bin>dig @172.16.11.72 www.example. a
; <<>> DiG 9.9.2-P1 <<>> @172.16.11.72 www.example
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
BIND 的日志在 A。
13-Mar-2013 14:43:22.624 general: info: managed-keys-zone: loaded serial 0
13-Mar-2013 14:43:22.624 general: info: zone 72.11.16.172.in-addr.arpa/IN: loaded serial 200508291
13-Mar-2013 14:43:22.624 general: info: zone 0.0.127.in-addr.arpa/IN: loaded serial 200508291
13-Mar-2013 14:43:22.624 general: info: zone example/IN: loaded serial 200508291
13-Mar-2013 14:43:22.624 general: info: zone localhost/IN: loaded serial 200508291
13-Mar-2013 14:43:22.624 general: notice: all zones loaded
13-Mar-2013 14:43:22.624 general: notice: running
13-Mar-2013 14:43:22.624 notify: info: zone example/IN: sending notifies (serial 200508291)
13-Mar-2013 14:43:22.624 notify: info: zone 72.11.16.172.in-addr.arpa/IN: sending notifies (serial 200508291)
13-Mar-2013 14:44:34.515 queries: info: client 172.16.11.72#58221 (www.sub.example): query: www.sub.example IN A +E (172.16.11.72)
13-Mar-2013 14:44:39.515 queries: info: client 172.16.11.72#58221 (www.sub.example): query: www.sub.example IN A +E (172.16.11.72)
13-Mar-2013 14:44:44.515 queries: info: client 172.16.11.72#58221 (www.sub.example): query: www.sub.example IN A +E (172.16.11.72)
BIND 在 B 处的日志
13-Mar-2013 14:38:27.281 general: info: managed-keys-zone: loaded serial 0
13-Mar-2013 14:38:27.281 general: info: zone 0.0.127.in-addr.arpa/IN: loaded serial 200508291
13-Mar-2013 14:38:27.281 general: info: zone 37.10.16.172.in-addr.arpa/IN: loaded serial 200508291
13-Mar-2013 14:38:27.281 general: info: zone sub.example/IN: loaded serial 200508291
13-Mar-2013 14:38:27.281 general: info: zone localhost/IN: loaded serial 200508291
13-Mar-2013 14:38:27.296 general: notice: all zones loaded
13-Mar-2013 14:38:27.296 general: notice: running
13-Mar-2013 14:38:27.296 notify: info: zone sub.example/IN: sending notifies (serial 200508291)
13-Mar-2013 14:38:27.296 notify: info: zone 37.10.16.172.in-addr.arpa/IN: sending notifies (serial 200508291)
13-Mar-2013 14:46:08.984 queries: info: client 172.16.10.37#58326 (www.sub.example): query: www.sub.example IN A +E (172.16.10.37)
13-Mar-2013 14:46:11.250 queries: info: client 172.16.10.37#58330 (www.example): query: www.example IN A +E (172.16.10.37)
13-Mar-2013 14:46:17.250 queries: info: client 172.16.10.37#58330 (www.example): query: www.example IN A +E (172.16.10.37)
答案1
有几件事我可以提出建议。
首先,您在失败的挖掘中得到的返回代码是 SERVFAIL。这可能有多种原因,但您首先要排除的是某些东西阻止了机器之间的名称查询。我知道您说您已经关闭了端口 53 UDP 的 Windows 防火墙规则,但我建议您(至少向自己)演示机器 B 可以执行“dig @machine-a www.example. a”并得到您期望的答案。然后检查机器 A 是否可以查询机器 B 上的服务器。
除此之外,查看您的 named.conf 和命名正在记录的任何消息将非常有帮助。向我们显示 named.conf 将使我们能够检查您的区域是否正确指定(区域文件中的大多数 RR 都与区域原点相关,因此查看区域的加载方式很重要,这样我们才能知道原点到底是什么......)并将帮助我们确定其中一台或两台机器是否应该执行递归。
请提供更多信息;这将使我们更容易确定发生了什么。
编辑:
您提供的 dig 输出确实听起来像服务器没有接收来自其他机器的请求:
; <<>> DiG 9.9.2-P1 <<>> @172.16.10.37 www.sub.example. a
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
和
; <<>> DiG 9.9.2-P1 <<>> @172.16.11.72 www.example
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
这看上去很重要,你不觉得吗?
答案2
假设两个域名都没有正确注册,因为您说它们不用于“全球使用”,我会说您的服务器彼此不认识,并且它们也没有有关域名和子域名的信息。
您必须在 A 上创建一个委托子句,以告知 DNS 的位置sub.example
。并在 B 上创建一个转发子句,以将查询重定向到example
。