Appearance
网络诊断与排错
网络故障排查按从下往上的顺序收敛:地址→路由→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.8mtr 是 traceroute + 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 # 静默但保留错误常用参数:
| 参数 | 作用 |
|---|---|
-I | HEAD 请求,只看响应头 |
-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 | 默认路由是否存在、是否有冲突路由 |
| DNS | getent hosts <domain> | 域名能否解析、解析结果对不对 |
| 本机端口 | ss -lntp | 服务是否在监听、监听地址对不对 |
| 本机访问 | curl http://127.0.0.1:port | 回环能否访问 |
| 远端访问 | curl http://server:port | 跨网络能否访问 |
| 抓包 | tcpdump | 数据包实际在哪里断了 |
两个诊断结果最有用:
Connection refused→ 已到达目标机器,但目标端口没有服务在监听(或被主动拒绝)Connection timed out→ 中间网络、防火墙、安全组、回包路径某个环节有问题
把这两种情况分清楚,后续方向就不会跑偏。