CentOS 7上BIND9配置DNS服务器指南
详细说明如何在 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:
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>
- 防火墙: 确保 UDP 和 TCP 端口 53 对相应的客户端开放。
sudo 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
部分):
options {listen-on port 53 { 127.0.0.1; <your_server_ip>; }; // 监听本地和服务器的IPlisten-on-v6 port 53 { ::1; }; // 可选,如果不需要IPv6设为 nonedirectory "/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; // 推荐开启DNSSECdnssec-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 { <ip_of_slave1>; }; // 如果有从服务器,通知它们更新
};// 示例反向区域 (如果需要)
zone "1.168.192.in-addr.arpa" IN { // 对应 192.168.1.0/24type 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 ; Serial3600 ; Refresh1800 ; Retry604800 ; Expire86400 ) ; Minimum TTLIN NS ns1.example.com.IN NS ns2.example.com. ; 如果有第二个NSns1 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
部分):
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) 下载。
# 通常不需要手动操作,但如果需要:
# 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; <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
进行检查,并仔细查看日志。