在CentOS系统中搭建DNS服务器是网络管理中常见的需求,无论是为局域网提供域名解析服务,还是作为内部系统的权威服务器,都能有效提升网络访问效率和可控性,本文将详细介绍在CentOS上配置DNS服务器的完整流程,包括环境准备、安装软件、主配置文件编写、区域文件创建、服务启动及测试验证等关键步骤,并通过表格形式清晰呈现核心配置参数,最后附相关FAQs解答常见问题。

环境准备与软件安装
在开始配置前,需确保CentOS系统已更新至最新状态,并安装必要的DNS服务软件包,CentOS默认使用BIND(Berkeley Internet Name Domain)作为DNS服务器软件,可通过yum包管理器安装,首先执行系统更新:
sudo yum update -y
随后安装BIND及其相关工具,包括bind、bind-utils(提供dnsquery、dig等测试工具)和bind-chroot(可选,用于增强安全性,将DNS服务运行在chroot环境中):
sudo yum install bind bind-utils bind-chroot -y
安装完成后,检查BIND服务状态:
systemctl status named
若未启动,可先使用systemctl start named启动服务,并通过systemctl enable named设置开机自启。
主配置文件(named.conf)修改
BIND的主配置文件位于/etc/named.conf(若安装bind-chroot,则实际路径为/var/named/chroot/etc/named.conf),是定义DNS服务器行为的核心文件,编辑该文件(建议使用vim或nano):
vim /etc/named.conf
``` 包括全局选项、区域声明等关键部分,以下是核心配置说明及示例:
#### 1. 全局选项(options)
定义服务器的基本行为,如监听地址、允许查询的客户端、数据文件路径等,需修改以下参数:
- `listen-on port 53 { any; };`:监听所有网络接口的53端口(默认仅监听localhost,生产环境建议根据需求限制为内网IP,如`{ 192.168.1.0/24; };`)。
- `allow-query { any; };`:允许所有客户端查询(默认仅允许localhost,生产环境建议限制为内网网段,如`{ 192.168.1.0/24; localhost; };`)。
- `directory "/var/named";`:区域数据文件存放路径(与bind-chroot环境一致时无需修改)。
- `recursion yes;`:允许递归查询(适用于缓存DNS服务器,若为权威服务器可设为no)。
#### 2. 区域声明(zone)
定义服务器管理的权威区域,包括正向区域(域名到IP)和反向区域(IP到域名),以下示例添加一个正向区域`example.com`和反向区域`1.168.192.in-addr.arpa`(假设内网网段为192.168.1.0/24):
```bash
zone "example.com" IN {
type master; # 表示主DNS服务器
file "example.com.zone"; # 区域数据文件名,需存放在/var/named/目录下
allow-update { none; }; # 禁止动态更新(安全考虑)
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.db"; # 反向区域文件名
allow-update { none; };
};
配置完成后,保存文件并检查语法错误:
named-checkconf
``` 则配置语法正确;若有错误,根据提示修改`named.conf`。
### 三、区域数据文件创建
区域数据文件存储具体的域名解析记录,需在`/var/named`目录下创建,并设置正确的权限(属主为named:named),以下为正向区域文件`example.com.zone`示例:
```bash
$TTL 86400 ; 默认TTL(24小时)
@ IN SOA ns1.example.com. admin.example.com. (
2025101501 ; 序列号(修改记录时需递增)
3600 ; 刷新间隔(1小时)
1800 ; 重试间隔(30分钟)
604800 ; 过期时间(7天)
86400 ; 负缓存TTL(24小时)
)
@ IN NS ns1.example.com. ; 名称服务器记录
ns1 IN A 192.168.1.10 ; ns1的IP地址
www IN A 192.168.1.20 www服务器的IP
mail IN A 192.168.1.30 邮件服务器IP
@ IN MX 10 mail.example.com. ; 邮件交换记录,优先级10
反向区域文件168.1.db示例(对应192.168.1.0/24网段):
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025101501
3600
1800
604800
86400
)
@ IN NS ns1.example.com.
10 IN PTR ns1.example.com. ; 192.168.1.10反向解析
20 IN PTR www.example.com. ; 192.168.1.20反向解析
30 IN PTR mail.example.com. ; 192.168.1.30反向解析
创建文件后,设置权限:
chown named:named /var/named/example.com.zone chown named:named /var/named/192.168.1.db
使用named-checkzone检查区域文件语法:
named-checkzone example.com /var/named/example.com.zone named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.db
若输出“OK”则表示文件正确。
防火墙与SELinux配置
CentOS默认启用防火墙(firewalld)和SELinux,需开放DNS服务所需的53端口(TCP/UDP)。
防火墙配置
firewall-cmd --permanent --add-service=dns firewall-cmd --reload
SELinux配置
若SELinux为 enforcing 模式,需调整策略允许BIND绑定非默认端口或访问文件,或设置为 permissive 模式(临时关闭,不记录日志):
setsebool -P named_write_master_zones on # 允许named写入主区域文件
可通过sestatus查看SELinux状态。
服务启动与测试
完成所有配置后,重启named服务加载新配置:
systemctl restart named systemctl status named # 确认服务运行正常
使用以下工具测试DNS解析功能:
使用dig测试正向解析
dig @192.168.1.10 www.example.com
预期输出包含ANSWER SECTION,显示www.example.com. IN A 192.168.1.20。
使用dig测试反向解析
dig @192.168.1.10 -x 192.168.1.20
预期输出ANSWER SECTION包含1.168.192.in-addr.arpa. IN PTR www.example.com.。
使用nslookup测试交互式查询
nslookup > server 192.168.1.10 > www.example.com
若返回正确IP,则DNS服务器配置成功。
核心配置参数说明表
| 配置项 | 作用说明 | 示例值 |
|---|---|---|
| listen-on | 指定监听的IP地址和端口 | { any; };(所有接口) |
| allow-query | 允许查询的客户端IP范围 | { 192.168.1.0/24; };(内网) |
| directory | 区域数据文件存放目录 | "/var/named" |
| zone | 定义权威区域,包含类型、主从服务器、数据文件路径等 | zone "example.com" IN { ... } |
| type | 区域类型,master(主)、slave(从)、forward(转发)等 | type master; |
| file | 区域数据文件名(需在directory目录下存在) | "example.com.zone" |
| SOA记录 | 起始授权机构,包含序列号、刷新时间等关键信息 | @ IN SOA ns1.example.com. ... |
| NS记录 | 名称服务器记录,指定解析该域名的DNS服务器 | www IN NS ns1.example.com. |
| A记录 | 主机记录,将域名映射到IPv4地址 | www IN A 192.168.1.20 |
| MX记录 | 邮件交换记录,指定邮件服务器及优先级 | mail IN MX 10 mail.example.com. |
| PTR记录 | 反向解析记录,将IP映射到域名(需在反向区域文件中定义) | 20 IN PTR www.example.com. |
相关问答FAQs
问题1:修改DNS配置后,客户端无法解析域名,可能的原因有哪些?
解答:常见原因包括:① named服务未重启或重启失败,可通过systemctl status named检查服务状态;② 防火墙或SELinux阻止53端口访问,需执行firewall-cmd --list-all确认是否开放DNS服务,以及getsebool -a | grep named检查SELinux策略;③ 区域文件权限错误,文件属主需为named:named,可通过ls -l /var/named/确认;④ 客户端DNS配置未指向新服务器,需检查客户端网络设置中的DNS服务器IP;⑤ 区域文件序列号未更新导致从服务器同步失败(主服务器场景无需考虑)。
问题2:如何配置DNS转发,将无法解析的请求转发到上游DNS服务器?
解答:在/etc/named.conf的options段落中添加forwarders参数,指定上游DNS服务器IP(如公共DNS 8.8.8.8或114.114.114.114),示例配置如下:
options {
... # 其他配置
forwarders { 8.8.8.8; 114.114.114.114; }; # 转发服务器列表
forward only; # 仅转发,不递归查询(设为first则优先递归,失败后转发)
};
配置完成后执行systemctl restart named重启服务,此时客户端请求本地DNS无法解析的域名时,将自动转发至上游服务器。
