详细说明如何在 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服务器处理,自身不进行递归查询。
通用前提和注意事项 (适用于所有角色):
sudo yum install -y bind bind-utils
/etc/named.conf
/etc/named.rfc1912.zones
(被 /etc/named.conf
包含)/var/named/
sudo systemctl start named
sudo systemctl enable named
sudo systemctl status named
sudo systemctl restart named
sudo systemctl reload named
sudo named-checkconf /etc/named.conf
sudo named-checkzone <zone_name> /var/named/<zone_file>
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload
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
部分):
options {
listen-on port 53 { 127.0.0.1; ; }; // 监听本地和服务器的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 { ; ; };
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
):
zone "example.com" IN {
type master;
file "db.example.com"; // 区域文件名,位于 /var/named/
allow-update { none; }; // 通常禁止动态更新,除非有特定需求
// also-notify { ; }; // 如果有从服务器,通知它们更新
};
// 示例反向区域 (如果需要)
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
):
$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
ns2 IN A
@ IN A
www IN A
mail IN MX 10 mailserver.example.com.
mailserver IN A
(反向区域文件 db.192.168.1
类似,包含 PTR 记录)
注意事项:
recursion no;
是最重要的设置,防止服务器被滥用于DDoS放大攻击。allow-query { any; };
允许互联网上的任何人查询你权威的区域数据。如果这是内部权威服务器,应限制为内部网络。allow-transfer
应严格限制为你的从服务器IP地址。角色 2: 递归DNS服务器 (Recursive DNS Server / Resolver)
目的: 代表客户端(如你的电脑或内部网络中的其他服务器)向其他DNS服务器发起查询,直到找到最终答案,然后将结果返回给客户端并缓存。
配置文件 (/etc/named.conf
- options
部分):
options {
listen-on port 53 { 127.0.0.1; ; }; // 监听本地和局域网接口
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; /; }; // **关键:限制谁可以查询**
// 例如: 192.168.1.0/24;
recursion yes; // **关键:启用递归**
allow-recursion { localhost; /; }; // **关键:限制谁可以使用递归服务**
// 可选:配置转发器 (如果不想直接查询根服务器)
// 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) 下载。
# 通常不需要手动操作,但如果需要:
# 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
部分):
options {
listen-on port 53 { 127.0.0.1; ; };
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; /; }; // 限制谁可以查询
recursion yes; // **需要启用递归,以便能够转发**
allow-recursion { localhost; /; }; // 限制谁可以使用此转发服务
forwarders { // **关键:指定上游DNS服务器**
; // 例如 8.8.8.8;
; // 例如 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
仍然需要严格限制。混合角色:
BIND9 服务器可以同时扮演多种角色。例如:
example.com
) 提供权威应答。options
部分设置 recursion yes;
和 allow-recursion { ; };
。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
进行检查,并仔细查看日志。