dig example.com看域名解析到哪个 IP,用了哪个 DNS 服务器,耗时多少。
约 1218 字大约 4 分钟
2026-05-14
你访问 example.com,但网络底层只认 IP 地址。把域名翻译成 IP 的,就是 DNS。它是网络请求的“第一步”——这一步出错,后面再通也没用。所以排查网络问题,DNS 往往是第一个要排除的嫌疑。
理解 DNS 把域名解析成 IP 的过程,掌握 dig 的用法,弄清 /etc/hosts 的作用,知道“解析成功”不等于“服务可达”。
dig example.com看域名解析到哪个 IP,用了哪个 DNS 服务器,耗时多少。
dig +short example.com省去细节,直接给出解析到的 IP,适合脚本里用。
dig @8.8.8.8 example.com换一个 DNS 查,用来判断是不是本地 DNS 的问题。
cat /etc/resolv.conf确认系统当前配置的 DNS 服务器是哪个。
输入 curl example.com,系统在真正连接前先做一次“查号”:问 DNS 服务器“example.com 的 IP 是多少”,拿到 IP,才能继续。这一步失败,你会看到 Could not resolve host——注意,这跟“连接超时”“连接被拒绝”是完全不同的错误,它说明问题根本还没走到网络连通那一步。
dig 比 nslookup 更清晰、信息更全。看几个关键用法:
dig example.com # 完整过程:查到的 IP、用的 DNS、耗时
dig +short example.com # 只要结果 IP,干净
dig @8.8.8.8 example.com # 强制用 8.8.8.8 这个 DNS 来查
dig example.com MX # 查特定记录类型(MX 是邮件服务器)dig @某个DNS 是排查利器:如果用本地 DNS 查不到、换成 8.8.8.8 能查到,那问题就锁定在“本地 DNS 配置”上,而不是域名本身。
系统解析域名时,先查 /etc/hosts 文件,再问 DNS。这个文件里可以手动写死映射:
127.0.0.1 myapp.local
192.168.1.50 api.internal它的用途:本地开发时把域名指到本机、临时绕过 DNS 测试、内网固定映射。但它也是个坑——如果 /etc/hosts 里有一条过期的记录,dig(只查 DNS)显示一切正常,但 curl(先查 hosts)却连到了错误的 IP。所以“dig 正常但访问异常”时,记得 cat /etc/hosts 看一眼。
这是最重要的一条认知。dig 返回了 IP,只意味着“域名翻译成功了”。接下来还有一长串可能出问题:
域名解析 ✅ → 路由可达? → 端口在监听? → 防火墙放行? → 应用正常响应?
DNS 只负责第一棒。dig 通了之后,问题往往在后面几棒——别因为“域名能解析”就排除了网络问题。完整的分层排查见 网络排查流程。
改 DNS 配置和 hosts 要留意影响面
/etc/resolv.conf(系统 DNS)和 /etc/hosts 改错,影响的是整台机器所有程序的域名解析,不只是你正在测的那个。改之前先 cp 备份;/etc/hosts 里加的临时测试条目,用完记得删掉,否则它会安静地误导后面所有排查。注意 resolv.conf 在很多系统上由 NetworkManager 或 systemd-resolved 自动管理,手动改可能被覆盖。
| 误区 | 更稳妥的做法 |
|---|---|
把 Could not resolve host 当成“网络不通” | 这是 DNS 阶段失败,还没到连通性,先查解析 |
| dig 正常就排除一切本地因素 | dig 只查 DNS,程序还会先查 /etc/hosts,记得对一下 |
| 以为域名能解析问题就不在网络 | 解析成功只是第一棒,后面还有路由、端口、防火墙 |
| 随手改 resolv.conf 不备份不留意托管 | 先备份,且注意它可能被 NetworkManager 等自动覆盖 |
版权归属:Shuo Liu