总览:DNS 服务器工作流程
- 安装 BIND:在服务器上安装 DNS 软件包。
- 主配置文件 (
named.conf):设置全局选项,并定义“区域”(Zone),区域是您要管理的 DNS 记录集合(example.com)。 - 区域文件:为每个区域创建一个文件,其中包含具体的 DNS 记录(如 A 记录、CNAME 记录等)。
- 配置解析:配置服务器如何为客户端递归查询(即帮助客户端查询其他域名的 IP)。
- 启动并设置防火墙:启动 DNS 服务并允许 DNS 端口通过防火墙。
- 测试:使用
dig、nslookup等工具测试 DNS 服务是否正常工作。
第一步:安装 BIND
确保您的系统是最新的,然后安装 bind 和 bind-utils 包。bind-utils 包含了用于测试 DNS 的客户端工具(如 dig, nslookup, host)。

# 1. 更新系统软件包 sudo dnf update -y # 2. 安装 BIND 服务器和客户端工具 sudo dnf install -y bind bind-utils
安装完成后,BIND 的主配置文件位于 /etc/named.conf。
第二步:配置主配置文件 (/etc/named.conf)
这是 BIND 的核心配置文件,我们将对其进行修改,以定义我们的区域和基本选项。
# 使用 vim 或您喜欢的编辑器打开文件 sudo vim /etc/named.conf
一个典型的 /etc/named.conf 文件结构如下:
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND DNS server as a
// caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
listen-on port 53 { 127.0.0.1; any; }; // 监听所有网络接口,而不仅仅是本地回环
listen-on-v6 port 53 { ::1; any; }; // 监听 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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost; any; }; // 允许任何主机查询 (生产环境应限制为特定网络)
// --- 递归和转发配置 ---
// 如果您想将无法解析的请求转发到上游 DNS 服务器,取消下面这部分的注释
// forwarders { 8.8.8.8; 1.1.1.1; };
// forward only; // 或使用 forward first (默认)
recursion yes; // 启用递归查询
dnssec-validation yes; // 启用 DNSSEC 验证 (推荐)
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
// --- 在这里添加您的区域定义 ---
// 示例:创建一个名为 "example.com" 的主区域
zone "example.com" IN {
type master; // 这是一个主 DNS 服务器
file "example.com.zone"; // 区域文件名,位于 /var/named/ 目录下
allow-update { none; }; // 不允许动态更新
};
// 示例:创建一个反向区域 (根据您的服务器 IP 地址)
// 假设服务器 IP 是 192.168.1.100,则反向区域是 1.168.192.in-addr.arpa
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.db"; // 反向区域文件名
allow-update { none; };
};
关键配置项解释:

listen-on port 53 { any; };:让 DNS 服务监听服务器上所有网络接口的 53 端口,这对于作为内部或公共 DNS 服务器至关重要。allow-query { any; };:允许任何 IP 地址向此服务器发起查询,在生产环境中,您应该将其限制为您的内部网络,allow-query { 192.168.1.0/24; };。zone "example.com" IN { ... }:定义一个名为 "example.com" 的区域。type master;:表示此服务器是该区域的主权威服务器。file "example.com.zone";:指定存储该区域 DNS 记录的文件。
保存并退出编辑器。
第三步:创建区域文件
我们需要为我们在 named.conf 中定义的区域创建实际的记录文件。
创建正向区域文件 (example.com.zone)
# 切换到 named 目录 cd /var/named # 复制一个模板文件来创建新的区域文件 # 这是一个安全的做法,可以确保文件权限和所有者正确 sudo cp -p named.localhost example.com.zone
然后编辑这个新文件:
sudo vim example.com.zone
并根据您的实际情况修改:
$TTL 1D
@ IN SOA ns1.example.com. admin.example.com. (
2025051501 ; serial (YYYYMMDDVV)
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1.example.com.
A 192.168.1.100 ; 这台 DNS 服务器本身的 IP
; --- 记录开始 ---
ns1 IN A 192.168.1.100 ; 名称服务器记录
www IN A 192.168.1.101 ; Web 服务器
mail IN A 192.168.1.102 ; 邮件服务器
; --- 使用 CNAME 别名 ---
blog IN CNAME www.example.com.
关键记录解释:
$TTL 1D:默认的生存时间,为 1 天。SOA (Start of Authority):权威记录的开始,必须包含。ns1.example.com.:主名称服务器的主机名。admin.example.com.:管理员的邮箱地址(用 代替 )。2025051501:序列号。每次修改此文件后,都必须增加这个数字,以便从服务器知道需要重新下载区域文件。
NS:名称服务器记录,指定负责此区域的 DNS 服务器。A:地址记录,将主机名映射到 IPv4 地址。CNAME:规范名称记录,为一个主机名创建别名。
保存并退出。
创建反向区域文件 (168.1.db)
反向区域用于通过 IP 地址查询主机名(PTR 记录)。
# 再次复制模板 sudo cp -p named.loopback 192.168.1.db
编辑文件:
sudo vim 192.168.1.db
$TTL 1D
@ IN SOA ns1.example.com. admin.example.com. (
2025051501 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1.example.com.
; --- 记录开始 ---
IN PTR example.com. ; 192.168.1.100 的反向
100 IN PTR ns1.example.com. ; 192.168.1.100 的反向
101 IN PTR www.example.com. ; 192.168.1.101 的反向
102 IN PTR mail.example.com. ; 192.168.1.102 的反向
关键记录解释:
PTR (Pointer):指针记录,将 IP 地址映射到主机名,反向区域文件中的 代表168.192.in-addr.arpa.,100实际上代表1.168.192.in-addr.arpa.,即 IP168.1.100。
保存并退出。
第四步:启动并设置防火墙
-
启动并启用 BIND 服务
# 启动服务 sudo systemctl start named # 设置为开机自启 sudo systemctl enable named
-
配置防火墙
RHEL/CentOS 使用
firewalld,需要允许 DNS (TCP/UDP 53) 端口。# 添加永久性的 DNS 服务规则 sudo firewall-cmd --permanent --add-service=dns # 重新加载防火墙以应用新规则 sudo firewall-cmd --reload
-
检查服务状态
sudo systemctl status named
确保输出显示
active (running)。
第五步:测试 DNS 服务器
使用 dig 工具进行测试。请确保您的客户端 DNS 设置指向新配置的 DNS 服务器的 IP (192.168.1.100)。
测试正向解析
# 查询 www.example.com dig @192.168.1.100 www.example.com
预期输出:在 ANSWER SECTION 中,您应该能看到:
;; ANSWER SECTION:
www.example.com. 86400 IN A 192.168.1.101
测试反向解析
# 查询 IP 192.168.1.101 的 PTR 记录 dig @192.168.1.100 -x 192.168.1.101
预期输出:在 ANSWER SECTION 中,您应该能看到:
;; ANSWER SECTION:
101.1.168.192.in-addr.arpa. 86400 IN PTR www.example.com.
测试递归查询
为了测试递归功能,查询一个您服务器上没有的域名,google.com。
dig @192.168.1.100 google.com
如果配置正确,您应该能得到 Google 的 IP 地址,这证明您的服务器能够向根服务器和顶级域名服务器发起查询,并将结果返回给您。
检查配置文件语法
在修改配置后,如果服务无法启动,可以使用以下命令检查语法错误:
sudo named-checkconf # 如果没有输出,说明主配置文件语法正确 sudo named-checkzone example.com /var/named/example.com.zone # 检查特定区域文件的语法 # 预期输出: zone example.com/IN: loaded serial 2025051501
常见问题与排错
-
问题:
dig返回SERVFAIL或REFUSED。- 原因:通常是防火墙阻止了 53 端口,或者
named.conf中的allow-query设置过于严格。 - 解决:检查
firewall-cmd --list-all和named.conf中的allow-query和listen-on设置。
- 原因:通常是防火墙阻止了 53 端口,或者
-
问题:区域文件加载失败。
- 原因:文件所有者或权限不正确,BIND 进程 (
named) 用户需要对/var/named目录及其下的文件有读取权限。 - 解决:确保文件所有者是
root.named,权限是640。sudo chown root:named /var/named/example.com.zone sudo chmod 640 /var/named/example.com.zone
- 原因:文件所有者或权限不正确,BIND 进程 (
-
问题:客户端无法解析。
- 原因:客户端的网络设置中,DNS 服务器地址没有指向您的 RHEL DNS 服务器。
- 解决:在客户端机器上,将 DNS 服务器 IP 设置为
168.1.100。
至此,您已经成功配置了一个功能齐全的 Red Hat DNS 服务器,您可以根据需要添加更多的 A、CNAME、MX (邮件交换) 等记录。
