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)

🎯 总结

通过本文的学习和实验,你应该掌握了:

  1. DNS 核心原理:层次结构、递归与迭代查询、资源记录类型
  2. 权威 DNS 搭建:BIND 的安装、配置、区域文件编写
  3. 缓存 DNS 搭建:Unbound 和 Dnsmasq 两种方案
  4. 客户端工具:dig、nslookup、host、getent 的使用
  5. 故障排查:常见错误码分析、日志查看、跟踪查询

DNS 是互联网基础设施的核心,深入理解其工作原理对于网络运维和系统管理至关重要。建议在生产环境部署前,先在实验环境中充分测试配置。

Logo

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

更多推荐