「零壹运维 · 零到壹,永不宕」
★网络不通是运维日常最高频的求救信号。面对一个连不上的服务、一个时断时续的接口,你的第一反应是什么?本文系统梳理 Linux 网络诊断五大工具,从基础用法到实战场景,帮你建立一套清晰的网络排查方法论。
一、工具全景速查表
| | |
|---|
ping | | |
traceroute | | |
ss | | |
tcpdump | | |
curl | | |
二、ping — 连通性的第一道门
基本用法
ping <目标IP或域名>
核心参数详解
| | |
|---|
-c <n> | | ping -c 4 8.8.8.8 |
-i <秒> | | ping -i 0.2 192.168.1.1 |
-s <字节> | | ping -s 1400 10.0.0.1 |
-W <秒> | | ping -W 2 10.0.0.1 |
-t <TTL> | | ping -t 64 10.0.0.1 |
-q | | ping -q -c 100 10.0.0.1 |
-f | | ping -f -c 1000 10.0.0.1 |
输出解读
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=11.9 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 11.9/12.1/12.3/0.2 ms
| |
|---|
icmp_seq | |
ttl | |
time | |
packet loss | |
mdev | |
实战场景
# 场景1:快速判断是否可达(4包)
ping -c 4 192.168.1.100
# 场景2:持续监控,统计丢包(100包)
ping -q -c 100 10.0.0.1
# 场景3:测试大包是否有 MTU 问题(不分片)
ping -s 1472 -M do 192.168.1.1
# 场景4:ping 域名,顺带确认 DNS 解析
ping -c 2 api.example.com
★⚠️ 注意:部分服务器/防火墙禁止 ICMP,ping 不通 ≠ 服务不通。
三、traceroute — 找到断点在哪一跳
基本用法
traceroute <目标IP或域名>
# CentOS/RHEL 有时需要安装
yum install -y traceroute
核心参数详解
| | |
|---|
-n | | traceroute -n 8.8.8.8 |
-m <跳数> | | traceroute -m 20 8.8.8.8 |
-w <秒> | | traceroute -w 2 8.8.8.8 |
-p <端口> | | traceroute -p 80 8.8.8.8 |
-T | | traceroute -T -p 443 8.8.8.8 |
-I | | traceroute -I 8.8.8.8 |
输出解读
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max
1 192.168.1.1 1.234 ms 1.102 ms 1.098 ms ← 本地网关
2 10.10.10.1 5.432 ms 5.398 ms 5.401 ms ← 上级路由
3 * * * ← 该跳不响应 ICMP
4 8.8.8.8 12.345 ms 12.210 ms 12.198 ms ← 目标到达
实战场景
# 场景1:快速追踪,不做 DNS 反查
traceroute -n 8.8.8.8
# 场景2:用 TCP 探测(防火墙拦 UDP 时)
traceroute -T -p 443 api.example.com
# 场景3:mtr(推荐,实时动态展示)
mtr --report --report-cycles 20 8.8.8.8
★💡 推荐替代品:mtr(my traceroute)= ping + traceroute,实时动态,运维神器。
四、ss — 替代 netstat 的现代工具
ss(Socket Statistics)是 netstat 的现代替代品,速度更快,信息更全。
常用组合命令速查
# 查看所有监听端口(TCP)
ss -tlnp
# 查看所有监听端口(UDP)
ss -ulnp
# 查看所有已建立的 TCP 连接
ss -tnp state established
# 查看指定端口的连接
ss -tnp | grep :8080
# 查看某进程占用的所有 socket
ss -p | grep nginx
# 统计各状态 TCP 连接数
ss -s
参数详解
输出解读
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234))
tcp ESTAB 0 0 10.0.0.1:22 10.0.0.2:54321 users:(("sshd",pid=5678))
| |
|---|
State | 连接状态(LISTEN/ESTAB/TIME_WAIT等) |
Recv-Q | |
Send-Q | |
TCP 状态速查
| | |
|---|
LISTEN | | |
ESTABLISHED | | |
TIME_WAIT | | |
CLOSE_WAIT | | |
SYN_RECV | | |
实战场景
# 场景1:确认 nginx 是否监听 80/443
ss -tlnp | grep -E ':80|:443'
# 场景2:查看 TIME_WAIT 连接数,判断是否有连接风暴
ss -tn state time-wait | wc -l
# 场景3:查找占用 8080 端口的进程
ss -tlnp | grep :8080
# 场景4:查看某 IP 的所有连接
ss -tn dst 10.0.0.100
五、tcpdump — 深入流量的手术刀
tcpdump 是 Linux 网络调试的终极武器,能捕获并分析真实网络数据包。
基础语法
tcpdump [选项] [过滤表达式]
核心参数详解
| | |
|---|
-i <网卡> | | -i eth0 |
-n | | -n |
-nn | | -nn |
-v | | -vv |
-c <n> | | -c 100 |
-w <文件> | 写入 pcap 文件(供 Wireshark 分析) | -w /tmp/out.pcap |
-r <文件> | | -r /tmp/out.pcap |
-s <字节> | | -s 0 |
-A | | -A |
-X | | -X |
过滤表达式速查
# 过滤指定 IP
tcpdump host 10.0.0.1
# 过滤源 IP
tcpdump src 10.0.0.1
# 过滤目标 IP
tcpdump dst 10.0.0.1
# 过滤端口
tcpdump port 80
tcpdump port 80 or port 443
# 过滤协议
tcpdump tcp
tcpdump udp
tcpdump icmp
# 组合过滤
tcpdump host 10.0.0.1 and port 8080
tcpdump src 10.0.0.1 and not port 22
# 过滤 HTTP GET 请求
tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
实战场景
# 场景1:抓取 eth0 上所有 HTTP 流量,实时显示
tcpdump -i eth0 -nn -A port 80
# 场景2:抓包保存,供 Wireshark 离线分析
tcpdump -i any -s 0 -w /tmp/capture.pcap host 10.0.0.100
# 场景3:监控 DNS 请求
tcpdump -i any -nn port 53
# 场景4:抓取三次握手过程(SYN 包)
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'
# 场景5:排查 Pod 间通信(K8s 场景)
tcpdump -i cni0 host 10.244.0.5 and port 8080
# 场景6:统计某 IP 的流量包数
tcpdump -i eth0 -nn host 10.0.0.1 -c 1000 | wc -l
★⚠️ 生产注意:tcpdump 会消耗 CPU,生产环境加 -c 限制包数,或用 -w 保存后离线分析。
六、curl — HTTP 调试的瑞士军刀
curl 不只是下载工具,它是完整的 HTTP 客户端,运维排查 API 问题的标配。
核心参数详解
| | |
|---|
-v | | curl -v http://... |
-I | | curl -I http://... |
-o <文件> | | -o /tmp/out.html |
-O | | curl -O http://example.com/a.tar.gz |
-L | | curl -L http://... |
-s | | curl -s http://... |
-k | | curl -k https://... |
-u | | curl -u user:pass http://... |
-H | | -H "Authorization: Bearer xxx" |
-d | | -d '{"key":"val"}' |
-X | | -X DELETE http://... |
--connect-timeout | | --connect-timeout 5 |
--max-time | | --max-time 10 |
-w | | -w "%{http_code}" |
--resolve | | --resolve example.com:443:1.2.3.4 |
实战场景
# 场景1:测试接口是否正常,只看状态码
curl -s -o /dev/null -w "%{http_code}" http://api.example.com/health
# 场景2:发送 POST JSON 请求
curl -X POST http://api.example.com/v1/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"name":"test","email":"test@example.com"}'
# 场景3:测试 HTTPS,查看证书信息
curl -v https://api.example.com 2>&1 | grep -E "SSL|subject|expire"
# 场景4:性能分析(各阶段耗时)
curl -o /dev/null -s -w "
DNS解析: %{time_namelookup}s
TCP连接: %{time_connect}s
TLS握手: %{time_appconnect}s
首字节时间: %{time_starttransfer}s
总耗时: %{time_total}s
HTTP状态码: %{http_code}
" https://api.example.com
# 场景5:测试 K8s Service(绕过 DNS,直连 ClusterIP)
curl --resolve myservice.default.svc.cluster.local:80:10.96.0.100 \
http://myservice.default.svc.cluster.local/api/health
# 场景6:下载文件,显示进度,断点续传
curl -L -C - -o /tmp/bigfile.tar.gz http://example.com/bigfile.tar.gz
# 场景7:测试代理
curl -x http://proxy.example.com:8080 http://target.example.com
curl 性能指标解读
| | |
|---|
time_namelookup | | |
time_connect | | |
time_appconnect | | |
time_starttransfer | | |
time_total | | |
七、完整排查思路:网络不通怎么办?
网络问题报障
│
▼
[第1步] ping 目标IP
├── 通 → 继续下一步
└── 不通 → traceroute 定位断点
├── 本地网关不通 → 检查本机路由/防火墙
├── 中间节点断 → 联系网络管理员
└── 目标主机不通 → 检查目标机防火墙/服务
│
▼
[第2步] ss -tlnp 确认端口在监听
├── 端口监听正常 → 继续下一步
└── 端口未监听 → 服务未启动/启动失败,查日志
│
▼
[第3步] curl 测试 HTTP 接口
├── 200 OK → 接口正常,排查业务逻辑
├── 连接拒绝 → 端口问题,重回第2步
├── 连接超时 → 防火墙拦截,检查 iptables/安全组
├── 5xx 错误 → 服务端错误,查应用日志
└── SSL 错误 → 证书问题,curl -v 查看证书详情
│
▼
[第4步] tcpdump 抓包分析
├── 有包到达但无回包 → 应用层问题
├── 包到达但被 RST → 连接被拒绝
└── 无包到达 → 网络层/防火墙问题
八、工具组合实战案例
案例一:K8s Pod 访问外部服务失败
# Step1:进入 Pod 测试连通性
kubectl exec -it <pod-name> -- ping -c 3 external.api.com
# Step2:测试 DNS 解析
kubectl exec -it <pod-name> -- nslookup external.api.com
# Step3:测试 HTTP 接口
kubectl exec -it <pod-name> -- curl -v https://external.api.com/health
# Step4:在节点上抓包排查
tcpdump -i any host external.api.com -nn -c 50
案例二:服务响应慢排查
# Step1:curl 分析各阶段耗时
curl -o /dev/null -s -w "connect:%{time_connect} ttfb:%{time_starttransfer} total:%{time_total}\n" http://api.example.com
# Step2:查看连接状态,有无大量 TIME_WAIT
ss -s
# Step3:抓包看是否有重传
tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' host 10.0.0.1
案例三:端口被占用排查
# Step1:查占用 8080 的进程
ss -tlnp | grep :8080
# Step2:查该进程的所有网络连接
ss -tnp | grep <pid>
# Step3:抓取该端口流量确认
tcpdump -i any port 8080 -nn -c 20 -A
九、最佳实践总结
| |
|---|
| 先宏观后微观 | 先 ping/traceroute 定位层级,再 ss/tcpdump 深入 |
| 先确认监听 | |
| 用 -n 参数 | 所有工具加 -n 禁用 DNS 反查,避免干扰和延迟 |
| 生产限流抓包 | |
| 保存现场 | |
| 组合使用 | |
| 看日志结合 | |
十、命令速查卡(收藏备用)
# ===== ping =====
ping -c 4 IP # 基础连通测试
ping -q -c 100 IP # 批量测试,查丢包率
ping -s 1472 -M do IP # MTU 测试
# ===== traceroute =====
traceroute -n IP # 路由追踪(快速)
traceroute -T -p 443 domain # TCP 模式穿透防火墙
mtr --report IP # 动态路由监控
# ===== ss =====
ss -tlnp # 查所有监听 TCP 端口
ss -tnp state established # 查已建立连接
ss -s # 连接状态统计
ss -tnp | grep :8080 # 查指定端口
# ===== tcpdump =====
tcpdump -i eth0 -nn port 80 # 抓 HTTP 流量
tcpdump -i any -s 0 -w /tmp/out.pcap # 全量抓包保存
tcpdump -i any port 53 -nn # 监控 DNS
# ===== curl =====
curl -s -o /dev/null -w "%{http_code}" URL # 只看状态码
curl -v https://URL 2>&1 | grep SSL # 查 SSL 证书
curl -o /dev/null -s -w "ttfb:%{time_starttransfer} total:%{time_total}\n" URL # 性能分析
「零壹运维 · 零到壹,永不宕」
★系列导航
- 上一篇:《Linux 故障排查工具箱:top/htop/iostat/vmstat/netstat 详解》
- 下一篇:《Linux 日志排查实战:grep/awk/sed/journalctl 高频用法全解》(即将发布)