DNS 缓存是提升 DNS 解析效率的关键机制,通过在多个层级存储 DNS 查询结果,减少对权威 DNS 服务器的重复查询,从而加快解析速度并减轻服务器负载。
DNS 缓存的层级结构
DNS 缓存在以下多个层级发挥作用:
1. 浏览器缓存
- 位置:浏览器内部
- 特点:最靠近用户,响应最快
- 控制:用户可通过清除浏览器数据清空
- 典型 TTL:几分钟到几小时
2. 操作系统缓存
- 位置:操作系统 DNS 客户端服务
- Windows:DNS Client 服务
- Linux:nscd(Name Service Cache Daemon)或 systemd-resolved
- 查看命令:
bash# Windows ipconfig /displaydns # Linux systemd-resolve --statistics
3. 本地 DNS 服务器缓存
- 位置:ISP 或企业内部的 DNS 服务器
- 作用:为多个用户共享缓存,提高命中率
- 软件:BIND、dnsmasq、Unbound 等
4. 递归 DNS 服务器缓存
- 位置:公共 DNS 服务(如 8.8.8.8、114.114.114.114)
- 特点:用户量大,缓存命中率高
TTL(Time To Live)详解
什么是 TTL
TTL 是 DNS 记录中的一个重要字段,表示该记录可以被缓存的最大时间(秒)。当 TTL 过期后,缓存必须被清除,重新进行 DNS 查询。
TTL 的工作原理
shell权威服务器设置 TTL = 3600 秒(1小时) ↓ 本地 DNS 服务器获取记录并缓存 ↓ 在 1 小时内,所有查询都从缓存返回 ↓ 1 小时后,缓存过期,重新查询权威服务器
TTL 的典型值
| 记录类型 | 典型 TTL | 适用场景 |
|---|---|---|
| A/AAAA 记录 | 300-3600 秒 | 经常变动的服务器 |
| CNAME 记录 | 3600-86400 秒 | 相对稳定的别名 |
| MX 记录 | 3600-86400 秒 | 邮件服务器 |
| NS 记录 | 86400-172800 秒 | 域名服务器,很少变动 |
| TXT 记录 | 300-3600 秒 | SPF、DKIM 等验证记录 |
TTL 设置的最佳实践
稳定服务
- 使用较长的 TTL(24-48 小时)
- 减少 DNS 查询流量
- 提高解析速度
频繁变更的服务
- 使用较短的 TTL(5-15 分钟)
- 便于快速切换服务器
- 适用于蓝绿部署、故障转移
变更前的准备
shell变更前 24 小时:降低 TTL 到 300 秒 执行变更操作 变更后 24 小时:恢复 TTL 到原值
缓存刷新和清除
客户端刷新
bash# Windows 清除 DNS 缓存 ipconfig /flushdns # macOS 清除 DNS 缓存 sudo killall -HUP mDNSResponder # Linux (systemd-resolved) sudo systemd-resolve --flush-caches
服务器端刷新
- 重启 DNS 服务
- 使用
rndc flush(BIND) - 等待 TTL 自然过期
缓存带来的问题
1. 缓存不一致
- 不同层级的缓存 TTL 可能不同
- 导致用户访问到不同版本的服务
2. 变更延迟
- DNS 变更需要等待所有缓存过期
- 全球生效可能需要 TTL × 2 的时间
3. 缓存投毒攻击
- 攻击者伪造 DNS 响应污染缓存
- 解决方案:DNSSEC 数字签名
缓存优化策略
1. 合理设置 TTL
dns; 高可用性服务 - 短 TTL www.example.com. 300 IN A 192.0.2.1 ; 稳定服务 - 长 TTL static.example.com. 86400 IN A 192.0.2.2
2. 使用 CDN
- CDN 边缘节点缓存 DNS 结果
- 智能调度用户到最近节点
3. 预解析和预连接
html<!-- HTML DNS 预解析 --> <link rel="dns-prefetch" href="//cdn.example.com"> <link rel="preconnect" href="//api.example.com">
总结
| 方面 | 说明 |
|---|---|
| 缓存层级 | 浏览器 → OS → 本地 DNS → 递归 DNS |
| TTL 作用 | 控制缓存有效期,平衡性能和一致性 |
| 优化方向 | 根据服务特性设置合理的 TTL 值 |
| 注意事项 | 变更前降低 TTL,避免缓存不一致 |