DNS 服务器学习笔记:核心总结与实验指南
在 dns-client 上配置 DNS 服务器地址# 测试正向解析(域名 → IP)# 测试 CNAME 别名# 测试反向解析(IP → 域名)# 使用 getent 按系统顺序解析DNS 核心原理:层次结构、递归与迭代查询、资源记录类型权威 DNS 搭建:BIND 的安装、配置、区域文件编写缓存 DNS 搭建:Unbound 和 Dnsmasq 两种方案客户端工具:dig、nslookup、h
·
DNS 服务器学习笔记:核心总结与实验指南
📌 一、文章核心重点总结
1. DNS 基础知识
什么是 DNS?
DNS(Domain Name System,域名系统)是互联网的“电话簿”,负责将人类易记的域名(如 www.baidu.com)转换为机器可读的 IP 地址(如 110.242.68.66)。
DNS 三大组成部分
| 组件 | 说明 |
|---|---|
| 域名 | 主机的字符标识方式,例如 www.google.com |
| 域名解析服务器 | 存储域名与 IP 映射关系的数据库服务器 |
| 分布式系统 | 没有单点故障,每个服务器只保存部分映射记录 |
DNS 查询的两种方式
| 查询类型 | 别称 | 工作方式 | 发起方 | 接收方 |
|---|---|---|---|---|
| 递归查询 | “甩锅式” | 客户端只发一次请求,DNS 服务器负责查到底 | 客户端 | 本地 DNS 服务器 |
| 迭代查询 | “跑腿式” | 客户端依次询问多个 DNS 服务器,自己跑完全程 | 本地 DNS 服务器 | 根/顶级/权威 DNS 服务器 |
🌟 实际互联网流程:客户端 → 本地DNS(递归)→ 根/顶级/权威(迭代)→ 返回结果
2. DNS 层次结构与术语
根域 (.)
├── 顶级域 (TLD)
│ ├── .com (通用顶级域 gTLD)
│ ├── .cn (国家代码顶级域 ccTLD)
│ └── .org
└── 二级域 (如 laogao.cloud)
└── 子域 (如 lab.laogao.cloud)
| 术语 | 含义 |
|---|---|
| Domain | DNS 命名空间的整个子树 |
| Subdomain | 另一个域的完整子树 |
| Zone | 特定名称服务器直接负责的域(可委派子域) |
3. DNS 资源记录类型详解
资源记录通用模板
owner-name TTL class type data
server.laogao.cloud. 300 IN A 192.168.1.10
常用记录类型速查表
| 类型 | 用途 | 示例 |
|---|---|---|
| A | 域名 → IPv4 地址 | server.laogao.cloud. IN A 172.25.254.254 |
| AAAA | 域名 → IPv6 地址 | a.root-servers.net. IN AAAA 2001:503:ba3e::2:30 |
| CNAME | 别名指向规范名称 | www-dev IN CNAME lab.laogao.cloud. |
| PTR | IP → 域名(反向解析) | 10.1.8.10.in-addr.arpa. IN PTR dns.laogao.cloud. |
| NS | 指定权威名称服务器 | laogao.cloud. IN NS dns.laogao.cloud. |
| SOA | 起始授权机构,区域运行信息 | 包含序列号、刷新时间等 |
| MX | 邮件交换服务器 | laogao.cloud. IN MX 10 mail.laogao.cloud. |
| TXT | 任意文本(验证、SPF等) | "v=spf1 mx -all" |
| SRV | 服务定位 | _ldap._tcp.laogao.cloud. IN SRV 0 100 389 server0 |
4. 常用 DNS 客户端命令
| 命令 | 功能 | 示例 |
|---|---|---|
ping |
测试连通性并显示解析 IP | ping www.huawei.com |
ipconfig/displaydns |
查看 Windows DNS 缓存 | ipconfig/displaydns | findstr huawei |
ipconfig/flushdns |
清空 Windows DNS 缓存 | ipconfig/flushdns |
whois |
查询域名注册信息 | whois qq.com |
host |
简单 DNS 查询 | host -t NS huawei.com |
dig |
强大的 DNS 调试工具 | dig +short www.qq.com |
nslookup |
交互/非交互式查询 | nslookup www.qq.com 114.114.114.114 |
getent |
按系统顺序解析主机名 | getent hosts student.laogao.cloud |
🧪 二、实验部分详细指南
实验拓扑规划
| 主机名 | IP 地址 | 角色 |
|---|---|---|
dns-server |
10.1.8.10/24 | 权威名称服务器 (BIND) |
dns-client |
10.1.8.11/24 | DNS 客户端 |
cache-server |
10.1.8.20/24 | 缓存名称服务器 (可选 Unbound/Dnsmasq) |
实验一:搭建 BIND 权威名称服务器
步骤 1:安装 BIND 软件包
# 在 dns-server 上执行
[root@dns-server ~]# yum install -y bind bind-utils
# 软件包说明:
# bind - DNS 服务端主程序
# bind-utils - DNS 客户端工具集(dig, nslookup, host)
步骤 2:编辑主配置文件 /etc/named.conf
[root@dns-server ~]# vim /etc/named.conf
# 定义访问控制列表(给 IP 段起别名)
acl trusted-nets {
10.1.8.0/24; # 允许局域网段
127.0.0.1; # 允许本机
};
options {
# 监听哪些 IP 地址的 53 端口
listen-on port 53 { 127.0.0.1; 10.1.8.10; };
listen-on-v6 port 53 { ::1; };
# 允许所有主机查询(权威服务器必须开放)
allow-query { any; };
# 只允许可信网段递归查询
recursion yes;
allow-recursion { trusted-nets; };
# 限制区域传输(防止数据泄露)
allow-transfer { none; };
# 关闭 DNSSEC 验证(实验环境简化)
dnssec-enable no;
dnssec-validation no;
};
# 定义正向解析区域
zone "laogao.cloud" {
type master; # 主服务器角色
file "laogao.cloud.zone"; # 区域文件路径(相对于 /var/named)
};
# 定义反向解析区域(10.1.8.0/24 网段)
zone "8.1.10.in-addr.arpa" {
type master;
file "10.1.8.zone";
};
步骤 3:创建正向区域文件 /var/named/laogao.cloud.zone
[root@dns-server ~]# touch /var/named/laogao.cloud.zone
[root@dns-server ~]# vim /var/named/laogao.cloud.zone
$TTL 3600 # 默认缓存时间 1 小时
@ IN SOA dns.laogao.cloud. root.laogao.cloud. (
2025010101 ; Serial # 序列号,每次修改必须增大
1D ; Refresh # 从服务器刷新间隔 1 天
1H ; Retry # 刷新失败重试间隔 1 小时
1W ; Expire # 数据过期时间 1 周
3H ; Minimum # 否定缓存时间 3 小时
)
@ IN NS dns.laogao.cloud. # 指定权威 NS 记录
; A 记录(域名 → IPv4)
dns IN A 10.1.8.10 # DNS 服务器自身
server IN A 10.1.8.10 # 通用服务器别名
client IN A 10.1.8.11 # 客户端
www IN A 10.1.8.200 # 网站服务器
mail IN A 10.1.8.253 # 邮件服务器
; CNAME 记录(别名)
student IN CNAME client.laogao.cloud. # student 是 client 的别名
; MX 记录(邮件交换器,数字越小优先级越高)
@ IN MX 10 mail.laogao.cloud.
步骤 4:创建反向区域文件 /var/named/10.1.8.zone
[root@dns-server ~]# vim /var/named/10.1.8.zone
$TTL 1D
@ IN SOA dns.laogao.cloud. root.laogao.cloud. (
2025010101 ; Serial
1D ; Refresh
1H ; Retry
1W ; Expire
3H ; Minimum
)
@ IN NS dns.laogao.cloud.
; PTR 记录(IP → 域名),只需写 IP 的最后一段
10 IN PTR dns.laogao.cloud.
10 IN PTR server.laogao.cloud.
11 IN PTR client.laogao.cloud.
200 IN PTR www.laogao.cloud.
253 IN PTR mail.laogao.cloud.
步骤 5:设置文件权限和 SELinux 标签
[root@dns-server ~]# chmod 640 /var/named/*.zone
[root@dns-server ~]# chown root:named /var/named/*.zone
[root@dns-server ~]# chcon -t named_zone_t /var/named/*.zone
步骤 6:验证配置并启动服务
# 验证主配置文件语法
[root@dns-server ~]# named-checkconf
# 无输出表示语法正确
# 验证正向区域文件
[root@dns-server ~]# named-checkzone laogao.cloud /var/named/laogao.cloud.zone
zone laogao.cloud/IN: loaded serial 2025010101
OK
# 验证反向区域文件
[root@dns-server ~]# named-checkzone 8.1.10.in-addr.arpa /var/named/10.1.8.zone
zone 8.1.10.in-addr.arpa/IN: loaded serial 2025010101
OK
# 启动并启用服务
[root@dns-server ~]# systemctl enable named --now
# 配置防火墙放行 DNS 服务
[root@dns-server ~]# firewall-cmd --add-service=dns --permanent
[root@dns-server ~]# firewall-cmd --reload
# 查看服务状态
[root@dns-server ~]# systemctl status named
实验二:客户端测试 DNS 解析
方法 1:配置客户端使用自定义 DNS
# 在 dns-client 上配置 DNS 服务器地址
[root@dns-client ~]# nmcli connection modify ens33 \
ipv4.method manual \
ipv4.address 10.1.8.11/24 \
ipv4.gateway 10.1.8.2 \
ipv4.dns 10.1.8.10 \
autoconnect yes
[root@dns-client ~]# nmcli connection up ens33
# 测试正向解析(域名 → IP)
[root@dns-client ~]# ping -c 2 dns.laogao.cloud
PING dns.laogao.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from dns.laogao.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.251 ms
# 测试 CNAME 别名
[root@dns-client ~]# ping -c 2 student.laogao.cloud
PING client.laogao.cloud (10.1.8.11) 56(84) bytes of data.
# 测试反向解析(IP → 域名)
[root@dns-client ~]# host 10.1.8.10
10.8.1.10.in-addr.arpa domain name pointer dns.laogao.cloud.
# 使用 getent 按系统顺序解析
[root@dns-client ~]# getent hosts student.laogao.cloud
10.1.8.11 client.laogao.cloud student.laogao.cloud
方法 2:使用 dig 工具详细查询
# 如果客户端没有 dig,先安装
[root@dns-client ~]# yum install -y bind-utils
# 查询 A 记录(指定 DNS 服务器)
[root@dns-client ~]# dig @10.1.8.10 www.laogao.cloud
# 查询 NS 记录(权威名称服务器)
[root@dns-client ~]# dig @10.1.8.10 laogao.cloud NS
# 查询 MX 记录(邮件服务器)
[root@dns-client ~]# dig @10.1.8.10 laogao.cloud MX
# 查询 PTR 记录(反向解析)
[root@dns-client ~]# dig @10.1.8.10 -x 10.1.8.200
# 只显示精简结果
[root@dns-client ~]# dig +short @10.1.8.10 www.laogao.cloud
10.1.8.200
# 只显示回答部分
[root@dns-client ~]# dig +nocmd +noall +answer @10.1.8.10 www.laogao.cloud
www.laogao.cloud. 3600 IN A 10.1.8.200
方法 3:使用 nslookup 交互式查询
[root@dns-client ~]# nslookup
> server 10.1.8.10 # 指定 DNS 服务器
Default server: 10.1.8.10
> set type=A # 设置查询类型为 A 记录
> www.laogao.cloud # 查询域名
Server: 10.1.8.10
Address: 10.1.8.10#53
Name: www.laogao.cloud
Address: 10.1.8.200
> set type=PTR # 切换为反向查询
> 10.1.8.200
Server: 10.1.8.10
Address: 10.1.8.10#53
200.8.1.10.in-addr.arpa name = www.laogao.cloud.
> exit # 退出交互模式
实验三:搭建缓存名称服务器(Unbound)
为什么需要缓存服务器?
- 减少跨互联网的 DNS 流量
- 加速重复查询的响应速度
- 作为局域网内的 DNS 代理
安装与配置 Unbound
# 在 cache-server (10.1.8.20) 上执行
[root@cache-server ~]# yum install -y unbound
# 编辑配置文件
[root@cache-server ~]# vim /etc/unbound/unbound.conf
server:
# 监听所有网络接口
interface: 0.0.0.0
interface: ::0
interface-automatic: no
# 访问控制:只允许局域网客户端查询
access-control: 127.0.0.0/8 allow
access-control: 10.1.8.0/24 allow
access-control: 0.0.0.0/0 refuse # 拒绝其他所有
# 转发所有查询到权威 DNS 服务器
forward-zone:
name: "."
forward-addr: 10.1.8.10 # 转发到我们自己的权威服务器
# 跳过 DNSSEC 验证(实验环境)
domain-insecure: "laogao.cloud"
harden-dnssec-stripped: no
# 验证配置文件语法
[root@cache-server ~]# unbound-checkconf
unbound-checkconf: no errors in /etc/unbound/unbound.conf
# 启动服务
[root@cache-server ~]# systemctl enable unbound --now
# 配置防火墙
[root@cache-server ~]# firewall-cmd --add-service=dns --permanent
[root@cache-server ~]# firewall-cmd --reload
缓存管理命令
# 导出当前缓存到文件
[root@cache-server ~]# unbound-control dump_cache > /tmp/dns_cache.txt
# 查看缓存内容
[root@cache-server ~]# head -20 /tmp/dns_cache.txt
# 清空特定域名的缓存
[root@cache-server ~]# unbound-control flush student.laogao.cloud
ok
# 清空整个区域的缓存
[root@cache-server ~]# unbound-control flush_zone laogao.cloud
ok
# 从文件导入缓存
[root@cache-server ~]# unbound-control load_cache < /tmp/dns_cache.txt
客户端测试缓存服务器
# 在 dns-client 上临时使用缓存服务器测试
[root@dns-client ~]# dig @10.1.8.20 client.laogao.cloud
# 第一次查询(缓存未命中,会稍慢)
;; Query time: 45 msec
# 第二次查询(缓存命中,很快)
[root@dns-client ~]# dig @10.1.8.20 client.laogao.cloud
;; Query time: 0 msec
实验四:配置 Dnsmasq 轻量级缓存服务器
Dnsmasq 特点
- 集 DNS 缓存、DHCP、TFTP 于一体
- 配置简单,适合小型网络
- 可指定不同域名使用不同上游 DNS
配置示例
# 安装 Dnsmasq
[root@cache-server ~]# yum install -y dnsmasq
# 备份默认配置
[root@cache-server ~]# cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
# 编辑配置文件
[root@cache-server ~]# vim /etc/dnsmasq.conf
# 监听地址(本机所有接口)
listen-address=0.0.0.0
# 上游 DNS 服务器配置文件
resolv-file=/etc/resolv.dnsmasq.conf
# 严格按顺序使用上游 DNS
strict-order
# 自定义解析(屏蔽广告)
address=/ad.youku.com/127.0.0.1
address=/ad.iqiyi.com/127.0.0.1
# 特定域名使用特定 DNS
server=/laogao.cloud/10.1.8.10 # 内网域名用自己的服务器
server=/google.com/8.8.8.8 # Google 域名用公共 DNS
server=/baidu.com/114.114.114.114 # 国内网站用国内 DNS
# 缓存大小(默认 150 条,这里设 1000 条)
cache-size=1000
# 不允许 /etc/hosts 覆盖
# no-hosts
# 日志记录
log-queries
log-facility=/var/log/dnsmasq.log
# 创建上游 DNS 配置文件
[root@cache-server ~]# cat > /etc/resolv.dnsmasq.conf << EOF
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF
# 测试配置语法
[root@cache-server ~]# dnsmasq --test
dnsmasq: syntax check OK.
# 启动服务
[root@cache-server ~]# systemctl enable dnsmasq --now
# 查看日志
[root@cache-server ~]# tail -f /var/log/dnsmasq.log
🔧 三、DNS 故障排查技巧
1. 常见问题速查表
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
dig 超时 |
防火墙阻止 UDP 53 | firewall-cmd --list-all |
返回 SERVFAIL |
权威服务器不可达 | dig +trace domain.com |
返回 NXDOMAIN |
域名不存在或孤立 CNAME | dig domain.com + 检查区域文件 |
返回 REFUSED |
访问控制拒绝 | 检查 allow-query 指令 |
| 反向解析失败 | 缺少 PTR 记录 | dig -x IP + 检查反向区域 |
| 主从数据不一致 | 序列号未更新 | 检查 SOA 中的 Serial 值 |
2. 故障排查命令实战
# 1. 检查本地 DNS 配置
[root@client ~]# cat /etc/resolv.conf
nameserver 10.1.8.10
# 2. 测试网络连通性
[root@client ~]# ping -c 3 10.1.8.10
# 3. 测试 UDP 53 端口
[root@client ~]# nc -vzu 10.1.8.10 53
Connection to 10.1.8.10 53 port [udp/domain] succeeded!
# 4. 跟踪完整解析路径(从根域开始)
[root@client ~]# dig +trace www.baidu.com
# 5. 强制使用 TCP 模式查询
[root@client ~]# dig +tcp www.laogao.cloud
# 6. 查看 DNS 服务器日志
[root@dns-server ~]# journalctl -u named -f
# 7. 测试区域传输(AXFR)- 验证从服务器同步
[root@client ~]# dig axfr @10.1.8.10 laogao.cloud
# 8. 对比权威答案和缓存答案
[root@client ~]# dig @10.1.8.10 www.laogao.cloud +aaonly # 只接受权威答案
3. 检查系统名称解析顺序
# 查看 nsswitch.conf 配置
[root@client ~]# cat /etc/nsswitch.conf | grep hosts
hosts: files dns myhostname
# 解析顺序:/etc/hosts → DNS → 本机主机名
# 使用 getent 验证实际解析结果
[root@client ~]# getent hosts www.laogao.cloud
10.1.8.200 www.laogao.cloud
# 对比 dig 结果(如果不同,说明可能是 hosts 文件影响)
[root@client ~]# dig +short www.laogao.cloud
10.1.8.200
📚 四、关键配置文件速查
| 文件路径 | 用途 | 所属服务 |
|---|---|---|
/etc/named.conf |
BIND 主配置文件 | bind |
/var/named/*.zone |
区域数据库文件 | bind |
/etc/unbound/unbound.conf |
Unbound 配置文件 | unbound |
/etc/dnsmasq.conf |
Dnsmasq 配置文件 | dnsmasq |
/etc/resolv.conf |
客户端 DNS 配置 | system |
/etc/nsswitch.conf |
名称解析顺序 | glibc |
/etc/hosts |
本地静态解析 | system |
/var/log/messages |
系统日志(含 named 错误) | rsyslog |
✅ 五、实验验证清单
完成实验后,请逐项验证:
- BIND 服务正常运行 (
systemctl status named) - 正向解析:
dig @10.1.8.10 dns.laogao.cloud返回10.1.8.10 - CNAME 解析:
dig @10.1.8.10 student.laogao.cloud返回10.1.8.11 - MX 解析:
dig @10.1.8.10 laogao.cloud MX返回mail.laogao.cloud - 反向解析:
dig @10.1.8.10 -x 10.1.8.11返回client.laogao.cloud - 客户端配置后
ping student.laogao.cloud成功 - 缓存服务器第二次查询时间明显缩短
- 防火墙已放行 DNS 服务 (
firewall-cmd --list-services)
🎯 总结
通过本文的学习和实验,你应该掌握了:
- DNS 核心原理:层次结构、递归与迭代查询、资源记录类型
- 权威 DNS 搭建:BIND 的安装、配置、区域文件编写
- 缓存 DNS 搭建:Unbound 和 Dnsmasq 两种方案
- 客户端工具:dig、nslookup、host、getent 的使用
- 故障排查:常见错误码分析、日志查看、跟踪查询
DNS 是互联网基础设施的核心,深入理解其工作原理对于网络运维和系统管理至关重要。建议在生产环境部署前,先在实验环境中充分测试配置。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)