2.7.5 抓包工具与过滤表达式(tcpdump/wireshark)
本节聚焦生产环境最常用的抓包工具与过滤表达式,通过安装、示例、排错流程与练习,快速输出可复用的诊断结论。
工具定位与适用场景#
- tcpdump:命令行抓包,适合服务器无图形界面、临时排障、自动化脚本采集。
- Wireshark:图形化解析,适合离线分析、协议细节解码、可视化追踪会话。
- tshark:Wireshark 的命令行版本,适合批量分析与CI脚本。
抓包分析原理草图#
安装与环境准备#
Linux 安装 tcpdump/tshark#
# Debian/Ubuntu
sudo apt update
sudo apt install -y tcpdump tshark
# RHEL/CentOS
sudo yum install -y tcpdump wireshark-cli
# 验证版本
tcpdump --version
tshark --version
Windows/macOS 安装 Wireshark#
- Windows/macOS:官网下载并默认安装即可,安装时勾选 Npcap。
tcpdump 基本使用范式(含命令解释)#
选择网卡与抓包保存#
# 列出网卡(便于选择实际业务网卡)
ip link show
# 抓取 eth0 上 80 端口流量并保存
sudo tcpdump -i eth0 -nn -vv port 80 -w /tmp/http_eth0_80.pcap
# 参数说明:
# -i eth0 指定网卡
# -nn 不解析主机名/端口名,避免DNS干扰
# -vv 更详细输出
# -w 保存为 pcap 文件
控制包数与轮转(避免影响业务)#
# 抓取 200 个包后退出
sudo tcpdump -i eth0 -nn -c 200 host 10.0.0.5 -w /tmp/200pkts.pcap
# 每 60 秒切一个文件,保留 10 个文件
sudo tcpdump -i eth0 -nn -G 60 -W 10 -w /tmp/cap_%Y%m%d%H%M%S.pcap
常用过滤表达式示例(可直接执行)#
# 指定源/目的端口
sudo tcpdump -i eth0 -nn 'src port 443'
sudo tcpdump -i eth0 -nn 'dst port 3306'
# 指定主机/子网
sudo tcpdump -i eth0 -nn 'host 10.0.0.5'
sudo tcpdump -i eth0 -nn 'net 10.0.0.0/24'
# TCP 三次握手(SYN 或 ACK)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
# HTTP GET 关键字(负载字节)
sudo tcpdump -i eth0 -nn 'tcp[32:4] = 0x47455420'
Wireshark 过滤表达式与显示过滤#
过滤类型与示例#
- 捕获过滤(抓包前,减小数据量):
# 捕获过滤语法与 tcpdump 相同
host 10.0.0.5 and tcp port 3306
- 显示过滤(抓包后,强大精细):
ip.addr == 10.0.0.5
tcp.port == 3306
http
tcp.analysis.retransmission
tcp.analysis.duplicate_ack
会话追踪操作步骤#
- 打开 pcap → 选中 TCP 报文
- 右键 → Follow → TCP Stream
- 查看请求/响应完整内容与时延
典型抓包策略与排错流程#
排错流程(示例:业务响应慢)#
# 1) 先限定目标与端口,避免大范围抓包
sudo tcpdump -i eth0 -nn host 10.0.0.5 and port 8080 -w /tmp/app_8080.pcap
# 2) 观察握手是否完成(是否出现大量 SYN 重试)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0' -c 50
# 3) 离线分析 pcap(Wireshark/tshark)
tshark -r /tmp/app_8080.pcap -Y 'tcp.analysis.retransmission'
排错要点清单#
- 连接是否建立:是否完成三次握手,是否有 SYN 重试
- 服务是否响应:请求是否到达,响应是否返回
- 性能问题判断:RTT 是否异常,是否存在重传/乱序/窗口过小
- 路径问题判断:是否出现 ICMP 不可达或 RST
tshark 批量分析示例#
# 统计每个 TCP 会话的往返时间
tshark -r /tmp/app_8080.pcap -q -z io,stat,1
# 输出过滤后的关键报文(重传)
tshark -r /tmp/app_8080.pcap -Y 'tcp.analysis.retransmission' \
-T fields -e frame.time -e ip.src -e ip.dst -e tcp.seq
常用排障结论模板(可直接复用)#
- 连接是否建立:三次握手是否完成,SYN 重试次数为 N
- 服务是否响应:请求是否到达服务端,响应是否返回客户端
- 性能问题判断:RTT 为 X ms,存在/不存在重传
- 中间设备问题:是否出现 ICMP 不可达或 TCP RST
练习(动手验证)#
- 抓取本机 SSH 流量并保存:
sudo tcpdump -i any -nn port 22 -w /tmp/ssh.pcap
- 用 Wireshark 打开 /tmp/ssh.pcap,使用显示过滤:
tcp.port == 22
- 找出至少 1 次三次握手,并截图说明是否完整。
- 使用 tshark 输出重传报文(如无重传,说明原因)。
通过掌握 tcpdump 捕获表达式与 Wireshark 显示过滤,将抓包结果转化为清晰可验证的诊断结论,形成可复用的排障闭环。