DNS 解析原理与排障实战

“网站打不开”的排查里,DNS 是最容易被忽略、又最常出问题的一层——IP 能访问、域名不能,十有八九就是它。这篇把 DNS 的完整解析流程和排障方法讲透。

一、DNS 是什么

DNS(域名系统)把域名翻译成 IP,好比电话簿:记名字不记号码。端口:一般走 UDP 53,数据量大或区域传输时走 TCP 53

常用记录类型:

记录 作用 示例
A 域名 → IPv4 www.example.com → 1.1.1.1
AAAA 域名 → IPv6
CNAME 别名(CDN 加速常用) www 指向 cdn.example.com

常用公共 DNS:阿里 223.5.5.5、腾讯 119.29.29.29114.114.114.114、谷歌 8.8.8.8

二、完整解析流程(递归 + 迭代)

以浏览器输入 www.baidu.com 为例:

1
2
3
4
5
6
7
8
9
10
11
第1步 查浏览器缓存
第2步 查操作系统缓存
第3步 查本地 hosts 文件(Windows: C:\Windows\System32\drivers\etc\hosts;Linux: /etc/hosts)
第4步 都没命中 → 请求本地 DNS 服务器(LDNS,如 223.5.5.5)【递归查询】
第5步 LDNS 先查自己的缓存,没有则开始【迭代查询】:
① LDNS 问根域名服务器"."(全球 13 个根,内置在 LDNS 里)
② 根服务器返回 .com 顶级域服务器 IP
③ LDNS 问 .com 顶级域服务器 → 返回 baidu.com 权威服务器 IP
④ LDNS 问 baidu.com 权威服务器 → 权威服务器查 A 记录,返回 www.baidu.com 的 IP
第6步 LDNS 缓存一份,把 IP 返回给客户端;客户端也缓存一份
第7步 浏览器用 IP 与服务器建立 TCP 连接

两种查询方式(面试必答):

  • 递归查询:客户端 → 本地 DNS。客户端只问一次,LDNS 负责跑腿;
  • 迭代查询:本地 DNS → 根 → 顶级 → 权威。LDNS 逐级问,每级只告诉”下一级去哪问”。

三、排障命令

1
2
3
4
5
6
7
8
9
10
yum install -y bind-utils

dig www.baidu.com # 最详细(推荐)
dig +trace www.baidu.com # 看完整迭代链路(劫持排查神器)
nslookup www.baidu.com # 基础查询
host www.baidu.com # 精简查询

# 常见排查点:
cat /etc/resolv.conf # nameserver 配置
grep domain /etc/hosts # hosts 有没有被污染

四、三个真实故障案例

案例 1:网站突然打不开,IP 能访问、域名不能

排查链路:nslookup 域名 → 超时/无记录 → 查 /etc/resolv.conf → 发现 nameserver 写的是内网 DNS → 换 223.5.5.5 立即可解析。

根因:公司内网 DNS 故障/上游被污染。解决:切换 DNS 或同时配置多个 nameserver(nameserver 223.5.5.5 + nameserver 114.114.114.114)。

案例 2:dig +trace 发现权威服务器返回异常 IP(域名被劫持)

现象:解析结果指向一个不明 IP,访问弹广告。

处理:联系域名服务商核查解析记录;检查是否有 CNAME 被篡改;确认域名管理后台没有被盗号(查登录记录、改强密码)。

案例 3:CDN 切换后部分地区访问慢

现象:CDN 配置已切换,但部分用户还访问旧节点。

根因:LDNS 缓存了旧 IP,TTL 未到。处理:等 TTL 过期,或通知运营商刷新缓存。

生产规范:改解析前先看当前 TTL,提前把 TTL 调小(如 300 秒)再改记录,改完再恢复 TTL——避免切换后长时间缓存旧地址。

五、DNS 排障心法

遇到”域名不通”,按这个顺序走:本机 dig 看解析结果 → hosts 有没有污染 → resolv.conf 对不对 → 换公共 DNS 交叉验证 → dig +trace 看链路 → 联系域名服务商。其中”换公共 DNS 交叉验证”能快速区分是”本地 DNS 问题”还是”权威解析问题”,是效率最高的一步。