Linux 网络故障排查工具箱:tcpdump、ss、iperf3 实战指南


阿里云特惠 - 新用户专享

Linux 网络故障排查工具箱:tcpdump、ss、iperf3 实战指南

网络问题是最难排查的服务器故障之一。”服务访问慢”、”时不时超时”、”某个端口连不上”——这些问题背后可能是带宽打满、TCP 连接积压、网络抖动或防火墙拦截。本文整理一套实用的网络排查工具和方法论。

一、排查思路:OSI 模型从下往上排查

物理层/数据链路层:网卡状态、丢包率 → ethtool, ip link
网络层(IP/路由):路由是否正确、ICMP → ping, traceroute, ip route
传输层(TCP/UDP):端口是否监听、连接状态 → ss, netstat
应用层:服务是否正常响应 → curl, telnet, nc
性能:带宽、延迟、抖动 → iperf3, mtr
抓包分析:底层数据包 → tcpdump, wireshark

二、ss / netstat:查看网络连接和端口

ssnetstat 的现代替代品,速度更快:

ss -tulpn              # 显示所有监听端口(-t TCP -u UDP -l 监听 -p 进程 -n 不解析域名)
ss -tnp state ESTABLISHED  # 所有已建立的 TCP 连接
ss -tnp | grep :3306   # 查找 MySQL 相关连接
ss -s                  # 连接状态统计摘要(TIME_WAIT 数量等)

# TIME_WAIT 过多怎么处理?
# 这通常是短连接场景(HTTP 短连接、大量 API 调用)的正常现象
# 优化:开启 TCP 连接复用 + 快速回收
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=15

三、tcpdump:抓包分析神器

# 抓取 eth0 接口的 HTTP 流量(保存到文件供 Wireshark 分析)
tcpdump -i eth0 -w /tmp/capture.pcap

# 实时查看 80 端口的 HTTP 请求 URL
tcpdump -i eth0 -A -s 0 'tcp port 80' | grep -oP 'GET \K[^ ]*'

# 抓取指定主机的所有流量
tcpdump -i eth0 host 1.2.3.4

# 抓取 MySQL 流量(不解密,但可看 SQL 语句)
tcpdump -i lo port 3306 -A -s 0 | grep -a "SELECT\|INSERT\|UPDATE\|DELETE"

# 抓取 DNS 查询
tcpdump -i eth0 port 53 -n

# 常用过滤表达式
tcpdump -i eth0 'tcp port 443 and host 192.168.1.10'
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'  # 只抓 SYN 包

四、ping + traceroute + mtr:路径分析

# 基础连通性测试
ping -c 10 -i 0.2 8.8.8.8  # 快速发10个包,统计丢包率

# 路由追踪(查看经过哪些节点)
traceroute -n 8.8.8.8     # -n 不解析域名,更快
traceroute -T -p 80 8.8.8.8  # TCP 方式追踪(穿透 ICMP 过滤的防火墙)

# mtr:combine ping + traceroute,实时显示每跳的丢包和延迟
mtr -n -r -c 20 8.8.8.8  # 发 20 个包后出报告

用 mtr 观察中间节点,如果第 N 跳以后全部 100% 丢包而 N 之前正常,说明故障在第 N 跳(而不是真正丢包,可能是 ICMP 限速)。

五、iperf3:带宽测试

# 测试两台服务器之间的网络带宽(需要两端都安装 iperf3)
# 服务端
iperf3 -s -p 5201    # 监听 5201 端口

# 客户端
iperf3 -c server_ip -p 5201 -t 30   # 测试 30 秒 TCP 带宽
iperf3 -c server_ip -u -b 100M -t 10  # UDP 测试,目标带宽 100Mbps

# 双向测试(同时测上行和下行)
iperf3 -c server_ip --bidir

如果测出的带宽远低于网卡速率,可能是:CPU 处理能力不足、MTU 配置不当、网络设备限速。

六、curl + httpie:HTTP 接口调试

# 详细显示 HTTP 请求过程(连接时间、DNS 时间等)
curl -v https://api.example.com/health

# 统计各阶段耗时(排查接口慢的原因)
curl -o /dev/null -s -w "DNS: %{time_namelookup}s | Connect: %{time_connect}s | TTFB: %{time_starttransfer}s | Total: %{time_total}s
" https://api.example.com

# 忽略证书验证(测试用,勿用于生产)
curl -k https://self-signed.example.com

# 指定 Host 头(测试 Nginx 虚拟主机)
curl -H "Host: api.example.com" http://192.168.1.10/health

# 测试 POST 接口
curl -X POST -H "Content-Type: application/json"   -d '{"username":"test","password":"test123"}'   https://api.example.com/login

七、常见网络问题诊断速查

现象 排查工具 可能原因
无法访问某端口 ss -tulpn, iptables -L 服务未监听 / 防火墙拦截
访问超时不报错 traceroute, tcpdump 中间节点丢包 / 连接被 DROP
带宽跑不满 iperf3, ethtool CPU 瓶颈 / 网卡设置 / 路由问题
DNS 解析慢 dig, systemd-resolve –statistics DNS 服务器响应慢
TIME_WAIT 爆炸 ss -s 短连接太多,需开启连接复用

总结

网络排查是一门经验科学。面对”网络有问题”这类模糊描述时,要按层次递进:先确认物理连通性(ping),再看路由和丢包(mtr/traceroute),再看端口和进程(ss),最后用 tcpdump 抓包确认数据内容。掌握这套工具链,90% 的网络问题都能在30分钟内定位。

发表评论