DNS 污染排查:用 nslookup / dig 对比两个 DNS,以及 DoH 的解决方案

· 约 4 分钟 🛰️ 公共 DNS 速查

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 返回已知污染 IPDNS 污染

第二步:验证返回的 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 速查

提供商IPv4IPv6DoH
阿里 DNS223.5.5.5 / 223.6.6.62400:3200::1https://dns.alidns.com/dns-query
腾讯 DNS119.29.29.29 / 182.254.116.116https://doh.pub/dns-query
百度 DNS180.76.76.76
114 DNS114.114.114.114 / 114.114.115.115
Google DNS8.8.8.8 / 8.8.4.42001:4860:4860::8888https://dns.google/dns-query
Cloudflare1.1.1.1 / 1.0.0.12606:4700:4700::1111https://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(需管理员权限编辑)

配套工具

❓ 常见问题

怎么判断 DNS 被污染了还是正常的 CDN 调度?

对比同一域名在多个 DNS 服务器的解析结果,如果结果一致是 CDN 调度(不同地区给不同 IP 很正常),如果某个 DNS 给出明显异常的 IP(已知污染地址如 127.0.0.1、1.1.1.2、私有 IP 段)则是污染。命令:nslookup 域名 8.8.8.8nslookup 域名 223.5.5.5 分别查,比对输出 IP。已知的 DNS 污染常见返回 IP:美国大陆常被解析到 93.46.8.89203.98.7.65 等——这些 IP 一旦出现几乎可以确认是污染。

nslookup 和 dig 有什么区别?

nslookup 交互式、跨平台,dig 输出更详细、适合脚本。nslookup:Windows/macOS/Linux 均内置,适合快速查询;输出格式简洁,适合人类阅读。dig:Linux/macOS 内置,Windows 需要安装;输出包含 TTL、权威服务器、查询耗时等完整信息;支持 +short 参数只输出 IP,适合脚本处理;支持 @服务器 指定 DNS,支持 +tcp 强制 TCP 查询(DNS 默认 UDP,TCP 是应急备用)。调试 DNS 优先用 dig,临时查一下用 nslookup。

DNS over HTTPS(DoH)和普通 DNS 有什么区别?

普通 DNS 明文传输(UDP 53),中间设备可以看到你查了什么、可以篡改结果;DoH 加密传输(HTTPS 443),和访问普通网站一样。DoH 的好处:(1) 防止 DNS 劫持——运营商或网络设备无法篡改解析结果;(2) 防止 DNS 窃听——ISP 无法知道你在查哪些域名;(3) 绕过部分 DNS 级别的屏蔽。DoH 的代价:(1) 首次查询稍慢(需要 TLS 握手);(2) 需要 DoH 服务器本身可以访问到目标域名。国内可用的 DoH:阿里 DNS https://dns.alidns.com/dns-query、腾讯 https://doh.pub/dns-query

TTL 多少才合理?

TTL(Time To Live)是 DNS 记录的缓存时间,秒为单位。设置原则:(1) 生产环境稳定记录(A 记录指向负载均衡)——3600 到 86400 秒(1 小时到 1 天),减少 DNS 查询负担;(2) 即将迁移的记录——提前 48 小时把 TTL 降到 300 秒(5 分钟),迁移完成后再恢复,确保切换快速生效;(3) 灾备或频繁切换——TTL 60-300 秒,牺牲一点缓存效率换取快速切换;(4) 永远不要设 TTL=0——理论上可以,实际上很多 DNS 实现会自动补成最小值(通常 30-60 秒),且极高的查询频率会给权威 DNS 带压。

解析正确但网站打不开,可能是什么原因?

DNS 解析正确只是第一步,连通性问题在 DNS 之后。排查顺序:(1) ping IP地址——能 ping 通说明三层(IP)通,ping 不通可能是防火墙或路由问题;(2) telnet IP地址 80curl -v http://IP地址——测试四层(TCP)是否能建连;(3) curl 加 -H "Host: 域名" 测试 HTTP 响应;(4) 检查 SSL 证书:openssl s_client -connect IP:443 -servername 域名。DNS 查出来的 IP 是正确目标,但如果目标服务器宕机、防火墙拦了 80/443、或者 SSL 证书过期,DNS 没有问题但也到不了。

🛰️ 打开 公共 DNS 速查 阿里/DNSPod/114/Cloudflare/Google 9 家·IPv4/IPv6/DoH/DoT 一键复制·macOS/Windows/Linux/路由器配置生成