Orange的运维学习日记--35.DNS拓展与故障排除
Orange的运维学习日记–35.DNS拓展与故障排除
文章目录
- Orange的运维学习日记--35.DNS拓展与故障排除
- 名称解析架构
- 名称解析来源顺序
- 使用 dig 调试 DNS 查询
- 网络连通性检查
- DNS 响应代码
- SERVFAIL 深入排查
- NXDOMAIN 常见原因
- REFUSED 常见原因
- Zone 数据层面故障
- DNS 轮询
- 缺少 PTR 记录
- 通配符记录误伤
- 区域文件尾点与名称拼接
- 循环或孤立的 CNAME 别名
- 权威服务器数据不一致
- 配置缓存名称服务器
- Unbound
- 安装
- 基本配置
- 启用与防火墙
- 客户端测试
- 管理缓存
- Dnsmasq
- 功能简介
- 安装
- 配置
- 启用与防火墙
- 客户端测试
- 支持多于三个上游服务器
- 支持多于三个上游服务器
名称解析架构
名称解析依赖客户端、本地缓存解析器、权威名称服务器及网络配置
客户端根据 /etc/nsswitch.conf
中 hosts 行和 /etc/resolv.conf
发起查询
缓存解析器对外转发查询并返回缓存结果或向权威服务器查询
权威名称服务器托管区域数据,确保记录正确并同步 SOA 序列号
网络通道需保证客户端与各级名称服务器的 UDP/TCP 53 端口互通
名称解析来源顺序
系统通过 /etc/nsswitch.conf
中 hosts 行的顺序决定名称解析方式
典型配置
hosts: files dns myhostname
- files 表示优先读取
/etc/hosts
- dns 表示接着发起 DNS 查询
- myhostname 针对本地主机名做特殊处理
使用 getent hosts <主机名>
可严格按上述顺序执行解析
getent hosts server.laoma.cloud
使用 dig 调试 DNS 查询
dig 是调查 DNS 问题的利器
-
默认查 A 记录:
dig example.com
-
指定记录类型 AAAA:
dig AAAA example.com
-
指定查询服务器和记录类型 MX:
dig @10.0.0.1 mx example.com
输出片段
- HEADER 段报告状态码和查询选项
- QUESTION 段重述查询
- ANSWER/AUTHORITY/ADDITIONAL 段列出响应记录
网络连通性检查
如果出现 connection timed out; no servers could be reached
- 核实
/etc/resolv.conf
中 DNS 服务器地址正确性 - 检查客户端防火墙或网络策略是否阻断 UDP/TCP 53
- 使用
dig +tcp
强制走 TCP 排查截断或 EDNS 问题
当响应超过默认 UDP 容量(512 字节,EDNS 可达 4096)时,解析器会切换到 TCP
DNS 响应代码
HEADER 中 status 字段报告服务器处理结果
- NOERROR 查询成功但记录可能不符合预期
- SERVFAIL 服务器与权威服务器通信失败或内部故障
- NXDOMAIN 名称不存在或被负缓存拦截
- REFUSED 服务器因策略拒绝递归查询或区域传输
SERVFAIL 深入排查
使用 dig +trace
可从根服务器开始进行迭代查询,定位链路中断位置
NXDOMAIN 常见原因
- 查询名称确实不存在
- 孤立 CNAME 指向无 A/AAAA 记录的别名
- 负缓存未过期,需等待或清理缓存
REFUSED 常见原因
- 客户端无权限递归或请求非递归查询
- 服务器策略限制导致拒绝服务
Zone 数据层面故障
DNS 轮询
同一名称配置多个 A/AAAA 记录实现简单负载分发
- 响应顺序随机化,客户端通常使用列表首元素
- 遗留旧 IP 未删除会导致部分请求指向失效地址
排查示例
for i in {1..10}; do dig example.com A +short; done
缺少 PTR 记录
- SSHD 默认对客户端 IP 执行反向查找,缺 PTR 会导致连接延迟
- 邮件服务器依赖 PTR 防垃圾邮件,缺 PTR 可能被拒收
使用 dig -x 1.2.3.4
检查反向区域并添加 PTR 记录
通配符记录误伤
通配符记录匹配所有未定义名称
*.laoma.cloud. IN A 172.25.254.254
删除特定 A 记录后仍返回通配符地址,需移除或精确化定义
区域文件尾点与名称拼接
- 短主机名不以
.
结尾会自动追加区域名 - 完整 FQDN 必须以
.
结尾避免二次拼接
示例
host IN A 10.0.0.1 ; 解析为 host.zone.com
host. IN A 10.0.0.1 ; 解析为 host
循环或孤立的 CNAME 别名
- 孤立 CNAME 指向无 A/AAAA 记录名称,返回 NXDOMAIN
- 循环 CNAME 互相指向,返回 NOERROR 但无法解析
使用 named-checkzone
或自定义脚本批量验证 CNAME 链条
权威服务器数据不一致
主从服务器返回结果不同时
-
对比 SOA 序列号:
dig @master example.com SOA dig @slave example.com SOA
-
确认主服务器更新时递增序列号并允许区域传输
-
检查网络或防火墙是否阻断 AXFR/IXFR
配置缓存名称服务器
在内部网络部署缓存名称服务器可大幅提升解析性能
Unbound
安装
yum install -y unbound
基本配置
编辑 /etc/unbound/unbound.conf
-
定义监听接口
server:interface: 10.1.8.20interface: 2001:db8:1001::f0interface-automatic: no
-
配置访问控制
access-control: 127.0.0.0/8 allow access-control: 172.25.0.0/24 allow access-control: 10.1.7.0/24 refuse
-
可选转发所有或特定域
forward-zone:name: "."forward-addr: 10.1.8.10
-
可选跳过 DNSSEC 验证
domain-insecure: laoma.cloud harden-dnssec-stripped: no
启用与防火墙
unbound-checkconf
systemctl enable --now unbound
firewall-cmd --add-service=dns --permanent
客户端测试
dig @10.1.8.20 client.laoma.cloud
dig @10.1.8.20 student.laoma.cloud
dig @10.1.8.20 dns.laoma.cloud
管理缓存
-
导出缓存
unbound-control dump_cache > dns_dump
-
清空单个记录
unbound-control flush student.laoma.cloud
-
清空整个区域
unbound-control flush_zone laoma.cloud
-
导入缓存
unbound-control load_cache < dns_dump
Dnsmasq
功能简介
Dnsmasq 集成 DNS 缓存、DHCP、PXE 等功能,适合个人或小型网络
安装
yum install -y dnsmasq
配置
编辑 /etc/dnsmasq.conf
resolv-file
指定上游 DNS 列表strict-order
按顺序使用上游服务器listen-address
定义监听地址address=/domain/ip
强制域名解析至指定 IPserver=/domain/dns
针对不同域使用不同上游 DNSbogus-nxdomain
拦截被劫持的 NXDOMAIN 重定向
禁止 /etc/hosts
或 /etc/resolv.conf
解析
no-hosts
no-resolv
示例
resolv-file=/etc/resolv.dnsmasq.conf
server=/laoma.cloud/10.1.8.10
启用与防火墙
dnsmasq -test
systemctl enable --now dnsmasq
firewall-cmd --add-service=dns --permanent
客户端测试
dig @10.1.8.20 client.laoma.cloud
dig @10.1.8.20 student.laoma.cloud
dig @10.1.8.20 dns.laoma.cloud
支持多于三个上游服务器
在 /etc/resolv.conf
仅保留 localhost
新建上游列表文件 /etc/resolv.dnsmasq.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
在 dnsmasq 配置中引用
resolv-file=/etc/resolv.dnsmasq.conf
bash
dig @10.1.8.20 client.laoma.cloud
dig @10.1.8.20 student.laoma.cloud
dig @10.1.8.20 dns.laoma.cloud
支持多于三个上游服务器
在 /etc/resolv.conf
仅保留 localhost
新建上游列表文件 /etc/resolv.dnsmasq.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
在 dnsmasq 配置中引用
resolv-file=/etc/resolv.dnsmasq.conf