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:查看网络连接和端口
ss 是 netstat 的现代替代品,速度更快:
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分钟内定位。
