在CentOS系统中搭建DNS服务器通常使用BIND(Berkeley Internet Name Domain)软件,它是目前最流行的DNS服务器软件之一,以下将详细介绍在CentOS 7/8系统上搭建DNS服务器的完整步骤,包括安装配置、区域文件管理、安全设置及测试验证等内容。

安装BIND软件包
首先需要更新系统软件包列表并安装BIND相关组件,打开终端,执行以下命令:
sudo yum update -y sudo yum install bind bind-utils -y
bind是DNS服务器主程序,bind-utils包含客户端工具如nslookup、dig等,用于测试DNS服务。
配置BIND主配置文件
BIND的主配置文件位于/etc/named.conf,需要编辑该文件以定义DNS服务器的全局参数和区域配置,使用vim或nano编辑器打开文件:
sudo vim /etc/named.conf
主要修改以下内容:

- 全局选项:在
options段落中设置监听地址、允许查询的客户端等。options { listen-on port 53 { any; }; // 监听所有网络接口 listen-on-v6 port 53 { ::1; }; // 监听IPv6 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 yes; }; - 区域定义:在文件末尾添加正向和反向解析区域,为域名
example.com创建正向区域,网段168.1.0/24创建反向区域:zone "example.com" IN { type master; file "example.com.zone"; allow-update { none; }; }; zone "1.168.192.in-addr.arpa" IN { type master; file "192.168.1.rev"; allow-update { none; }; };
创建区域数据文件
区域数据文件存储在/var/named目录下,需根据主配置文件中的定义创建正向和反向区域文件。
正向区域文件(example.com.zone)
sudo vim /var/named/example.com.zone
```示例:
```conf
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025081501 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
IN NS ns1.example.com.
IN MX 10 mail.example.com.
ns1 IN A 192.168.1.10
www IN A 192.168.1.20
mail IN A 192.168.1.30
反向区域文件(192.168.1.rev)
sudo vim /var/named/192.168.1.rev
```示例:
```conf
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025081501 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
IN NS ns1.example.com.
10 IN PTR ns1.example.com.
20 IN PTR www.example.com.
30 IN PTR mail.example.com.
注意:区域文件中的$ORIGIN和$TTL可根据需要调整,确保序列号(Serial)唯一且递增。
配置文件权限与SELinux
BIND对文件权限要求严格,需确保区域文件属主为named用户:
sudo chown named:named /var/named/example.com.zone sudo chown named:named /var/named/192.168.1.rev sudo chmod 640 /var/named/example.com.zone sudo chmod 640 /var/named/192.168.1.rev
如果启用了SELinux,需安装policycoreutils-python并设置正确的上下文:

sudo yum install policycoreutils-python -y sudo semanage fcontext -a -t named_zone_t "/var/named/example.com.zone" sudo semanage fcontext -a -t named_zone_t "/var/named/192.168.1.rev" sudo restorecon -v /var/named/example.com.zone /var/named/192.168.1.rev
启动并启用DNS服务
完成配置后,启动BIND服务并设置为开机自启:
sudo systemctl start named sudo systemctl enable named
检查服务状态:
sudo systemctl status named
防火墙与端口配置
确保防火墙允许DNS流量(默认TCP/UDP 53端口):
sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
测试DNS服务
使用nslookup或dig工具测试解析功能:
-
正向解析测试:
nslookup www.example.com
预期返回
168.1.20。 -
反向解析测试:
nslookup 192.168.1.20
预期返回
www.example.com。 -
测试递归查询:
dig @127.0.0.1 example.com
检查
ANSWER SECTION是否包含正确记录。
常见问题排查
- 区域文件语法错误:使用
named-checkzone检查区域文件语法:sudo named-checkzone example.com /var/named/example.com.zone
- 服务无法启动:查看日志
/var/log/messages或journalctl -u named定位错误。
DNS服务安全加固建议
- 限制查询范围:将
allow-query设置为特定网段(如{ 192.168.1.0/24; })。 - 启用DNSSEC:在区域配置中添加
dnssec-policy并生成密钥对。 - 隐藏版本信息:在
options段落中添加version "none";。
相关问答FAQs
问题1:如何修改DNS服务器的监听端口?
答:编辑/etc/named.conf文件,在options段落中修改listen-on port 53和listen-on-v6 port 53的端口号,例如改为listen-on port 5353,修改后重启named服务:sudo systemctl restart named,同时需在防火墙中开放新端口(如sudo firewall-cmd --permanent --add-port=5353/udp)。
问题2:DNS服务启动失败,提示“permission denied”如何解决?
答:通常是由于区域文件权限或SELinux上下文问题,首先检查文件权限:ls -l /var/named/example.com.zone,确保属主为named且权限为640,若SELinux启用,执行sudo restorecon -Fv /var/named/example.com.zone恢复默认上下文,若问题仍存在,查看日志journalctl -u named进一步排查。
