一句话总结
DNS 解析过程:浏览器缓存 → OS 缓存(hosts)→ 本地 DNS 服务器 → 根域名服务器 → 顶级域名服务器 → 权威域名服务器 → 返回 IP。两种查询方式:递归查询(客户端 → 本地 DNS,本地 DNS 负责到底)和迭代查询(本地 DNS 逐级询问,根→顶级→权威)。CDN 利用 DNS 智能解析,根据用户 IP 返回最近的 CDN 节点。DNS 安全问题:DNS 劫持(篡改解析结果)、DNS 污染(伪造响应)、DNSSEC(数字签名验证)。
初级理解
DNS 解析完整过程
# 浏览器输入 www.example.com 的 DNS 解析过程:
# 1. 浏览器 DNS 缓存
# 浏览器先查自己的 DNS 缓存(chrome://net-internals/#dns)
# 2. 操作系统 DNS 缓存
# Windows: ipconfig /displaydns
# Linux: systemd-resolved 缓存
# 3. hosts 文件
# Windows: C:\Windows\System32\drivers\etc\hosts
# Linux: /etc/hosts
# 4. 本地 DNS 服务器(递归查询)
# 如 8.8.8.8(Google)、114.114.114.114(国内)
# 本地 DNS 服务器收到请求后,如果缓存没有:
# 5. 根域名服务器(.)
# 本地 DNS → 根服务器:www.example.com 的 IP?
# 根服务器:我不知道,但 .com 的服务器知道
# 返回 .com 顶级域名服务器地址
# 6. 顶级域名服务器(.com)
# 本地 DNS → .com 服务器:www.example.com 的 IP?
# .com 服务器:我不知道,但 example.com 的权威服务器知道
# 返回 example.com 权威服务器地址
# 7. 权威域名服务器(example.com)
# 本地 DNS → 权威服务器:www.example.com 的 IP?
# 权威服务器:IP 是 93.184.216.34
# 返回 IP 地址
# 8. 本地 DNS 缓存结果 → 返回给客户端
# 客户端拿到 IP → 发起 HTTP 请求
中级深入
递归查询 vs 迭代查询
# 递归查询(Recursive Query):
# 客户端 → 本地 DNS:"帮我查 www.example.com,我只要结果"
# 本地 DNS 负责到底,逐级查询,最终返回 IP
# 客户端只发一次请求,等待结果
# 迭代查询(Iterative Query):
# 本地 DNS → 根服务器:"www.example.com 的 IP?"
# 根服务器:"我不知道,你去问 .com 服务器(地址是xxx)"
# 本地 DNS → .com 服务器:"www.example.com 的 IP?"
# .com 服务器:"我不知道,你去问 example.com 服务器"
# 本地 DNS → 权威服务器:"www.example.com 的 IP?"
# 权威服务器:"IP 是 93.184.216.34"
# 实际过程:
# 客户端 → 本地 DNS:递归查询(客户端只等结果)
# 本地 DNS → 各级服务器:迭代查询(逐级询问)
# DNS 记录类型:
# A 记录:域名 → IPv4
# AAAA 记录:域名 → IPv6
# CNAME 记录:域名 → 另一个域名(别名)
# MX 记录:邮件服务器
# NS 记录:域名服务器
# TXT 记录:文本信息(SPF、域名验证)
DNS 缓存
# DNS 缓存层级:
# 1. 浏览器缓存(几十秒到几分钟)
# 2. 操作系统缓存
# 3. 路由器缓存
# 4. ISP(运营商)DNS 缓存
# 5. 本地 DNS 服务器缓存
# TTL(Time To Live):DNS 记录的缓存时间
# 权威服务器设置 TTL,各级缓存按 TTL 过期
# 常见 TTL:600 秒(10分钟)
# 查看 DNS 缓存:
# Windows: ipconfig /displaydns
# 清除 DNS 缓存: ipconfig /flushdns
# Linux: systemd-resolve --statistics
# DNS 解析工具:
nslookup www.example.com # Windows/Linux
dig www.example.com # Linux(更详细)
host www.example.com # Linux(简洁)
高级进阶
CDN 与 DNS 智能调度
# CDN 如何利用 DNS 实现就近访问?
# 1. 用户访问 www.example.com
# 2. DNS 解析 → CNAME 指向 CDN 域名
# www.example.com CNAME www.example.com.cdn.com
# 3. CDN 的 DNS 服务器(GSLB 全局负载均衡)
# 根据用户 Local DNS 的 IP 判断用户地理位置
# 4. 返回离用户最近的 CDN 边缘节点 IP
# 5. 用户请求到达 CDN 边缘节点
# 6. 边缘节点有缓存 → 直接返回
# 7. 边缘节点无缓存 → 回源到源站获取
# GSLB(全局负载均衡)策略:
# 1. 地理位置最近
# 2. 网络延迟最低
# 3. 节点负载最低
# 4. 运营商最优(电信/联通/移动)
DNS 安全
# DNS 劫持:
# 攻击者篡改 DNS 解析结果,将用户引导到钓鱼网站
# 常见方式:
# 1. 篡改路由器 DNS 设置
# 2. 攻击 DNS 服务器
# 3. 运营商 HTTP 劫持(插入广告)
# DNS 污染/投毒:
# 攻击者伪造 DNS 响应,在合法响应到达前发送伪造响应
# DNS 服务器缓存了伪造结果 → 所有用户受影响
# DNSSEC(DNS Security Extensions):
# 通过数字签名验证 DNS 响应真实性
# 原理:从根到权威服务器逐级签名
# 客户端验证签名 → 确认响应未被篡改
# DoH(DNS over HTTPS)/ DoT(DNS over TLS):
# 加密 DNS 查询,防止被窃听和篡改
# DoH:DNS 查询走 HTTPS(端口 443)
# DoT:DNS 查询走 TLS(端口 853)
# 浏览器支持:Chrome/Firefox 设置中开启
实战场景
# 场景1:网站更换服务器 IP
# 修改 DNS A 记录,指向新 IP
# 注意 TTL:如果 TTL=600,最多等 10 分钟全球生效
# 建议:迁移前先降低 TTL(如 60 秒),迁移后再恢复
# 场景2:DNS 解析故障排查
# 1. ping 域名看是否解析
ping www.example.com
# 2. nslookup 查看 DNS 服务器
nslookup www.example.com
# 3. dig 查看详细解析过程
dig www.example.com +trace
# 4. 检查 hosts 文件是否被篡改
# 5. 更换 DNS 服务器测试(8.8.8.8)
# 场景3:配置 CDN
# 1. 源站:origin.example.com(A 记录指向源站 IP)
# 2. 加速域名:www.example.com
# CNAME 指向 CDN 提供的域名
# www.example.com CNAME www.example.com.cdn.com
面试模拟
面试官:浏览器输入 URL 后,DNS 解析的完整过程?
你:先查浏览器缓存 → OS 缓存(hosts)→ 本地 DNS 服务器。本地 DNS 如果没缓存,从根域名服务器开始迭代查询:根 → .com 顶级 → example.com 权威 → 返回 IP。客户端到本地 DNS 是递归查询,本地 DNS 到各级服务器是迭代查询。
面试官:什么是 DNS 劫持?如何防范?
你:DNS 劫持是篡改 DNS 解析结果,将用户引导到恶意网站。防范措施:1)使用 DNSSEC 数字签名验证;2)使用 DoH/DoT 加密 DNS 查询;3)使用可信 DNS 服务器(8.8.8.8);4)HTTPS 证书验证(即使 DNS 被劫持,证书不匹配浏览器会警告)。