DNS 服务器

1.DNS 层次结构

DNS 采用层级化的域名命名体系,从顶层到下层依次分为:

  • 根域:DNS 层级体系的最顶层,以单个英文句点 . 表示,是所有域名的最终溯源起点;
  • 顶级域(一级域):根域的下一级,分为两类核心类型 —— 通用顶级域(如 .com.net.org)和国家代码顶级域(如 .cn.us),由互联网号码分配机构(IANA)统一管理;
  • 二级域:顶级域下的层级,是各类组织 / 机构申请使用的核心域名(如 liu.cloudredhat.fun),具备独立的管理权限;
  • 子域:二级域向下延伸的层级(如 lab.liu.cloud 为三级域),可根据业务需求无限层级扩展。

在这里插入图片描述

核心术语说明

术语 定义
Domain 以通用名结尾的资源记录集合,代表 DNS 命名空间的完整子树(示例:laoma.cloud
Subdomain 某一域的子树域,继承父域的命名空间(示例:lab.liu.cloudliu.cloud 的子域)
Zone 特定名称服务器直接管辖的域范围(可包含整个域或部分子域),支持将子域委派至其他名称服务器管理

2.DNS 查询

主机发起的 DNS 查询类型由请求报头的 RD 字段决定,核心分为递归查询和迭代查询两类:

  • RD=1:递归查询(客户端默认使用的查询方式);
  • RD=0:迭代查询。

2.1 递归查询

核心逻辑

本地名称服务器为核心代理,客户端仅需发送一次查询请求,后续所有跨层级的 DNS 查询操作均由本地名称服务器完成,客户端只需等待最终解析结果返回。

完整流程
  1. 客户端向本地名称服务器提交 DNS 域名解析请求;

  2. 本地名称服务器优先查询本地缓存:

    • 若缓存中存在目标域名的解析记录,直接将结果返回给客户端;
    • 若缓存无记录,则以客户端身份向根名称服务器发起查询请求;
  3. 根名称服务器返回目标域名所属顶级域对应的顶级名称服务器地址;

  4. 本地名称服务器向该顶级名称服务器发送查询请求;

  5. 顶级名称服务器优先查询本地缓存:

    • 若存在解析记录,直接返回给本地名称服务器,再由其转发至客户端;
    • 若不存在记录,返回目标域名所属二级域对应的二级名称服务器地址;
  6. 本地名称服务器重复步骤 4-5,依次向三级、四级等层级的名称服务器查询,直至从权威名称服务器获取最终解析记录;

  7. 本地名称服务器将最终解析结果返回给客户端,并将该记录缓存至本地,供后续同域名查询复用。

补充说明:若权威服务器无对应域名记录,会向客户端返回 “负响应”(查询失败);若配置了转发器,权威服务器会通过转发器继续查询;若客户端配置多台 DNS 服务器,本地名称服务器会依次尝试向其他服务器查询。

示例(解析www.example.com

在这里插入图片描述

  1. 客户端向本地名称服务器 dns.example.com 发送 www.example.com 的解析请求;
  2. 本地名称服务器缓存无该记录,向根名称服务器 a.rootserver.net 发起查询;
  3. 根名称服务器返回 .com 顶级名称服务器的地址;
  4. 本地名称服务器向 .com 顶级名称服务器发送查询请求;
  5. .com 顶级名称服务器返回 example.com 二级名称服务器的地址;
  6. 本地名称服务器向 example.com 二级名称服务器发送查询请求;
  7. example.com 二级名称服务器返回 www.example.com 权威名称服务器的地址;
  8. 本地名称服务器向 www.example.com 权威名称服务器发送查询请求;
  9. 权威名称服务器返回 www.example.com 对应的 IP 地址;
  10. 本地名称服务器将 IP 地址返回给客户端,完成解析流程。

2.2 迭代查询

核心逻辑

客户端自身为核心,所有查询操作由客户端自主完成。客户端依次向本地名称服务器、根服务器、顶级服务器、权威服务器发送请求,每一级服务器仅返回 “下一级服务器地址”,直至客户端从权威服务器获取最终 IP 地址。

完整流程
  1. 客户端向本地名称服务器发送 DNS 查询请求;

  2. 本地名称服务器查询本地缓存:

    • 若存在解析记录,直接返回给客户端;
    • 若不存在记录,返回根名称服务器的地址;
  3. 客户端向根名称服务器发送查询请求,根服务器返回顶级名称服务器地址;

  4. 客户端向顶级名称服务器发送查询请求,顶级服务器返回二级名称服务器地址;

  5. 客户端重复步骤 4,依次向三级、四级等层级服务器查询,直至从权威服务器获取目标 IP;

  6. 若权威服务器无对应记录,返回 “负响应”;客户端可尝试向其他已配置的 DNS 服务器发起查询。

示例(解析www.example.com

在这里插入图片描述

  1. 客户端向本地名称服务器发送 www.example.com 的解析请求;
  2. 本地名称服务器缓存无该记录,返回根名称服务器 a.rootserver.net 的地址;
  3. 客户端向根服务器发送查询请求,根服务器返回 .com 顶级名称服务器地址;
  4. 客户端向 .com 顶级服务器发送查询请求,顶级服务器返回 example.com 二级名称服务器地址;
  5. 客户端向 example.com 二级服务器发送查询请求,二级服务器返回 www.example.com 权威名称服务器地址;
  6. 客户端向权威服务器发送查询请求,权威服务器返回 www.example.com 的 IP 地址;
  7. 客户端获取 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 配置流程包含以下核心步骤:

  1. 配置地址匹配列表;
  2. 配置 named 监听的 IP 地址;
  3. 配置客户端访问控制策略;
  4. 配置 DNS 区域(Zone);
  5. 编写区域解析文件。

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
......
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐