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

会话追踪操作步骤#

  1. 打开 pcap → 选中 TCP 报文
  2. 右键 → Follow → TCP Stream
  3. 查看请求/响应完整内容与时延

典型抓包策略与排错流程#

排错流程(示例:业务响应慢)#

# 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

练习(动手验证)#

  1. 抓取本机 SSH 流量并保存:
sudo tcpdump -i any -nn port 22 -w /tmp/ssh.pcap
  1. 用 Wireshark 打开 /tmp/ssh.pcap,使用显示过滤:
tcp.port == 22
  1. 找出至少 1 次三次握手,并截图说明是否完整。
  2. 使用 tshark 输出重传报文(如无重传,说明原因)。

通过掌握 tcpdump 捕获表达式与 Wireshark 显示过滤,将抓包结果转化为清晰可验证的诊断结论,形成可复用的排障闭环。