适用场景:网站打不开、域名偶尔丢包、解析不稳定、内网 DNS 异常、CDN 域名解析失败、客户端 / 服务器域名无法解析。 排查思路:先区分是客户端问题、本地 DNS 问题、权威 DNS 问题,还是网络链路问题,由近到远排查。
一、基础原理快速回顾
- 递归 DNS(本地 DNS):电脑配置的 DNS,如 114.114.114.114、8.8.8.8、企业内网 DNS。负责替你向权威服务器查询域名。
- 权威 DNS:域名服务商的 DNS 服务器,保存域名真实解析记录 (A/AAAA/CNAME 等)。
- 解析流程:客户端查本地 hosts → 查本地 DNS 缓存 → 递归 DNS 查询 → 权威 DNS 返回记录 → 客户端缓存结果。
故障分层:hosts 文件 > 本机 DNS 缓存 > 递归 DNS > 网络连通性 > 权威 DNS > 域名状态(过期、锁定)
二、必备排查命令(Windows / Linux /macOS)
1. nslookup(最常用,验证 DNS解析结果)
# 基础查询,使用系统默认DNS
nslookup example.com
# 指定DNS服务器查询(关键!用来区分是本地DNS还是权威问题)
nslookup example.com 223.5.5.5
结果判断:
- 返回正确 IP:解析本身没问题,大概率是网络、防火墙、服务端口问题。
Server failed/Timed out:DNS 服务器不可达,或者拒绝查询。NXDOMAIN:域名不存在,权威 DNS 没有该记录。
2. dig(Linux/macOS,信息最全,运维首选)
dig example.com
# 指定DNS
dig @223.5.5.5 example.com
# 只看简要结果
dig example.com +short
# 查询权威DNS记录
dig example.com +nssearch
# 跟踪完整解析过程
dig example.com +trace
重点看:ANSWER SECTION(解析结果)、Query time、SERVER、STATUS。
NOERROR:正常;NXDOMAIN:无记录;SERVFAIL:权威 DNS 返回失败。
3. ping(简单验证,不能单独用来判断 DNS)
ping example.com
⚠️ ping 失败≠DNS 故障:DNS 解析成功拿到 IP,但目标服务器禁 ping、防火墙拦截,ping 也不通。
4. 查看 / 清理本地 DNS 缓存
Windows:
# 查看缓存
ipconfig /displaydns
# 清空DNS缓存
ipconfig /flushdns
macOS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Linux:
# systemd-resolved
sudo systemd-resolve --flush-caches
# nscd
sudo nscd -i hosts
5. hosts 检查
Windows 路径:C:\Windows\System32\drivers\etc\hosts Linux/macOS:/etc/hosts
hosts 优先级高于 DNS,这里写了错误 IP 会直接覆盖解析结果。
6. 网络连通性测试(DNS 端口 UDP 53)
DNS 默认使用 UDP 53 端口,超时很多是防火墙拦截 53 端口。
# Windows测试端口连通
telnet 223.5.5.5 53
# Linux/macOS
nc -zv 223.5.5.5 53
很多公司防火墙、出口策略会拦截外网 UDP53,导致 DNS 超时。
三、标准排查步骤【由近到远,运维标准流程】
核心判断逻辑:换一个公共 DNS 查询,如果结果正常 → 问题在原来的递归 DNS;如果所有 DNS 都查不到 → 问题在权威 DNS / 域名本身
Step1:确认故障范围
先判断是单台机器 ,还是所有机器都无法解析:
- 仅本机:本机 hosts、本机 DNS 配置、本机缓存、本机防火墙。
- 全部终端:内网 DNS 服务器故障、出口防火墙拦截 UDP53、运营商链路问题。
Step2:检查本机配置
- 查看本机 DNS 配置
- Windows:
ipconfig /all - Linux:
cat /etc/resolv.conf
- Windows:
- 检查是否配错 DNS,是否是内网 DNS。
- 检查 hosts 文件是否被篡改。
- 清空本地 DNS 缓存,重试。
Step3:使用不同公共 DNS 交叉验证(最重要一步)
公共 DNS 推荐:
- 阿里:223.5.5.5 / 223.6.6.6
- 腾讯:119.29.29.29
- 114:114.114.114.114
- Google:8.8.8.8(国内访问不稳定)
操作示例:
nslookup example.com 223.5.5.5
nslookup example.com 119.29.29.29
场景判断: ✅ 用阿里 DNS 能解析,本机配置的内网 DNS 不能解析:内网 DNS 服务故障 。 ❌ 所有公共 DNS 都查不到:权威 DNS / 域名记录问题,去域名服务商后台检查。
Step4:检查权威 DNS 与域名状态
登录域名服务商后台检查:
- 域名是否过期、是否被注册商暂停。
- 域名 NS 记录是否正确(是否改成了自己的 DNS 服务商)。
- A/CNAME 记录是否填写正确,有没有输错。
- 是否开启域名锁定(禁止修改 NS)。
- 记录 TTL 值:TTL 是缓存时间,修改记录后需要等待 TTL 过期才能全网生效。
TTL 说明:比如 TTL=300(5 分钟),递归 DNS 会缓存 5 分钟,修改记录后旧 IP 还会持续存在一段时间。调试阶段可以临时把 TTL 改小。
Step5:检查链路与防火墙
常见坑:
- 出口防火墙 / 安全组拦截 UDP 53 端口,DNS 查询超时。部分设备只放行 TCP53,会导致小包 DNS 正常、大包 DNS(EDNS0)失败。
- 运营商劫持 DNS,返回错误 IP。
- 内网 DNS 服务器上行链路断网。
Step6:验证 TCP 53(大包 DNS)
当解析域名返回很长记录(很多子域名、泛域名),UDP 包超过 512 字节,会切换 TCP53。如果防火墙只放 UDP53,会间歇性解析失败。
dig example.com +tcp @223.5.5.5
四、常见故障现象、原因、解决方案
表格
| 现象 | 可能原因 | 处理方案 |
|---|---|---|
| nslookup 返回 NXDOMAIN | 权威无记录、域名输错、域名过期 | 核对域名解析记录,检查域名状态 |
| DNS 查询超时 | UDP53 端口被防火墙拦截、DNS 服务器不可达 | 测试 53 端口连通性,放通防火墙策略,更换 DNS |
| 偶尔解析成功,偶尔失败 | 1. DNS 服务器负载高;2. 丢包;3. TTL 缓存;4. EDNS0 大包被防火墙丢弃 | dig +trace 排查,尝试关闭 EDNS0,放通 TCP53 |
| 本机 ping 域名是旧 IP,别人正常 | 本机 / 本地 DNS 缓存未过期 | 清空客户端缓存,等待 TTL |
| 内网机器无法解析内网域名,外网域名正常 | 内网 DNS 没有配置对应记录 | 在内网 DNS 添加 A 记录 |
| 域名解析到一个错误 IP(劫持) | 运营商 DNS 劫持、hosts 篡改 | 切换公共 DNS,清理 hosts |
| dig 返回 SERVFAIL | 权威 DNS 故障,或者 NS 配置异常 | 检查域名 NS 记录,联系域名服务商 |
五、运维监控与预防性维护
- 监控指标
- DNS 查询成功率
- DNS 响应延迟(Query time)
- DNS 超时率
- 权威 DNS NS 服务器存活状态
- 巡检脚本思路:定时 dig/nslookup 探测域名,异常告警。
- 最佳实践:
- 企业内网配置主备 DNS,避免单点故障。
- 关键业务域名不要使用泛解析。
- 生产环境修改解析记录,先降低 TTL,等待生效再改记录,变更完成后恢复 TTL。
- 重要域名配置多 NS 服务器,防止单一权威 DNS 宕机。
- 防火墙策略同时放行 UDP53 和 TCP53。
六、排障报告模板(运维工单输出)
DNS故障工单
1. 故障现象:xxx域名无法解析,单台/全部主机
2. 故障范围:内网所有PC / 仅服务器A
3. 测试结果:
- 默认DNS nslookup:xxx
- 公共DNS 223.5.5.5查询:xxx
- dig +trace结果:xxx
4. 检查项:hosts、本机缓存、DNS端口连通性、域名NS状态
5. 根因:xxx
6. 处理动作:xxx
7. 验证结果:xxx
七、排障避坑清单
- ❌ 不要只用 ping 判断 DNS;ping 通 IP 不代表解析正常。
- ❌ 修改域名记录后立刻测试,忽略 TTL 缓存。
- ❌ 只测试本机 DNS,不使用外部 DNS 交叉验证。
- ❌ 忽略 UDP53/TCP53 大包问题,出现偶发解析失败。
- ❌ 忽略 hosts 文件优先级问题。