吃透 DNS:从递归 / 迭代解析到 BIND 权威服务器部署全实战
DNS 服务器
1.DNS 层次结构
DNS 采用层级化的域名命名体系,从顶层到下层依次分为:
- 根域:DNS 层级体系的最顶层,以单个英文句点
.表示,是所有域名的最终溯源起点; - 顶级域(一级域):根域的下一级,分为两类核心类型 —— 通用顶级域(如
.com、.net、.org)和国家代码顶级域(如.cn、.us),由互联网号码分配机构(IANA)统一管理; - 二级域:顶级域下的层级,是各类组织 / 机构申请使用的核心域名(如
liu.cloud、redhat.fun),具备独立的管理权限; - 子域:二级域向下延伸的层级(如
lab.liu.cloud为三级域),可根据业务需求无限层级扩展。

核心术语说明
| 术语 | 定义 |
|---|---|
| Domain | 以通用名结尾的资源记录集合,代表 DNS 命名空间的完整子树(示例:laoma.cloud) |
| Subdomain | 某一域的子树域,继承父域的命名空间(示例:lab.liu.cloud 是 liu.cloud 的子域) |
| Zone | 特定名称服务器直接管辖的域范围(可包含整个域或部分子域),支持将子域委派至其他名称服务器管理 |
2.DNS 查询
主机发起的 DNS 查询类型由请求报头的 RD 字段决定,核心分为递归查询和迭代查询两类:
RD=1:递归查询(客户端默认使用的查询方式);RD=0:迭代查询。
2.1 递归查询
核心逻辑
以本地名称服务器为核心代理,客户端仅需发送一次查询请求,后续所有跨层级的 DNS 查询操作均由本地名称服务器完成,客户端只需等待最终解析结果返回。
完整流程
-
客户端向本地名称服务器提交 DNS 域名解析请求;
-
本地名称服务器优先查询本地缓存:
- 若缓存中存在目标域名的解析记录,直接将结果返回给客户端;
- 若缓存无记录,则以客户端身份向根名称服务器发起查询请求;
-
根名称服务器返回目标域名所属顶级域对应的顶级名称服务器地址;
-
本地名称服务器向该顶级名称服务器发送查询请求;
-
顶级名称服务器优先查询本地缓存:
- 若存在解析记录,直接返回给本地名称服务器,再由其转发至客户端;
- 若不存在记录,返回目标域名所属二级域对应的二级名称服务器地址;
-
本地名称服务器重复步骤 4-5,依次向三级、四级等层级的名称服务器查询,直至从权威名称服务器获取最终解析记录;
-
本地名称服务器将最终解析结果返回给客户端,并将该记录缓存至本地,供后续同域名查询复用。
补充说明:若权威服务器无对应域名记录,会向客户端返回 “负响应”(查询失败);若配置了转发器,权威服务器会通过转发器继续查询;若客户端配置多台 DNS 服务器,本地名称服务器会依次尝试向其他服务器查询。
示例(解析www.example.com)

- 客户端向本地名称服务器
dns.example.com发送www.example.com的解析请求; - 本地名称服务器缓存无该记录,向根名称服务器
a.rootserver.net发起查询; - 根名称服务器返回
.com顶级名称服务器的地址; - 本地名称服务器向
.com顶级名称服务器发送查询请求; .com顶级名称服务器返回example.com二级名称服务器的地址;- 本地名称服务器向
example.com二级名称服务器发送查询请求; example.com二级名称服务器返回www.example.com权威名称服务器的地址;- 本地名称服务器向
www.example.com权威名称服务器发送查询请求; - 权威名称服务器返回
www.example.com对应的 IP 地址; - 本地名称服务器将 IP 地址返回给客户端,完成解析流程。
2.2 迭代查询
核心逻辑
以客户端自身为核心,所有查询操作由客户端自主完成。客户端依次向本地名称服务器、根服务器、顶级服务器、权威服务器发送请求,每一级服务器仅返回 “下一级服务器地址”,直至客户端从权威服务器获取最终 IP 地址。
完整流程
-
客户端向本地名称服务器发送 DNS 查询请求;
-
本地名称服务器查询本地缓存:
- 若存在解析记录,直接返回给客户端;
- 若不存在记录,返回根名称服务器的地址;
-
客户端向根名称服务器发送查询请求,根服务器返回顶级名称服务器地址;
-
客户端向顶级名称服务器发送查询请求,顶级服务器返回二级名称服务器地址;
-
客户端重复步骤 4,依次向三级、四级等层级服务器查询,直至从权威服务器获取目标 IP;
-
若权威服务器无对应记录,返回 “负响应”;客户端可尝试向其他已配置的 DNS 服务器发起查询。
示例(解析www.example.com)

- 客户端向本地名称服务器发送
www.example.com的解析请求; - 本地名称服务器缓存无该记录,返回根名称服务器
a.rootserver.net的地址; - 客户端向根服务器发送查询请求,根服务器返回
.com顶级名称服务器地址; - 客户端向
.com顶级服务器发送查询请求,顶级服务器返回example.com二级名称服务器地址; - 客户端向
example.com二级服务器发送查询请求,二级服务器返回www.example.com权威名称服务器地址; - 客户端向权威服务器发送查询请求,权威服务器返回
www.example.com的 IP 地址; - 客户端获取 IP 地址,完成解析流程。
2.3 递归与迭代查询对比
| 维度 | 递归查询 | 迭代查询 |
|---|---|---|
| 核心主体 | 本地名称服务器 | 客户端自身 |
| 客户端操作 | 仅发送 1 次请求,等待最终结果返回 | 依次向多台服务器主动发送请求 |
| 服务器角色 | 主动代理完成全流程查询 | 仅返回下一级服务器地址,不代理 |
| 效率 | 客户端侧效率高(无需自主操作) | 服务器侧负载低(仅做地址指引) |
3.DNS 资源记录
DNS 区域中的资源记录(RR,Resource Record)用于存储区域内特定域名 / 对象的解析信息,通用格式如下:
owner-name TTL class type data
server.liu.cloud. 86400 IN A 10.1.8.10
字段说明
| 字段名 | 含义 |
|---|---|
| owner-name | 资源记录对应的域名 / 主机名(如 server.liu.cloud) |
| TTL | 记录的缓存时长(单位:秒),决定 DNS 解析器缓存该记录的有效时间 |
| class | 记录类别,互联网场景下几乎均为 IN(Internet) |
| type | 记录类型(核心类型:A、CNAME、PTR、MX、NS 等) |
| data | 记录的具体数据,格式随记录类型变化(如 A 记录对应 IP 地址) |
4.主机和资源记录
任何主机(客户端 / 服务器)在 DNS 中需配置的核心资源记录:
- 至少 1 条 A 记录(IPv4)或 AAAA 记录(IPv6);
- 用于 IP 反向解析的 PTR 记录;
- 可选的 1 条或多条 CNAME 记录(别名记录)。
DNS 区域(Zone)需配置的核心资源记录:
- 唯一的 SOA 记录(授权开始记录);
- 每个权威名称服务器对应的 NS 记录;
- 可选的 1 条或多条 MX 记录(邮件交换记录);
- 可选的 1 条或多条 SRV 记录(服务定位记录)。
5.配置权威名称服务器
5.1 权威名称服务器架构
权威名称服务器是存储 DNS 资源记录、并为管辖区域提供权威解析答案的核心服务器。Linux 系统中常用 Berkeley Internet Name Domain(BIND)软件实现该功能,BIND 支持将权威服务器配置为两类角色:
- 主服务器(Primary/Master):区域记录的核心管理节点,存储区域文件的原始版本;
- 辅助服务器(Secondary/Slave):通过 “区域传输” 机制,定期从主服务器同步区域文件的最新版本,提升解析可用性。
注意:同一台名称服务器可同时作为某区域的主服务器、另一区域的辅助服务器;BIND 9.16 ESV 及后续版本中,
master/slave术语已逐步替换为primary/secondary。
域名注册与权威服务器配置要求
注册新 DNS 域名时,需向注册商提供该域名所有公共权威名称服务器的域名和 IP 地址;注册商会将该信息写入父域的区域文件(NS/A/AAAA 记录),确保 DNS 解析器能定位到目标名称服务器。为保障可靠性,建议至少配置 2 台公共 DNS 服务器,且部署在不同网络站点,避免单点故障。
权威服务器部署策略
并非所有权威服务器都需公开:可将主服务器配置为私有节点(仅管理区域文件),辅助服务器配置为公共节点(对外提供权威解析),既能保障外部客户端的解析需求,又能保护主服务器免受外网攻击。
架构示例 1:外部客户端解析

解析流程:客户端的缓存名称服务器首先查询根名称服务器 → 根服务器指引至 .com 顶级服务器 → 顶级服务器返回 laoma.cloud 的 NS 记录 → 缓存服务器查询 laoma.cloud 的公共辅助服务器 → 获取最终解析结果。
架构示例 2:内部客户端解析

优化方案:部署内部辅助权威服务器,内部客户端解析本地域名时无需访问外网,既提升解析效率,又增强安全性。

5.2 安装 BIND
BIND 是 Linux 系统中主流的 DNS 服务软件,通过以下命令完成安装:
# 安装 BIND 服务端及工具包
yum install -y bind bind-utils
软件包说明
bind:BIND 服务端核心包,提供 DNS 服务器运行能力;bind-utils:BIND 配套工具包(如 dig、nslookup 等),用于 DNS 解析测试与调试。
默认配置说明
BIND 安装后默认配置为 “递归缓存名称服务器”,核心特性:
- 仅对本地主机(localhost)及相关域 / 地址提供解析,减轻根服务器负载;
- 仅监听 IPv4/IPv6 回环接口(127.0.0.1、::1)的 53 端口(UDP/TCP);
- 仅允许本地主机上的程序访问。
5.3 配置 BIND
BIND 的核心配置文件为 /etc/named.conf(由 root 用户 /named 组拥有,权限 0640,SELinux 类型 named_conf_t),该文件控制 BIND 基础运行逻辑,并指定区域文件的存储路径(默认 /var/named)。
完整的 BIND 配置流程包含以下核心步骤:
- 配置地址匹配列表;
- 配置 named 监听的 IP 地址;
- 配置客户端访问控制策略;
- 配置 DNS 区域(Zone);
- 编写区域解析文件。
5.4 完整配置实操示例
1. 安装软件包
[root@server ~ 11:13:39]# yum install -y bind bind-utils
2. 修改主配置文件 /etc/named.conf
[root@server ~ 13:49:41]# vim /etc/named.conf
options {
# 监听回环地址 + 业务地址 10.1.8.10
listen-on port 53 { 127.0.0.1;10.1.8.10; };
# 监听 IPv6 回环地址
listen-on-v6 port 53 { ::1; };
# 区域文件根目录
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";
# 允许本地主机 + 10.1.8.0/24 网段查询
allow-query { localhost;10.1.8.0/24; };
# 关闭 DNSSEC 安全校验(实验环境)
dnssec-enable no;
dnssec-validation no;
};
# 新增正向解析区域:liu.cloud(主服务器)
zone "liu.cloud" IN {
type master;
file "liu.cloud.zone";
};
# 新增反向解析区域:8.1.10.in-addr.arpa(主服务器)
zone "8.1.10.in-addr.arpa" IN {
type master;
file "10.1.8.zone";
};
3. 准备区域文件
# 进入区域文件目录
[root@server ~ 15:12:12]# cd /var/named/
# 验证主配置文件语法
[root@server named 15:24:54]# named-checkconf /etc/named.conf
# 复制模板文件创建正向区域文件
[root@server named 15:13:55]# cp -a named.localhost liu.cloud.zone
# 编辑正向区域文件
[root@server named 15:14:30]# vim liu.cloud.zone
$TTL 1D # 默认 TTL 1 天
@ IN SOA dns.liu.cloud. admin.liu.cloud (
0 ; 序列号
1D ; 刷新间隔 1 天
1H ; 重试间隔 1 小时
1W ; 过期时间 1 周
3H ) ; 负缓存时长 3 小时
# NS 记录:指定 liu.cloud 域的权威服务器
@ IN NS dns.liu.cloud.
# A 记录:dns.liu.cloud → 10.1.8.10
dns IN A 10.1.8.10
# A 记录:server.liu.cloud → 10.1.8.10
server IN A 10.1.8.10
# A 记录:client.liu.cloud → 10.1.8.11
client IN A 10.1.8.11
# A 记录:www.liu.cloud → 10.1.8.100
www IN A 10.1.8.100
# MX 记录:liu.cloud 邮件服务器(优先级 10)
@ IN MX 10 mail.liu.cloud.
# A 记录:mail.liu.cloud → 10.1.8.200
mail IN A 10.1.8.200
# CNAME 记录:web.liu.cloud 是 www.liu.cloud 的别名
web IN CNAME www
# 验证正向区域文件语法
[root@server named 15:19:42]# named-checkzone liu.cloud liu.cloud.zone
# 正常输出:zone liu.cloud/IN: loaded serial 0 OK
# 复制正向文件创建反向区域文件
[root@server named 15:20:08]# cp -a liu.cloud.zone 10.1.8.zone
# 编辑反向区域文件
[root@server named 15:20:40]# vim 10.1.8.zone
$TTL 1D
@ IN SOA dns.liu.cloud. admin.liu.cloud (
0 ; 序列号
1D ; 刷新间隔
1H ; 重试间隔
1W ; 过期时间
3H ) ; 负缓存时长
# NS 记录
@ IN NS dns.liu.cloud.
# PTR 记录:10.1.8.10 → dns.liu.cloud
10 IN PTR dns.liu.cloud.
# PTR 记录:10.1.8.10 → server.liu.cloud
10 IN PTR server.liu.cloud.
# PTR 记录:10.1.8.11 → client.liu.cloud
11 IN PTR client.liu.cloud.
# PTR 记录:10.1.8.11 → student.liu.cloud
11 IN PTR student.liu.cloud.
# PTR 记录:10.1.8.100 → www.liu.cloud
100 IN PTR www.liu.cloud.
# PTR 记录:10.1.8.100 → web.liu.cloud
100 IN PTR web.liu.cloud.
# PTR 记录:10.1.8.200 → mail.liu.cloud
200 IN PTR mail.liu.cloud.
# 验证反向区域文件语法
[root@server named 15:24:54]# named-checkconf /etc/named.conf
[root@server named 15:25:39]# named-checkzone 10.1.8 /var/named/10.1.8.zone
# 正常输出:zone 10.1.8/IN: loaded serial 0 OK
4. 启动并启用 named 服务
# 开机自启 + 立即启动 named 服务
[root@server named 15:35:40]# systemctl enable named --now
# 正常输出:Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
# 关闭防火墙(实验环境)
[root@server named 15:36:06]# systemctl stop firewalld
5 客户端测试
方式 1:配置 DNS 后通过 ping 测试
# 客户端配置 DNS 服务器为 10.1.8.10
[root@client ~ 16:03:20]# nmcli connection modify ens33 ipv4.dns 10.1.8.10
# 重新加载网络连接
[root@client ~ 16:03:55]# nmcli connection up ens33
# 正常输出:连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/26)
# 测试 server.liu.cloud 解析
[root@client ~ 16:06:59]# ping -c1 server
PING server.liu.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from server.liu.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.448 ms
--- server.liu.cloud ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.448/0.448/0.448/0.000 ms
# 测试 www.liu.cloud 解析(目标主机未开机,故不可达)
[root@client ~ 16:07:31]# ping -c1 www
PING www.liu.cloud (10.1.8.100) 56(84) bytes of data.
From client.liu.cloud (10.1.8.11) icmp_seq=1 Destination Host Unreachable
--- www.liu.cloud ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
# 测试 mail.liu.cloud 解析(目标主机未开机)
[root@client ~ 16:08:30]# ping -c1 mail
PING mail.liu.cloud (10.1.8.200) 56(84) bytes of data.
From client.liu.cloud (10.1.8.11) icmp_seq=1 Destination Host Unreachable
--- mail.liu.cloud ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
# 测试 dns.liu.cloud 解析
[root@client ~ 16:08:43]# ping -c1 dns
PING dns.liu.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from server.liu.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.575 ms
--- dns.liu.cloud ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.575/0.575/0.575/0.000 ms
# 测试 client.liu.cloud 解析
[root@client ~ 16:08:53]# ping client
PING client.liu.cloud (10.1.8.11) 56(84) bytes of data.
64 bytes from client.liu.cloud (10.1.8.11): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from client.liu.cloud (10.1.8.11): icmp_seq=2 ttl=64 time=0.094 ms
# 测试外网域名解析(验证递归功能)
[root@client ~ 16:09:22]# ping baidu.com
PING baidu.com (110.242.74.102) 56(84) bytes of data.
64 bytes from 110.242.74.102 (110.242.74.102): icmp_seq=1 ttl=128 time=37.0 ms
方式 2:通过 dig 工具精准测试
# 测试 www.liu.cloud A 记录
[root@client ~ 15:47:28]# dig @10.1.8.10 www.liu.cloud
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.1.8.10 www.liu.cloud
; (1 server found)
......
;; ANSWER SECTION:
www.liu.cloud. 86400 IN A 10.1.8.100
......
# 过滤 ANSWER 段结果
[root@client ~ 15:58:34]# dig @10.1.8.10 www.liu.cloud |grep -A1 ANSWER
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
--
;; ANSWER SECTION:
www.liu.cloud. 86400 IN A 10.1.8.100
# 显式指定查询 A 记录
[root@client ~ 15:59:25]# dig @10.1.8.10 www.liu.cloud A
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.1.8.10 www.liu.cloud A
; (1 server found)
......
;; ANSWER SECTION:
www.liu.cloud. 86400 IN A 10.1.8.100
......
# 测试 MX 记录
[root@client ~ 15:59:52]# dig @10.1.8.10 liu.cloud MX
......
;; ANSWER SECTION:
liu.cloud. 86400 IN MX 10 mail.liu.cloud.
......
# 测试 mail.liu.cloud A 记录
[root@client ~ 16:00:08]# dig @10.1.8.10 mail.liu.cloud
......
;; ANSWER SECTION:
mail.liu.cloud. 86400 IN A 10.1.8.200
......
# 反向解析:10.1.8.200 → mail.liu.cloud
[root@client ~ 16:00:33]# dig @10.1.8.10 -x 10.1.8.200
......
;; ANSWER SECTION:
200.8.1.10.in-addr.arpa. 86400 IN PTR mail.liu.cloud.
......
# 反向解析:10.1.8.100 → www/web.liu.cloud
[root@client ~ 16:01:01]# dig @10.1.8.10 -x 10.1.8.100
......
;; ANSWER SECTION:
100.8.1.10.in-addr.arpa. 86400 IN PTR web.liu.cloud.
100.8.1.10.in-addr.arpa. 86400 IN PTR www.liu.cloud.
......
# 测试 CNAME 记录:web.liu.cloud → www.liu.cloud
[root@client ~ 16:01:28]# dig @10.1.8.10 web.liu.cloud
......
;; ANSWER SECTION:
web.liu.cloud. 86400 IN CNAME www.liu.cloud.
www.liu.cloud. 86400 IN A 10.1.8.100
......
# 测试 server.liu.cloud A 记录
[root@client ~ 16:01:48]# dig @10.1.8.10 server.liu.cloud
......
;; ANSWER SECTION:
server.liu.cloud. 86400 IN A 10.1.8.10
......。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)