dig 域名域名能不能解析成 IP,失败就是 DNS 问题。
约 1361 字大约 5 分钟
2026-05-14
“网络不通”是一句太笼统的话。这个模块前面几篇分别讲了 DNS、路由、接口、端口、防火墙——这篇把它们串成一条固定的排查流水线:从域名到应用层,一层层往下走,每一层都有明确的命令和明确的结论。
把网络问题拆成 DNS → 连通性 → 端口 → 应用 → 防火墙几层,按固定顺序逐层定位,学会从错误信息反推问题在哪一层。
dig 域名域名能不能解析成 IP,失败就是 DNS 问题。
ping IP包能不能到达目标主机,不通看路由和网络。
nc -vz IP 端口目标端口能不能连上,refused 说明没人监听或被挡。
curl -v URL连上之后应用怎么响应,4xx/5xx 是应用的问题。
遇到“连不上”,按这个顺序走,不要跳步:
| 层 | 问题 | 命令 | 失败说明 |
|---|---|---|---|
| ① DNS | 域名能解析吗 | dig 域名 | 解析失败 → DNS 基础 |
| ② 连通 | 包能到目标吗 | ping IP、traceroute IP | 不通 → 路由与网关、网络接口 |
| ③ 端口 | 目标端口可连吗 | nc -vz IP 端口 | 拒绝 / 超时 → 服务没起 或 防火墙 |
| ④ 应用 | 应用响应正常吗 | curl -v URL | 4xx/5xx → 应用本身的问题 |
每一层有明确结论才往下走。在第②层就不通,去查第④层应用日志是白费力气。
不同的报错,直接对应不同的层,学会“看错认层”:
| 你看到的 | 大概率在哪一层 |
|---|---|
Could not resolve host | ① DNS,名字都没解析出来 |
Network is unreachable / No route to host | ② 连通,路由有问题 |
Connection timed out | ② 或 ③,包被默默丢弃(常是防火墙静默拦截) |
Connection refused | ③ 端口,能到达主机但那个端口没人监听 |
HTTP 404 / 500 | ④ 应用,网络全通,是应用自己的问题 |
特别注意 timeout 和 refused 的区别:refused 是“对方明确说这里没人”,包到了;timeout 是“石沉大海”,往往是防火墙把包默默丢了。两者指向的方向完全不同。
只在客户端这边查,经常卡住。养成两侧对照的习惯:
dig、ping、nc -vz、curl -v —— 我能不能、走到哪一步断的ss -lntp(服务在监听吗、监听在哪个地址)、防火墙规则、journalctl -u 服务名(应用日志)很多问题在客户端怎么查都查不明白,到服务端 ss -lntp 一看——服务监听在 127.0.0.1,根本没对外(见 IP、端口与协议)。
每一步的目的都是排除,不是“试试看”:
ping 网关 通了 → 排除本地链路问题dig 通了 → 排除 DNScurl 127.0.0.1:端口 通、外部不通 → 锁定在监听地址或防火墙一步步把“可能性”划掉,剩下的就是答案。这和 系统排查方法论 是同一个思路,只是套在网络这条链上。
排查命令本身要分清只读和有副作用
dig、ping、nc -vz、curl -v、ss、traceroute 都是只读探测,放心用。真正有副作用的是排查过程中“顺手做的修复”——改路由、改防火墙、改接口、重启服务。这些在 路由与网关、防火墙基础 里都强调过:远程操作可能让你失去机器访问权。排查阶段先只用只读命令收集证据,确认结论后再动手改,改之前想好回滚。
| 误区 | 更稳妥的做法 |
|---|---|
| 一上来就猜,跳着层查 | 按 DNS → 连通 → 端口 → 应用 固定顺序,每层有结论再往下 |
| 不区分 timeout 和 refused | refused 是端口没人监听,timeout 常是被防火墙静默丢包 |
| 只在客户端这边折腾 | 同时去服务端 ss -lntp、看防火墙、看应用日志 |
| 边排查边随手改路由 / 防火墙 | 排查只用只读命令;确认结论再改,改前想好回滚 |
版权归属:Shuo Liu