在Linux环境下搭建DNS(Domain Name System)服务器是网络管理中的一项核心任务,它主要负责将人类易于记忆的域名解析为机器能够识别的IP地址,在企业内网或实验环境中,搭建私有DNS服务器不仅可以加快解析速度,还能通过自定义域名方便地管理内部资源,目前最常用的DNS服务软件是BIND(Berkeley Internet Name Domain),以下将以CentOS 7/8或类似的RHEL系Linux发行版为例,详细介绍使用BIND搭建DNS主服务器的全过程。

环境准备与软件安装
在开始之前,必须确保服务器拥有一个静态的IP地址,因为DNS服务器需要稳定的网络标识,假设我们的服务器IP为 168.1.10,域名为 example.com。
通过YUM包管理器安装BIND软件包,打开终端,执行以下命令:
yum install -y bind bind-utils
安装完成后,系统会生成主配置文件和区域文件目录。bind-utils 包含了 nslookup、dig 等测试工具,是排查DNS故障的必备工具集。
主配置文件修改
BIND的核心配置文件位于 /etc/named.conf,为了安全和功能需求,我们需要修改该文件中的监听地址和访问控制权限。

使用文本编辑器(如vim)打开文件:
vim /etc/named.conf
主要修改以下两个部分:
- 监听设置:找到
listen-on port 53项,默认通常只监听0.0.1(localhost),需要将其修改为服务器的实际IP地址168.1.10,或者直接改为any以监听所有接口。 - 查询权限:找到
allow-query项,默认可能只允许本地查询,建议修改为any或者指定特定的内网网段(如168.1.0/24),以允许局域网内的其他设备向该服务器发起DNS请求。
为了防止DNS放大攻击,建议保留 recursion no;(如果该服务器仅作为权威DNS)或严格限制递归查询的网段,修改后的配置片段大致如下:
options {
listen-on port 53 { 192.168.1.10; };
directory "/var/named";
allow-query { any; };
recursion yes; // 仅在可信内网环境中开启
...
};
配置正向与反向解析区域
在 /etc/named.conf 文件的末尾,我们需要定义区域,告诉BIND我们要管理哪些域名。
- 正向解析区域:将域名解析为IP。
- 反向解析区域:将IP解析为域名(可选,但在某些邮件服务器验证场景中必需)。
在 named.conf 中添加如下配置:
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.zone";
allow-update { none; };
};
这里 file 参数指定了区域数据文件的名称,这些文件默认存放在 /var/named/ 目录下。
创建区域数据文件
进入 /var/named/ 目录,创建正向解析文件 example.com.zone,我们可以参考 named.localhost 模板来创建。
正向解析文件内容示例:
$TTL 86400
@ IN SOA ns1.example.com. root.example.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns1.example.com.
ns1 IN A 192.168.1.10
www IN A 192.168.1.100
mail IN A 192.168.1.101
在此文件中,SOA 记录定义了授权起始信息,NS 记录指定了名称服务器,A 记录则将主机名映射到IP地址,注意,域名末尾的“.”代表根域,不能省略。
接下来创建反向解析文件 168.1.zone,用于IP到域名的映射:
$TTL 86400
@ IN SOA ns1.example.com. root.example.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns1.example.com.
10 IN PTR ns1.example.com.
100 IN PTR www.example.com.
这里使用的是 PTR 指针记录,前面的数字(如10)代表IP地址的最后一段。
权限检查与服务启动
配置文件编写完毕后,必须检查语法错误并调整文件权限。
- 语法检查:使用
named-checkconf检查主配置文件,使用named-checkzone检查区域文件。named-checkconf named-checkzone example.com /var/named/example.com.zone
- 权限修复:BIND对文件权限非常敏感,必须确保
/var/named/下的文件所有者为named。chown named:named /var/named/*.zone
- 启动服务:启动named服务并设置开机自启。
systemctl start named systemctl enable named
- 防火墙配置:不要忘记开放防火墙的53端口(UDP和TCP)。
firewall-cmd --permanent --add-service=dns firewall-cmd --reload
验证测试
将测试机器的DNS服务器地址修改为 168.1.10,使用 nslookup 或 dig 命令进行测试。
nslookup www.example.com 192.168.1.10
如果返回配置中设定的IP地址 168.1.100,则说明DNS服务器搭建成功。
相关问答FAQs
Q1: 在修改了区域文件(如增加了一条A记录)后,为什么使用nslookup查询时仍然是旧的IP地址或查不到?
A1: 这通常是因为修改后没有重启BIND服务或序列号未更新导致的,DNS服务器在读取区域文件时会缓存数据,解决方法分两步:
- 更新序列号:在区域文件中,必须手动将
SOA记录中的serial(序列号)数值加1,这是通知从服务器(Slave)或自身服务数据已变更的标准机制。 - 重启服务:执行
systemctl restart named命令,强制服务重新加载配置文件,如果仍然不行,请检查客户端的DNS缓存(如Windows下的ipconfig /flushdns)。
Q2: 配置文件中域名末尾的“.”(点)有什么特殊含义?如果不加会怎样?
A2: 在BIND配置中,末尾的点(.)代表“根域”,表示这是一个“完全限定域名”(FQQN),如果不加这个点,BIND会自动将当前的区域名称(即 $ORIGIN 或 zone名称)追加到后面。
在 example.com 的区域文件中,如果你写 www,系统会解析为 www.example.com.;如果你写 www.example.com(没加点),系统会错误地将其解析为 www.example.com.example.com.,导致解析失败,除了简写的主机名外,完整的域名后面务必加上点。
