DNS 是互联网的电话簿——把域名翻译成 IP。当它出问题时,表现通常是”网站打不开”或”打开的是错误内容”,而不是明显的错误提示。学会用两条命令快速诊断 DNS 问题,能把排查时间从一小时压到五分钟。
DNS 解析的完整链路
用户输入 example.com
↓
① 浏览器缓存(有则直接用)
↓
② 操作系统缓存(/etc/hosts 和系统 DNS 缓存)
↓
③ 本地 DNS 解析器(路由器或运营商分配的 DNS)
↓
④ 递归查询(根域 → .com → example.com 权威 DNS)
↓
返回 IP 地址,浏览器发起 TCP 连接
污染通常发生在③,运营商 DNS 服务器对特定域名返回虚假 IP。
诊断命令
nslookup(Windows / macOS / Linux 通用)
# 用默认 DNS 查询
nslookup example.com
# 指定 DNS 服务器查询(@后面是 DNS 地址)
nslookup example.com 8.8.8.8 # Google DNS
nslookup example.com 223.5.5.5 # 阿里 DNS
nslookup example.com 119.29.29.29 # 腾讯 DNS
# 输出示例(正常):
# Server: 8.8.8.8
# Address: 8.8.8.8#53
# Non-authoritative answer:
# Name: example.com
# Address: 93.184.216.34
dig(Linux / macOS,更详细)
# 基础查询
dig example.com
# 指定 DNS 服务器
dig @8.8.8.8 example.com
# 只输出 IP(适合脚本)
dig +short example.com
# 查 CNAME 链
dig +trace example.com
# 强制 TCP(DNS 默认 UDP,TCP 是备用)
dig +tcp @8.8.8.8 example.com
# 查 DNS 响应时间
dig @8.8.8.8 example.com | grep "Query time"
DNS 污染诊断流程
第一步:对比多个 DNS 的结果
# 同时查三个 DNS,对比 IP
nslookup 域名 8.8.8.8 # Google(境外)
nslookup 域名 223.5.5.5 # 阿里(国内)
nslookup 域名 119.29.29.29 # 腾讯(国内)
结果判断:
| 场景 | 可能原因 |
|---|---|
| 三个 DNS 结果一致 | DNS 正常,问题在网络层或服务端 |
| 国内 DNS 返回不同 IP,但 IP 都能访问 | CDN 调度,正常 |
| 某个 DNS 返回私有 IP(192.168.x.x、10.x.x.x) | 运营商劫持到广告页或错误页 |
| 某个 DNS 返回已知污染 IP | DNS 污染 |
第二步:验证返回的 IP 是否真实
# 查 IP 的归属(用 ip-tools 工具或命令行)
curl https://ipinfo.io/93.184.216.34
# 直接访问 IP,加 Host 头
curl -H "Host: example.com" http://93.184.216.34
如果直接访问 IP 返回正确内容,但域名打不开,问题在 DNS 解析阶段。
第三步:绕过问题 DNS
# 把正确 IP 写入 /etc/hosts(临时修复)
echo "93.184.216.34 example.com" >> /etc/hosts
# 或换用不受污染的 DNS
国内公共 DNS 速查
| 提供商 | IPv4 | IPv6 | DoH |
|---|---|---|---|
| 阿里 DNS | 223.5.5.5 / 223.6.6.6 | 2400:3200::1 | https://dns.alidns.com/dns-query |
| 腾讯 DNS | 119.29.29.29 / 182.254.116.116 | — | https://doh.pub/dns-query |
| 百度 DNS | 180.76.76.76 | — | — |
| 114 DNS | 114.114.114.114 / 114.114.115.115 | — | — |
| Google DNS | 8.8.8.8 / 8.8.4.4 | 2001:4860:4860::8888 | https://dns.google/dns-query |
| Cloudflare | 1.1.1.1 / 1.0.0.1 | 2606:4700:4700::1111 | https://cloudflare-dns.com/dns-query |
境内推荐:阿里 DNS(延迟低、稳定、支持 DoH)。
境外路线:Google / Cloudflare(需要能正常访问境外网络)。
配置 DoH(DNS over HTTPS)
系统级配置
macOS(Ventura+): 系统偏好设置 → 网络 → DNS → 添加 DoH 服务器
Windows 11: 设置 → 网络和 Internet → DNS 服务器 → 编辑 → 选择”通过 HTTPS 进行 DNS (DoH)”
Android(9+):
设置 → 网络 → 高级 → 私人 DNS → 填入 dns.alidns.com(阿里 DoH 主机名)
iOS(14+): 下载 DoH 配置描述文件安装,或通过 VPN 配置
浏览器级配置
Chrome:设置 → 隐私和安全 → 使用安全 DNS
Firefox:设置 → 常规 → 网络设置 → 启用 DNS over HTTPS
浏览器级 DoH 只影响浏览器发出的 DNS 请求,不影响其他应用。
/etc/hosts 的临时修复作用
/etc/hosts 是 DNS 解析的最高优先级(优先于所有 DNS 服务器),适合临时修复或本地开发:
# /etc/hosts 格式
IP地址 域名
127.0.0.1 localhost
192.168.1.100 myservice.local
93.184.216.34 example.com # 临时绕过 DNS 污染
修改后立即生效(无需重启),但清除缓存后以 DNS 查询为准。
Linux/macOS 路径:/etc/hosts
Windows 路径:C:\Windows\System32\drivers\etc\hosts(需管理员权限编辑)
配套工具
- IP 工具箱 — 查 IP 归属地、ASN、是否是已知 CDN 节点
- 公共 NTP 时间源 — DNS 走 53 端口,NTP 走 123 端口,两者都是基础设施
- TCP/UDP 端口表 — DNS 用 53 端口,DoH 用 443 端口