在Linux系统管理领域,域名系统(DNS)是互联网基础设施的基石,它负责将人类易于记忆的域名(如www.example.com)解析为机器能够识别的IP地址,BIND(Berkeley Internet Name Domain)作为互联网上最广泛使用、功能最强大的DNS软件,是构建DNS服务器的首选,本文将详细介绍如何在CentOS 6.5这一经典的企业级操作系统上,从零开始搭建、配置和管理一个功能完善的BIND DNS服务器。

环境准备与软件安装
在开始配置之前,确保您的CentOS 6.5系统已经正确安装并连接到网络,我们将使用yum包管理器来安装必要的软件,为了增强安全性,推荐安装bind-chroot包,它可以将BIND进程限制在一个特定的目录(/var/named/chroot)中,即使服务被攻破,也能有效限制攻击者对整个系统的破坏。
打开终端,执行以下命令来安装BIND及其相关组件:
yum install bind bind-chroot bind-utils
bind: BIND主程序包。bind-chroot: 安全增强包,用于chroot环境。bind-utils: 包含dig、nslookup等DNS查询工具,便于测试。
安装完成后,BIND的主要配置文件和区域文件将位于/var/named/chroot目录下的相应子目录中,但为了方便管理,系统通常会创建符号链接指向/etc和/var/named。
核心配置文件解析
BIND的配置主要围绕两个核心文件展开:
- 主配置文件 (
/etc/named.conf): 这是BIND的“大脑”,定义了服务器的全局行为,如监听的端口和地址、允许查询的客户端、以及它所负责解析的域名区域(Zone)。 - 区域文件 (位于
/var/named/): 这些是数据库文件,每个文件对应一个域名区域,存储了具体的DNS记录,如A记录(域名到IP)、CNAME记录(别名)、MX记录(邮件交换)等。
第一步:配置主配置文件
编辑/etc/named.conf文件,默认的文件通常包含大量注释和示例,我们可以进行简化,只保留必要的配置。
vi /etc/named.conf
一个基础但功能完整的主配置文件示例如下:
options {
listen-on port 53 { any; }; // 监听在所有网络接口的53端口
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; // 允许递归查询,使服务器能为客户端解析外部域名
// 配置转发器,当服务器无法解析某个域名时,会向这些公共DNS服务器请求
forwarders {
8.8.8.8;
8.8.4.4;
};
};
// 定义根区域,通常由系统自动管理
zone "." IN {
type hint;
file "named.ca";
};
// 定义我们自己的正向解析区域
zone "example.com" IN {
type master; // 类型为主服务器
file "example.com.zone"; // 指定正向区域文件名
allow-update { none; }; // 不允许动态更新
};
// 定义我们自己的反向解析区域
zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.zone"; // 指定反向区域文件名
allow-update { none; };
};
配置说明:
listen-on: 设置为any表示监听所有IP地址,生产环境中可限制为特定IP以增强安全。allow-query: 设置为any表示接受任何来源的查询请求,同样,生产环境应做限制。recursion: 对于内部DNS服务器,通常需要开启递归查询。forwarders: 非常重要的配置,它让我们的DNS服务器在遇到非本地域名时,能够向更高级的DNS服务器(如Google的公共DNS)求助,从而能够解析整个互联网的域名。zone块:我们定义了两个区域,一个用于解析example.com域名的正向查找,另一个用于解析168.1.0网段IP的反向查找。
第二步:创建正向解析区域文件
我们需要在/var/named/目录下创建example.com.zone文件,这个文件包含了example.com域内所有主机的DNS记录。
vi /var/named/example.com.zone
如下:
$TTL 86400 ; 生存时间,默认为1天
@ IN SOA ns1.example.com. admin.example.com. (
2025080101 ; 序列号,每次修改后必须递增
3600 ; 刷新时间(秒)
1800 ; 重试时间(秒)
604800 ; 过期时间(秒)
86400 ) ; 最小TTL(秒)
; 定义域名服务器记录
@ IN NS ns1.example.com.
; 定义A记录(主机名到IP地址)
ns1 IN A 192.168.1.10
www IN A 192.168.1.20
mail IN A 192.168.1.30
ftp IN CNAME www.example.com. ; CNAME记录,ftp是www的别名
; 定义MX记录(邮件交换)
@ IN MX 10 mail.example.com.
记录解析:
SOA(Start of Authority): 起始授权机构记录,是区域文件的核心,它指定了该域的主域名服务器和管理员邮箱。NS(Name Server): 域名服务器记录,指定负责解析该域的DNS服务器。A(Address): 地址记录,将主机名映射到IPv4地址。CNAME(Canonical Name): 规范名称记录,用于创建主机的别名。MX(Mail Exchanger): 邮件交换记录,指定接收该域电子邮件的服务器。
第三步:创建反向解析区域文件
反向解析用于通过IP地址查找对应的域名,创建/var/named/1.168.192.zone文件。

vi /var/named/1.168.192.zone
如下:
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025080101
3600
1800
604800
86400 )
@ IN NS ns1.example.com.
; 定义PTR记录(IP地址到主机名)
10 IN PTR ns1.example.com.
20 IN PTR www.example.com.
30 IN PTR mail.example.com.
PTR记录: 这里的10、20、30分别对应IP地址168.1.10、168.1.20和168.1.30的主机部分。
权限设置与服务启动
配置文件创建后,必须确保它们的权限和归属正确,否则named进程将无法读取。
chown root:named /etc/named.conf chmod 640 /etc/named.conf chown root:named /var/named/*.zone chmod 640 /var/named/*.zone
由于我们使用了bind-chroot,还需要确保SELinux上下文正确,通常yum安装的包会处理好这一点,但如果遇到问题,可以运行:
restorecon -Rv /var/named
可以启动BIND服务并设置其开机自启:
service named start chkconfig named on
防火墙配置与测试
CentOS 6.5默认使用iptables作为防火墙,DNS服务使用UDP和TCP的53端口,需要开放这两个端口。
iptables -I INPUT -p udp --dport 53 -j ACCEPT iptables -I INPUT -p tcp --dport 53 -j ACCEPT service iptables save service iptables restart
使用dig或nslookup工具来测试我们的DNS服务器是否工作正常。
-
测试正向解析:
dig @192.168.1.10 www.example.com
应该能看到返回
168.1.20的A记录。 -
测试反向解析:
dig -x 192.168.1.20 @192.168.1.10
应该能看到返回
www.example.com的PTR记录。
-
测试外部域名解析:
dig @192.168.1.10 www.google.com
这应该会通过我们设置的
forwarders成功解析,证明递归查询配置生效。
至此,一个在CentOS 6.5上搭建的基础BIND DNS服务器已经成功运行,能够为内部网络提供域名解析服务,并能通过转发访问整个互联网。
相关问答FAQs
Q1: 我启动了 named 服务,但是客户端无法解析,日志里显示 "permission denied" 或 "network unreachable" 错误,该如何排查?
A1: 这通常是权限或防火墙问题,请按以下步骤排查:
- 检查文件权限: 确认
/etc/named.conf和/var/named/下的所有区域文件的所有者是root,所属组是named,并且组有读权限(chmod 640)。 - 检查SELinux: CentOS的SELinux可能会阻止
named访问文件,运行ls -lZ /var/named/example.com.zone查看SELinux上下文,如果不是named_zone_t,请运行restorecon -v /var/named/example.com.zone来修复。restorecon -Rv /var/named可以递归修复整个目录。 - 检查防火墙: 确认
iptables已经放行了UDP和TCP的53端口,可以使用iptables -L -n | grep 53命令查看规则。 - 检查监听地址: 在
named.conf中,listen-on是否设置正确?如果设置为0.0.1,则外部客户端无法连接,设置为any或服务器的具体IP地址。
Q2: 我的DNS服务器可以解析自己管理的域名(如 example.com),但无法解析外部的网站(如 baidu.com),这是为什么?
A2: 这个问题表明您的DNS服务器没有配置递归查询或转发器,它只知道自己负责的区域,对于其他域名则束手无策,解决方法是在/etc/named.conf的options {}块中添加forwarders指令,如下所示:
options {
// ... 其他配置 ...
recursion yes; // 确保此项为 yes
forwarders {
114.114.114.114; // 使用公共DNS,如114DNS
8.8.8.8; // 或者Google DNS
};
};
添加后,保存文件并重启named服务(service named restart),这样,当服务器收到一个它不认识的域名查询请求时,就会将请求转发给forwarders列表中的服务器进行查询,从而实现对外部域名的解析。