一句话总结
网络排查的思路是从下往上分层定位:先看通不通(ping),再看域名解析对不对(dig),然后看端口开没开(ss,nc),最后看应用层响应(curl).
每个工具对应网络栈的一层,出问题时逐层往上排查.
分层排查的思路
"网站打不开"是个模糊的故障描述,背后可能是十几种原因.高效排查的关键是不要乱猜,按网络分层顺序逐层验证--每一层都有对应的诊断命令.
排查网络就像查一条断了的供水管:
先确认水厂到小区通不通(ping),门牌号查得对不对(DNS 解析),水龙头开没开(端口监听),最后才是水质好不好(应用响应).
从下游往上游一段段排,而不是一上来就拆水龙头.
|
ping:连通性的第一道探针
ping 向目标主机发送 ICMP 回显请求包,看对方是否应答,以此判断"网络层是否可达"以及往返延迟(RTT).它是排查的第一步,也是最快的"通不通"判断.
|
三个关键读数:
- packet loss(丢包率):0% 才健康,持续丢包说明链路不稳
- time(延迟):同城几毫秒,跨国上百毫秒属正常;突然飙高说明网络拥塞
- ttl:Time To Live,每过一个路由器减 1,可粗略估算中间跳了几个路由
ping 不通 ≠ 网站挂了
很多服务器(包括部分大厂)主动屏蔽 ICMP 来防止被扫描--这时 ping 超时,但 HTTP 服务完全正常.所以 ping 不通只能说明"ICMP 不可达",不能直接判定服务死了,要结合 curl 等应用层工具一起看.
dig / nslookup:DNS 解析排查
域名(如 example.com)最终要被解析成 IP 地址才能连接.这一步出错,表现往往是"某些机器能访问,某些不能"或"刚改了 DNS 还没生效".dig(Domain Information Groper)是排查 DNS 的标准工具,比老旧的 nslookup 输出更清晰.
|
常见的 DNS 记录类型:
| 类型 | 含义 |
|---|---|
A |
域名 → IPv4 地址(最常见) |
AAAA |
域名 → IPv6 地址 |
CNAME |
别名,指向另一个域名 |
MX |
邮件交换服务器 |
TXT |
任意文本,常用于域名验证,SPF 等 |
NS |
该域名的权威 DNS 服务器 |
如果 dig example.com 解析出旧 IP,但 dig @8.8.8.8 example.com 是新 IP,说明是本地的 DNS 缓存还没过期,而非 DNS 配置错误.这个对比是排查"改了 DNS 不生效"的关键一招.
ss / netstat:看端口与连接
服务进程要对外提供功能,得监听某个端口(如 Web 服务监听 80/443)."端口到底有没有被监听"是排查"连接被拒绝"的核心.ss(socket statistics)是现代 Linux 的首选,比已被淘汰的 netstat 快得多.
|
注意监听地址的区别--这是高频踩坑点:
| 监听地址 | 含义 |
|---|---|
0.0.0.0:80 |
监听所有网卡,外部机器可访问 |
127.0.0.1:5432 |
只监听本机回环,外部连不上(常见的"本地能连,远程拒绝"原因) |
|
nc(netcat):端口连通性测试
ping 测的是"主机可达",但真正关心的常常是"这个端口能不能连上".nc(netcat,网络瑞士军刀)可以直接探测 TCP/UDP 端口是否开放,不依赖 ICMP.
|
ping 是敲整栋楼的大门问"有人在吗",nc 是直接敲某个房间号(端口)问"这间屋开门吗".
服务排查关心的几乎总是后者--具体端口通不通.
traceroute:追踪路由路径
当 ping 延迟异常或不通,traceroute 能告诉你数据包在哪一跳卡住了.它利用 TTL 逐跳递增的技巧,让沿途每个路由器都回报自己,从而画出完整路径.
|
某一跳之后持续全是 * * * 且到不了终点,基本就是那一跳的链路出了问题.单独某跳超时通常是该路由器禁了探测包,不必紧张.
curl / wget:应用层请求
排查到最上层--HTTP 应用层,主角是 curl 和 wget.两者都能发请求,但定位不同:
| 工具 | 定位 |
|---|---|
curl |
万能 HTTP 客户端,调试 API,看响应头的首选,默认输出到屏幕 |
wget |
专注下载文件,支持断点续传,递归下载整站 |
curl:调试 HTTP 的利器
|
curl -v 是 HTTP 排查的瑞士军刀
加上 -v,curl 会把 DNS 解析结果,连接的 IP,TLS 证书信息,完整请求头和响应头全部打出来."HTTPS 报证书错误""请求带没带对 header""重定向到哪去了"这类问题,一个 curl -v 几乎都能看明白.
wget:下载专精
|
速记:调试用 curl,下载用 wget
要看 API 响应,调头,测状态码 → curl;要把文件抓到本地,断点续传,整站镜像 → wget.两者功能有重叠,但记住这个分工就够日常使用.
快速回顾
- 分层排查:连通性 → DNS → 端口 → 应用,从下往上逐层定位,不要乱猜
- ping:测连通性和延迟,看丢包率和 RTT;但 ICMP 常被屏蔽,ping 不通 ≠ 服务挂了
- dig +short:查 DNS 解析,
@8.8.8.8指定服务器可区分"本地缓存"还是"真没解析" - ss -tlnp:看监听端口和进程;注意
0.0.0.0(对外) vs127.0.0.1(仅本机)的区别 - nc -zv 主机 端口:精确测试某端口通不通,比 ping 更贴近真实排查需求
- traceroute:追踪路由路径,定位"卡在哪一跳";单跳
* * *多为禁探测,不必紧张 - curl 调试 HTTP/API(
-v看全过程,-I看头,-w取状态码),wget 专注下载(-c断点续传)
动手练习
- 延迟对比:用
ping -c 4分别 ping 一个国内站点和一个国外站点,对比延迟差异 - DNS 解析:用
dig +short查一个网站的 A 记录,再用dig @8.8.8.8对比,看是否一致 - MX 记录:用
dig MX查gmail.com或qq.com的邮件服务器记录 - 端口监听:用
ss -tlnp看本机有哪些端口在监听,找出 SSH(22)和正在跑的服务 - 端口探测:用
nc -zv测试某个网站的 80 和 443 端口是否开放,再随便测一个肯定关闭的端口对比输出 - HTTP 状态码:用
curl -I看某网站的响应头,再用curl -s -o /dev/null -w "%{http_code}"只取状态码 - 路由追踪:用
traceroute(macOS 自带)追踪到某个国外网站的路径,数一数中间经过几跳