为什么ping和dig(nslookup)返回地址不一样,两者的区别
背景
生产上遇到一个网络问题,调整了aa.com域名的解析之后,发现依然有问题。通过ping和dig命令返回不同的地址。dig的结果是对的,ping的结果是错的。
ping vs dig (nslookup)
ping是用来检测网络联通的,dig是用来查询dns解析的。只是ping第一步先查询了dns后才知道目标域名的真实ip地址。这里重点看的就是这一步两者的差异
参考一个博客
https://superuser.com/questions/663257/why-do-ping-and-dig-provide-different-ip-address-than-nslookup
dig
直接查询 DNS 服务器(如 8.8.8.8),返回域名在 DNS 系统中的原始记录(如 A 记录)。它绕过本地缓存和 hosts 文件,结果最权威。
执行dig example.com
返回结果中SERVER:就是DNS服务器地址,在不同环境中可能是公网的DNS解析服务器,也可能是内部的DNS解析服务器。
如何查看自己的dns服务器呢,通常的做法
cat /etc/reslov.conf
结果返回的nameserver就是DNS的服务器列表
影响dig结果的是远程DNS服务器内部存在的缓存,通常10分钟或者几分钟会刷新一次,取决于DNS服务器的配置。
ping
ping 依赖操作系统的 DNS 解析器,解析顺序为:
- 本地 hosts 文件(如 /etc/hosts 或 C:\Windows\System32\drivers\etc\hosts)
- 本地 DNS 缓存(如 Windows 的 dnscache 或 Linux 的 systemd-resolved)
最后才查询 DNS 服务器,通dig一致。在此之前的两步,可能被本地配置修改。
解决
所以当出现ping和dig不一致的时候
- 查询/etc/hosts文件看是否拦截了域名的解析结果
- 清除本地的DNS缓存
# 清理系统 DNS 缓存(Linux 示例)
sudo systemd-resolve --flush-caches # systemd-resolved
sudo resolvectl flush-caches # 新版 systemd# Windows
ipconfig /flushdns