详细说明如何在 CentOS 7 上配置 BIND9 扮演这四种不同的 DNS 角色,包括配置文件示例和注意事项。
BIND9 可以扮演 DNS 体系中的多种角色:
权威DNS服务器 (Authoritative DNS Server): 存储特定域名(例如 example.com)的官方DNS记录。当其他DNS服务器或客户端查询这个域名的信息时,权威服务器会给出最终的、官方的答案。
递归DNS服务器 (Recursive DNS Server / Resolver): 代表客户端(如你的电脑)向其他DNS服务器发起查询,直到找到最终答案,然后将结果返回给客户端并缓存起来以备后续使用。ISP 通常会提供递归DNS服务器。
缓存DNS服务器 (Caching DNS Server): 递归服务器通常也扮演缓存服务器的角色,它会缓存查询过的记录,以加快后续相同查询的响应速度并减少网络流量。
转发DNS服务器 (Forwarding DNS Server): 将所有收到的查询请求转发给指定的其他DNS服务器处理,自身不进行递归查询。
通用前提和注意事项 (适用于所有角色):
-
安装 BIND:
bashsudo yum install -y bind bind-utils
-
主配置文件:
/etc/named.conf
-
区域定义文件 (通常):
/etc/named.rfc1912.zones
(被/etc/named.conf
包含) -
区域数据文件目录:
/var/named/
-
服务管理:
bashsudo systemctl start named sudo systemctl enable named sudo systemctl status named sudo systemctl restart named sudo systemctl reload named
-
配置文件检查:
bashsudo named-checkconf /etc/named.conf sudo named-checkzone <zone_name> /var/named/<zone_file>
-
防火墙: 确保 UDP 和 TCP 端口 53 对相应的客户端开放。
bashsudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
-
SELinux: 如果遇到权限问题,检查 SELinux 日志 (
sudo ausearch -m avc -ts recent
)。可能需要调整布尔值或文件上下文。 -
日志: 关注
/var/log/messages
或通过journalctl -u named -f
查看named
的日志输出。 -
rndc
: 确保rndc
(远程名称守护进程控制) 配置正确,以便管理named
服务而无需完全重启。通常 CentOS 7 默认配置是可用的。
角色 1: 权威DNS服务器 (Authoritative DNS Server)
目的: 存储特定域名(例如 example.com
)的官方DNS记录,并对这些记录的查询提供权威答案。它不为其他域名提供递归查询。
配置文件 (/etc/named.conf
- options
部分):
conf
options {
listen-on port 53 { 127.0.0.1; <your_server_ip>; }; // 监听本地和服务器的IP
listen-on-v6 port 53 { ::1; }; // 可选,如果不需要IPv6设为 none
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; }; // 权威服务器通常允许任何人查询其权威数据
// 如果是内部权威服务器,可以限制为内部网络
recursion no; // **关键:权威服务器不应提供递归查询**
allow-recursion { none; }; // 明确禁止递归
// 可选:限制区域传送给从服务器
// allow-transfer { <ip_of_slave1>; <ip_of_slave2>; };
dnssec-enable yes; // 推荐开启DNSSEC
dnssec-validation yes; // 如果也做验证的话 (通常权威服务器不直接验证)
// 对于纯权威服务器,dnssec-validation 可以是 no,
// 但如果它也需要解析其他域(例如,查找NS记录的胶水记录),则可能需要。
// 更安全的做法是让递归解析器处理验证。
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
// 包含区域定义文件
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key"; // 即使是权威服务器,也可能需要根提示来解析NS记录的A记录(胶水)
区域定义 (/etc/named.rfc1912.zones
):
conf
zone "example.com" IN {
type master;
file "db.example.com"; // 区域文件名,位于 /var/named/
allow-update { none; }; // 通常禁止动态更新,除非有特定需求
// also-notify { <ip_of_slave1>; }; // 如果有从服务器,通知它们更新
};
// 示例反向区域 (如果需要)
zone "1.168.192.in-addr.arpa" IN { // 对应 192.168.1.0/24
type master;
file "db.192.168.1";
allow-update { none; };
};
区域文件 (/var/named/db.example.com
):
zone
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2023072101 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
IN NS ns1.example.com.
IN NS ns2.example.com. ; 如果有第二个NS
ns1 IN A <ip_of_ns1>
ns2 IN A <ip_of_ns2>
@ IN A <ip_of_example.com_website>
www IN A <ip_of_www.example.com_website>
mail IN MX 10 mailserver.example.com.
mailserver IN A <ip_of_mailserver>
(反向区域文件 db.192.168.1
类似,包含 PTR 记录)
注意事项:
recursion no;
是最重要的设置,防止服务器被滥用于DDoS放大攻击。allow-query { any; };
允许互联网上的任何人查询你权威的区域数据。如果这是内部权威服务器,应限制为内部网络。allow-transfer
应严格限制为你的从服务器IP地址。- SOA 记录中的序列号在每次修改区域文件后必须增加。
- 确保你的域名注册商处将你的NS记录指向此服务器的IP。
角色 2: 递归DNS服务器 (Recursive DNS Server / Resolver)
目的: 代表客户端(如你的电脑或内部网络中的其他服务器)向其他DNS服务器发起查询,直到找到最终答案,然后将结果返回给客户端并缓存。
配置文件 (/etc/named.conf
- options
部分):
conf
options {
listen-on port 53 { 127.0.0.1; <your_lan_ip>; }; // 监听本地和局域网接口
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; <your_lan_network>/<prefix>; }; // **关键:限制谁可以查询**
// 例如: 192.168.1.0/24;
recursion yes; // **关键:启用递归**
allow-recursion { localhost; <your_lan_network>/<prefix>; }; // **关键:限制谁可以使用递归服务**
// 可选:配置转发器 (如果不想直接查询根服务器)
// forwarders {
// 8.8.8.8; // Google Public DNS
// 1.1.1.1; // Cloudflare DNS
// };
// forward only; // 如果设置了 forwarders,是只转发还是先转发再自己递归
dnssec-enable yes; // 启用DNSSEC支持
dnssec-validation auto; // **关键:自动进行DNSSEC验证 (BIND 9.11+ 推荐)**
// 或 dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic"; // 用于存储DNSSEC信任锚
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
// 可以添加更详细的日志,例如查询日志 (用于调试,会产生大量日志)
// channel query_log {
// file "data/query.log" versions 3 size 5m;
// print-time yes;
// severity info;
// };
// category queries { query_log; };
};
// 递归服务器需要根提示文件来知道从哪里开始解析
zone "." IN {
type hint;
file "named.ca"; // 这是根服务器列表文件,通常随BIND一起提供
};
// 通常递归服务器不定义其他 master 或 slave 区域,除非它也扮演权威角色
// include "/etc/named.rfc1912.zones"; // 如果也做权威,则包含
include "/etc/named.root.key";
根提示文件 (/var/named/named.ca
):
这个文件通常在安装 bind
包时会自动创建或链接。如果需要手动获取或更新,可以从 IANA (Internet Assigned Numbers Authority) 或 ISC (Internet Systems Consortium) 下载。
bash
# 通常不需要手动操作,但如果需要:
# wget -O /var/named/named.ca https://www.internic.net/domain/named.root
# sudo chown named:named /var/named/named.ca
注意事项:
allow-query
和allow-recursion
必须严格限制为你的内部网络或受信任的客户端。开放的递归解析器是DDoS放大攻击的主要目标。recursion yes;
是必须的。dnssec-validation auto;
(或yes
) 非常重要,以确保解析结果的安全性。- 确保
named.ca
文件存在且正确。 - 递归服务器通常不需要定义自己的
master
或slave
区域,除非它也扮演权威角色(例如,为内部域名提供权威服务,同时为内部客户端提供外部递归)。

角色 3: 缓存DNS服务器 (Caching DNS Server)
目的: 基本上与递归DNS服务器相同。它接收客户端查询,进行递归查找,并将结果缓存起来以加速后续相同查询。"缓存DNS服务器" 通常就是指 "递归DNS服务器"。
配置: 与递归DNS服务器的配置完全相同。
递归的过程自然包含了缓存。当递归服务器为客户端解析一个域名时,它会缓存解析路径上的所有相关记录(A, NS, CNAME 等),以及最终的答案。下次有相同查询时,如果缓存未过期,它会直接从缓存中提供答案。
注意事项: 同递归DNS服务器。
角色 4: 转发DNS服务器 (Forwarding DNS Server)
目的: 将所有收到的DNS查询请求转发给一个或多个指定的上游DNS服务器处理,自身不进行完整的递归查询。它仍然会缓存从上游服务器获取的结果。
配置文件 (/etc/named.conf
- options
部分):
conf
options {
listen-on port 53 { 127.0.0.1; <your_lan_ip>; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; <your_lan_network>/<prefix>; }; // 限制谁可以查询
recursion yes; // **需要启用递归,以便能够转发**
allow-recursion { localhost; <your_lan_network>/<prefix>; }; // 限制谁可以使用此转发服务
forwarders { // **关键:指定上游DNS服务器**
<ip_of_upstream_dns1>; // 例如 8.8.8.8;
<ip_of_upstream_dns2>; // 例如 1.1.1.1;
};
forward only; // **关键:设置为 'only' 表示只转发,不自行递归**
// 如果设置为 'first',则先尝试转发,失败后再自行递归 (需要根提示)
dnssec-enable yes;
dnssec-validation auto; // 如果上游服务器支持并返回DNSSEC数据,此服务器可以验证
// 如果上游服务器自己做验证,这里可以设为 no,但 auto 更安全
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
// 如果 forward only,则不需要根提示文件。
// 如果 forward first,则需要根提示文件。
// zone "." IN {
// type hint;
// file "named.ca";
// };
// 通常转发服务器不定义其他 master 或 slave 区域
// include "/etc/named.rfc1912.zones";
include "/etc/named.root.key"; // 即使是 forward only,也建议保留,以备将来更改
注意事项:
forwarders { ... };
列表指定了将查询转发到的DNS服务器。forward only;
确保服务器只进行转发。如果希望在转发失败时尝试自己递归,则使用forward first;
(此时需要named.ca
文件)。allow-query
和allow-recursion
仍然需要严格限制。- 即使是转发服务器,它也会缓存从上游服务器获取的响应。
- 选择可靠且快速的上游DNS服务器很重要。
混合角色:
BIND9 服务器可以同时扮演多种角色。例如:
- 权威服务器 + 递归/缓存服务器:
- 为自己的域名 (
example.com
) 提供权威应答。 - 为内部网络客户端提供对外部域名的递归查询和缓存。
- 配置:
options
部分设置recursion yes;
和allow-recursion { <internal_network>; };
。- 定义自己的
master
区域 (如example.com
)。 - 包含根提示
zone "." IN { type hint; file "named.ca"; };
。
- 为自己的域名 (
总结关键点:
- 权威服务器:
recursion no;
, 定义master
区域。 - 递归/缓存服务器:
recursion yes;
,allow-recursion
严格限制, 需要named.ca
。 - 转发服务器:
recursion yes;
,forwarders { ... };
,forward only;
(或first
),allow-recursion
严格限制。
在配置任何角色时,安全性(特别是限制查询和递归来源)和正确的区域文件(对于权威服务器)是首要考虑的。务必在更改配置后使用 named-checkconf
和 named-checkzone
进行检查,并仔细查看日志。