linux域名解析返回错误ip,说明dns查询成功但结果不正确,需排查/etc/hosts错误映射、systemd-resolved缓存污染、上游dns劫持或中间代理干扰,并通过dig @指定服务器比对解析结果验证。

Linux 中域名解析返回错误 IP,说明 DNS 查询成功但结果不正确——不是无法解析,而是解析到了不该指向的地址。这通常由缓存污染、配置劫持或上游 DNS 被篡改导致,需重点排查本地缓存、hosts 干扰、stub resolver 行为及上游 DNS 可信度。
检查 /etc/hosts 是否存在错误映射
系统默认优先查 /etc/hosts,若该文件中手动添加了错误条目(如 127.0.0.1 www.baidu.com 或指向测试环境 IP),就会覆盖真实解析结果。
- 运行 cat /etc/hosts,逐行检查是否有目标域名的静态映射
- 特别注意注释行后是否混入了未注释的非法记录
- 临时重命名该文件测试:sudo mv /etc/hosts /etc/hosts.bak,再执行 getent hosts www.example.com 看结果是否恢复正常
验证 systemd-resolved 缓存是否被污染
若系统启用 systemd-resolved(常见于 Ubuntu 20.04+、Fedora、Debian 12+),它会缓存 DNS 响应。一旦缓存了错误 IP,后续查询将持续返回该结果,且不自动刷新过期 TTL。
- 确认服务状态:systemctl is-active systemd-resolved
- 查看当前缓存:resolvectl statistics(关注 “Cache hits” 和 “Cache misses”)
- 清空全部缓存:sudo resolvectl flush-caches
- 验证是否仍返回错误 IP:resolvectl query www.example.com(该命令绕过 glibc 缓存,直连 resolved)
对比多个 DNS 服务器的解析结果
如果仅用默认 DNS 解析出错,而换用可信公共 DNS(如 8.8.8.8、1.1.1.1、223.5.5.5)返回正确 IP,则基本可判定是上游 DNS 服务商返回了错误响应——可能因劫持、配置错误或区域同步异常。
- 直接向指定服务器查:dig @8.8.8.8 www.example.com A +short
- 同时查国内常用 DNS:dig @114.114.114.114 www.example.com A +short
- 若结果不一致,说明问题不在本地,而在你当前配置的 nameserver(见 /etc/resolv.conf 或 resolvectl status 输出)
- 临时切换测试:echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf,再试 ping 或 curl
排查中间代理或防火墙 DNS 劫持
企业网络、某些路由器固件或恶意软件可能在链路中拦截并重写 DNS 响应(例如将所有域名解析为广告页 IP),表现为:所有域名都返回同一个错误 IP,或仅特定 TLD(如 .cn)异常。
- 用 tcpdump -i any port 53 -w dns.pcap 抓包,然后在另一台机器用 Wireshark 打开,观察 DNS 请求与响应是否匹配
- 检查是否启用透明代理:ss -tuln | grep :53 看是否有非 127.0.0.53 的本地进程监听 53 端口
- 确认无全局 DNS 重定向规则:sudo iptables -t nat -L -n | grep REDIRECT.*53
- 在安全网络(如手机热点)下复测,若恢复正常,基本可定位为本地网络层劫持











