设置
我有一个容器化的命名服务,它通过以下容器文件获得了自己的 IP
FROM alpine:latest
RUN apk --no-cache add bind bind-tools bind-dnssec-tools bind-dnssec-root
COPY --chmod=500 --chown=root:root init.sh /usr/sbin/init
COPY --chmod=444 --chown=root:root bindetc/named.conf /etc/bind/named.conf
RUN chmod 770 /var/bind
RUN chown root:named /var/bind
COPY --chmod=440 --chown=root:named bindetc/direct.db /var/bind/direct.db
COPY --chmod=440 --chown=root:named bindetc/reverse.db /var/bind/reverse.db
VOLUME "/var/bind"
EXPOSE 53/tcp 53/udp
CMD /usr/sbin/named -f -g -u named
我混合了权威服务器和递归服务器,配置如下
bindetec/named.conf
acl LAN {
192.168.0.0/24;
}
options {
directory "/var/bind";
allow-recursion {
192.168.0.0/24;
127.0.0.1/32; // localhost
};
forwarders {
1.1.1.1; // Cloudflare
208.67.222.222; // OpenDNS
};
listen-on { 192.168.0.136; 127.0.0.1; };
listen-on-v6 { none; };
allow-transfer port 53 { 192.168.0.136; 0.0.0.0; };
allow-query { localhost; LAN; };
recursion yes;
pid-file "/var/run/named/named.pid";
dump-file "/var/bind/data/cache_dump.db";
statistics-file "/var/bind/data/named_stats.txt";
memstatistics-file "/var/bind/data/named_mem_stats.txt";
};
zone "." IN {
type master;
file "/var/bind/direct.db";
allow-update { none; };
};
zone "in-addr.arpa" IN {
type master;
file "/var/bind/reverse.db";
allow-update { none; };
};
具有以下内容bindetc/direct.db
:
$TTL 3600
$ORIGIN intranet.domain.
@ IN SOA ns1.intranet.domain. postmaster.intranet.domain. (909090 9000 900 604800 1800)
@ IN NS ns1.intranet.domain.
ns1 IN A 192.168.0.136
以及以下内容bindetc/reverse.db
:
$TTL 604800
@ IN SOA ns1.intranet.domain. postmaster.intranet.domain. (909090 9000 900 604800 1800)
@ IN NS ns1.intranet.domain.
136.0.168.192 IN PTR ns1.intranet.domain.
容器的IP是192.168.0.136
。
问题
当尝试解析任何公共 DNS 记录时,例如,google.com
它会给出如下所示的基本空响应,而不是询问 Cloudflare 或 OpenDNS 此类 DNS 记录的 IP 是什么。
; <<>> DiG 9.16.44 <<>> google.com @192.168.0.136
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 27326
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 1f5514b62f24a19b0100000065ed3501a3ae047abe73afef (good)
;; QUESTION SECTION:
;google.com. IN A
;; Query time: 48 msec
;; SERVER: 192.168.0.136#53(192.168.0.136)
;; WHEN: Sat Mar 09 22:20:17 CST 2024
;; MSG SIZE rcvd: 67
答案1
该dig
命令表明您的 BIND 正在响应SERVFAIL
错误代码,因此它可能认为您的配置存在致命错误。您确实应该查看 BIND 生成的日志消息。
您的区域声明zone "." IN
指定您的 BINDtype master
用于 DNS 根区域,因此您实际上是在告诉 BIND 它已经知道现有的所有顶级域。那么,当它已经知道不存在“.com”这样的顶级域名时,为什么还要向其他人询问“google.com”呢?
除非您确实想为自己声明一个单独的 DNS 世界,或者实际上正在维护根名称服务器,否则您永远不应该将您的名称服务器配置为master
of zone "."
。
根区域的更正常声明可能是:
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/usr/share/dns/root.hints";
};
其中/usr/share/dns/root.hints
是根 DNS 服务器的标准列表,可在https://www.internic.net/domain/named.cache。启动时,BIND 将使用此列表联系根名称服务器之一,以获得同一列表的绝对最新版本。
因为您计划使用转发器,所以您也可以完全省略它:如果您不指定,BIND 将使用其内置的根 DNS 服务器列表。 of只是一种在内置列表过时时替换它的方法zone "."
。type hint
由于您的 BIND 应该向转发器发送对它不具有权威性的任何区域的查询,因此您不需要关心 BIND 是否具有最新的根名称服务器列表。
如果您不希望 BIND 在转发器没有响应的情况下开始尝试自行联系其他名称服务器,您可能需要将该行添加到您的配置段forward only;
中。options{ ... };
您应该将您的intranet.domain
前区声明为:
zone "intranet.domain" IN {
type master;
file "/var/bind/direct.db";
allow-update { none; };
};
既然你有allow-query { localhost; LAN; };
,你可能也应该acl LAN { ... };
在某个地方有一个块。