Skip to content

网络诊断与排错

网络故障排查按从下往上的顺序收敛:地址→路由→DNS→端口→协议响应→抓包。每步用对应的工具,不跳层、不乱序。

一、收集基础信息

四个命令,先看本机的网络基本面:

bash
ip addr                 # 网卡有没有 UP、IP 对不对
ip route                # 默认路由和静态路由是否正确
cat /etc/resolv.conf    # DNS 指向哪里
ss -lntp                # 哪些服务在监听哪些端口

很多问题到这一步就已经暴露出来了,不需要继续往下查。

二、ping

bash
ping -c 4 8.8.8.8           # ping IP
ping -c 4 example.com       # ping 域名

能 ping 通 IP 但 ping 不通域名 → DNS 问题。IP 也 ping 不通 → 继续排查路由、防火墙、云安全组。

ping 用的是 ICMP 协议,有些服务器和网络设备主动禁 ICMP,ping 不通不代表业务端口不通。HTTP、SSH 这类服务还是要直接测试端口。

三、traceroute 和 mtr

traceroute 显示数据包经过的路径:

bash
traceroute 8.8.8.8

mtrtraceroute + ping 的合体版本,持续统计每一跳的丢包率和延迟:

bash
mtr 8.8.8.8
mtr -rw 8.8.8.8       # -r 报告模式,-w 宽输出,适合截图

安装:

bash
yum install traceroute mtr -y
apt install traceroute mtr -y

看 mtr 输出时一个容易误判的点:中间某一跳的丢包率很高,不等于是那台路由器有问题。许多路由器限制 ICMP 回复速率或者直接不回复,最终目的地址有没有丢包、延迟是否正常才是关键指标。

四、curl 测试 HTTP

HTTP 层的排查优先用 curl,它是 HTTP 客户端的事实标准。

bash
curl -I http://example.com               # 只看响应头
curl -v http://example.com               # 看完整的请求-响应过程
curl -fsS http://127.0.0.1:8080/healthz   # 静默但保留错误

常用参数:

参数作用
-IHEAD 请求,只看响应头
-v显示连接过程(DNS 解析、TLS 握手、请求头)
-f收到 HTTP 4xx/5xx 时将退出码设为失败
-sS-s 静默(去掉进度条),-S 保留错误信息
-L自动跟随重定向
-k忽略 TLS 证书校验(测试时用,生产脚本避免)

脚本里健康检查的典型写法:curl -fsS http://127.0.0.1:8080/healthz。失败时有非零退出码,也有错误输出,方便监控和排错。

五、DNS 诊断

bash
getent hosts example.com         # 走系统 NSS,模拟真实解析路径
dig example.com                  # 直接查 DNS
dig @8.8.8.8 example.com         # 指定 DNS 服务器做对比

排查 DNS 问题时,需要同时关注两个文件:

bash
cat /etc/nsswitch.conf           # 看解析顺序(files 在 dns 前还是后)
cat /etc/resolv.conf             # 看当前 DNS 服务器

/etc/hosts 写死的旧 IP 是 DNS 排查中常见的老问题:"dig 出来已经是新 IP 了,但应用层还是连旧 IP"——就是因为 nsswitch 里 files 排在 dns 前面。

六、ss 查看连接

本机监听的查看:

bash
ss -lntp               # -l 监听,-n 不解析名称,-t TCP,-p 进程

查看所有 TCP 连接:

bash
ss -antp | grep ':3306'

TCP 连接状态:

状态含义
LISTEN正在监听,等待客户端连接
ESTAB连接已建立,正在传输数据
TIME-WAIT连接已关闭,等待残留数据包超时
SYN-SENT客户端已发 SYN,等待服务端回应
SYN-RECV服务端收到 SYN,等待客户端 ACK

大量 SYN-SENT → 客户端发出的 SYN 没收到回应(对端不可达或被拦截)。大量 TIME-WAIT 不一定是问题——它是 TCP 的正常收尾状态。但如果同时出现端口耗尽(高并发短连接场景),才需要考虑调整内核参数或改连接方式。

七、tcpdump 抓包

抓包是最后一层手段,用之前先尽量把问题范围缩小。

bash
tcpdump -i eth0 host 10.0.0.1                    # 只看与 10.0.0.1 通信的包
tcpdump -i eth0 port 80                           # 只看 80 端口的包
tcpdump -i eth0 host 10.0.0.1 and port 443        # 两个条件取交
tcpdump -i eth0 -w /tmp/debug.pcap host 10.0.0.1  # 保存到文件
tcpdump -i eth0 -c 100 port 53                    # 抓 100 个包后停止

生产环境抓包要控制过滤条件和抓包时长。不设过滤的全量抓包会快速生成大文件,也可能捕获业务敏感数据。

八、排错的统一顺序

步骤命令要确认的
本机地址ip addr网卡是否 UP、IP 和掩码是否对
路由ip route默认路由是否存在、是否有冲突路由
DNSgetent hosts <domain>域名能否解析、解析结果对不对
本机端口ss -lntp服务是否在监听、监听地址对不对
本机访问curl http://127.0.0.1:port回环能否访问
远端访问curl http://server:port跨网络能否访问
抓包tcpdump数据包实际在哪里断了

两个诊断结果最有用:

  • Connection refused → 已到达目标机器,但目标端口没有服务在监听(或被主动拒绝)
  • Connection timed out → 中间网络、防火墙、安全组、回包路径某个环节有问题

把这两种情况分清楚,后续方向就不会跑偏。