- 作为内部局域网的 DNS 服务器:为内网客户端提供域名解析,并缓存外部域名查询结果。
- 作为权威 DNS 服务器:管理你自己的域名(
example.com),使其在互联网上可被访问。
第零步:准备工作
- 操作系统:一台已经安装好的 CentOS 7 服务器。
- 网络配置:确保服务器有静态 IP 地址,并且网络连接正常。
- 主机名:为服务器设置一个有意义的主机名,
dns-server.example.com。 - 防火墙和 SELinux:这是 CentOS 服务器配置中至关重要的一步,必须正确配置才能让 DNS 服务正常工作。
更新系统
sudo yum update -y
设置主机名
# 将 hostname.example.com 替换为你自己的主机名 sudo hostnamectl set-hostname dns-server.example.com
配置防火墙
# 开放 DNS 服务所需的端口 (TCP/UDP 53) sudo firewall-cmd --permanent --add-service=dns # 重新加载防火墙规则使其生效 sudo firewall-cmd --reload
配置 SELinux
SELinux 默认是 enforcing(强制)模式,这会限制 BIND 的行为,为了简化配置,我们将其设置为 permissive(宽容)模式,它会记录违规行为但不阻止,在生产环境中,更推荐使用 semanage 工具来添加正确的策略,但本教程为了简单,先采用此方法。

# 查看当前 SELinux 状态 sestatus # 临时设置为 permissive 模式 (重启后失效) sudo setenforce 0 # 永久设置为 permissive 模式 (需要重启) # sudo nano /etc/selinux/config # 将 SELINUX=enforcing 改为 SELINUX=permissive # sudo reboot
安全提示:在生产环境中,不建议直接关闭 SELinux,更好的做法是安装
policycoreutils-python包,然后使用semanage命令为 BIND 创建正确的策略文件。
第一步:安装 BIND
sudo yum install bind bind-utils -y
bind:DNS 服务器主程序。bind-utils:包含客户端工具,如dig,nslookup,host等,用于测试 DNS 服务。
安装完成后,BIND 服务会自动启动,我们可以检查一下状态:
sudo systemctl status named
如果服务没有启动,可以手动启动并设置为开机自启:
sudo systemctl start named sudo systemctl enable named
第二步:配置 BIND
BIND 的主要配置文件是 /etc/named.conf,其他区域文件(zone files)通常存放在 /var/named/ 目录下。

备份原始配置文件
sudo cp /etc/named.conf /etc/named.conf.bak
编辑主配置文件
sudo nano /etc/named.conf
我们需要修改以下几个关键部分:
a) 全局选项 在文件开头,可以设置一些全局参数,如监听的地址和允许查询的客户端。
options {
# 监听所有网络接口上的 53 端口
listen-on port 53 { any; };
# 监听 IPv6
listen-on-v6 port 53 { any; };
# 允许任何客户端查询(对于缓存/转发服务器)
# 或者限制为特定网段,{ 192.168.1.0/24; localhost; };
allow-query { any; };
# 将 DNS 查询请求转发到上游 DNS 服务器(8.8.8.8)
# 这对于内部 DNS 服务器至关重要
forwarders { 8.8.8.8; 1.1.1.1; };
# 区域文件存放目录
directory "/var/named";
# ... 其他配置保持不变 ...
};
b) 区域定义 区域定义了你负责管理的 DNS 区域(即一个域名)。
// 这是 localhost 的反向解析区域
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
// 这是 localhost 的正向解析区域
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
// --- 在这里添加你自己的区域 ---
// 为 example.com 创建一个正向解析区域
zone "example.com" IN {
type master;
file "example.com.zone";
};
// 为 example.com 创建一个反向解析区域
// 假设你的服务器 IP 是 192.168.1.100,那么网络段是 192.168.1.0/24
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.db";
};
c) 控制访问 为了安全,最好限制外部对区域文件的修改。

// 在文件末尾添加
controls {
inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; };
};
保存并退出 named.conf 文件 (Ctrl+X, Y, Enter)。
第三步:创建区域文件
我们需要为刚才在 named.conf 中定义的区域创建具体的数据库文件。
设置正确的文件权限
BIND 进程 (named) 需要对区域文件有读取权限,默认情况下,/var/named 目录的权限是正确的,但最好确保一下。
sudo chown root:named /var/named/* sudo chmod 640 /var/named/*
创建正向解析区域文件 (example.com.zone)
sudo nano /var/named/example.com.zone
并根据你的实际情况修改:
$TTL 1D
@ IN SOA dns-server.example.com. admin.example.com. (
2025102501 ; Serial
3600 ; Refresh (1 hour)
1800 ; Retry (30 minutes)
604800 ; Expire (1 week)
86400 ; Minimum (1 day)
)
IN NS dns-server.example.com.
IN MX 10 mail.example.com.
; 主机记录
dns-server IN A 192.168.1.100
www IN A 192.168.1.101
mail IN A 192.168.1.102
; 别名记录
ftp IN CNAME www.example.com.
文件解析:
$TTL 1D:默认的生存时间为1天。- 代表当前区域名 (
example.com.)。 SOA:起始授权机构,记录了区域的管理信息。Serial:序列号。每次修改此文件后,都必须增加这个数字,否则主从DNS同步会失败。NS:域名服务器记录,指定了谁是这个区域的权威服务器。MX:邮件交换记录,指定了处理该域名的邮件服务器。A:地址记录,将主机名映射到 IPv4 地址。CNAME:规范名称记录,为一个主机名创建别名。
创建反向解析区域文件 (168.1.db)
反向解析是将 IP 地址映射回主机名。
sudo nano /var/named/192.168.1.db
$TTL 1D
@ IN SOA dns-server.example.com. admin.example.com. (
2025102501 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ; Minimum
)
IN NS dns-server.example.com.
; PTR 记录
100 IN PTR dns-server.example.com.
101 IN PTR www.example.com.
102 IN PTR mail.example.com.
文件解析:
zone定义中的168.192.in-addr.arpa对应的是 IP168.1.x。PTR:指针记录,将 IP 地址的最后一部分(如100)映射到主机名。
第四步:检查配置并重启服务
在重启 BIND 服务之前,务必检查配置文件语法是否正确。
检查 named.conf 语法
sudo named-checkconf
如果没有任何输出,说明语法正确,如果有错误,它会告诉你具体哪一行有问题。
检查区域文件语法
sudo named-checkzone example.com /var/named/example.com.zone sudo named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.db
如果看到类似 zone example.com/IN: loaded serial 2025102501 的输出,说明区域文件正确。
重启 BIND 服务
sudo systemctl restart named
第五步:测试 DNS 服务器
你可以使用 dig 或 nslookup 工具来测试你的 DNS 服务器了。
测试正向解析
在客户端机器上,将 DNS 服务器地址设置为你的 CentOS 服务器的 IP (168.1.100),然后进行测试。
# 测试本地域名 dig @192.168.1.100 dns-server.example.com # 测试 WWW 域名 dig @192.168.1.100 www.example.com # 查看更详细的响应 dig @192.168.1.100 www.example.com +short
测试反向解析
dig @192.168.1.100 -x 192.168.1.101
测试缓存功能
# 查询一个外部域名 dig @192.168.1.100 www.google.com # 再次查询,应该会显示从缓存中获取 (cache) dig @192.168.1.100 www.google.com
第六步:配置客户端
要让局域网内的其他计算机使用这台 DNS 服务器,你需要将它们的 DNS 设置指向这台服务器的 IP 地址。
- 在 Linux 客户端:编辑
/etc/resolv.conf文件,将nameserver行修改为你的 DNS 服务器 IP。sudo nano /etc/resolv.conf nameserver 192.168.1.100
- 在 Windows 客户端:
- 打开“网络和共享中心” -> “更改适配器设置”。
- 右键点击你正在使用的网络连接(如“以太网”或“WLAN”),选择“属性”。
- 双击列表中的“Internet 协议版本 4 (TCP/IPv4)”。
- 选择“使用下面的 DNS 服务器地址”,并填入
168.1.100。
总结与进阶
你已经成功在 CentOS 7 上搭建了一台功能完备的 DNS 服务器!
- 作为内部 DNS 服务器:它可以为你的内网提供域名解析,并缓存外部查询,加快访问速度。
- 作为权威 DNS 服务器:它可以为你的域名(如
example.com)在互联网上提供权威解析。
进阶提示:
- 主从 DNS:为了高可用性,你可以配置另一台服务器作为从 DNS,从主 DNS 同步区域文件。
- DNSSEC:为了增强安全性,可以部署 DNSSEC 来防止 DNS 欺骗和缓存投毒攻击。
- 视图:使用 BIND 的“视图”功能,可以为不同网段的客户端(例如内网和外网)提供不同的解析结果。
