首页/网络/抓包与流量分析速查/tcpdump -w 写入 pcap 文件

tcpdump -w 写入 pcap 文件

把抓到的原始报文写入 pcap 文件,供 Wireshark/tshark 离线分析;现场先落盘再研究是排障惯例,能保留字节级细节。

-w 在做什么

-w 让 tcpdump 把捕获到的原始字节按 pcap 格式写入指定文件,而不是打印成文本。文件里保存的是从链路层开始的原样数据(受 snaplen 限制),包含全部选项字段、载荷与高精度时间戳,因此事后可用 Wireshark 做任意解码,也能用 editcap、mergecap 做切片与合并。服务器上「先落盘、再离线分析」是通行做法:抓包时不必当场判断看什么,事后可以反复换角度。

基本信息

用途把原始报文写入 pcap 文件,供离线分析
语法tcpdump -w <文件> [选项] [过滤表达式]
默认格式经典 pcap;Wireshark 默认保存的是 pcapng,老工具读不了 pcapng
必需搭配-s 0 保证抓全;-nn 省掉解析开销
停止方式Ctrl+C、-c 计数、-G/-W 分卷或 timeout 命令

典型使用场景

  • 现场服务器抓包拷回本地,用 Wireshark 的图形能力细看
  • 需要留证或交接:把 pcap 附到工单里,别人可复核
  • 高流量口长时间抓取:用 -G 与 -W 做环形分卷,避免单文件无限增长
  • 抓包机无法联网或不便交互:先落盘,再由 tshark、mergecap 批处理
  • 与业务时间对齐:抓包文件按现场时间命名,方便与日志比对

常用示例

常用示例
tcpdump -i eth0 -nn -s 0 -w /tmp/issue.pcap 'host 10.0.0.9 and port 443'   # 单文件全量落盘
tcpdump -i any -s 0 -w /tmp/web.pcap 'tcp port 80 or tcp port 443'       # 多端口一起抓
tcpdump -i eth0 -w /tmp/roll.pcap -G 300 -W 12 -s 0 'port 3306'          # 每 300 秒分一卷,最多 12 卷循环
tcpdump -i eth0 -w /tmp/only.pcap -C 100 'port 443'                      # 每 100MB 分卷
timeout 120 tcpdump -i any -s 0 -w /tmp/win.pcap 'udp port 53'           # 两分钟后自动结束
chown ops:ops /tmp/issue.pcap                                            # 拷给分析同事前处理属主
scp /tmp/issue.pcap analyst@10.0.0.20:/data/pcap/                        # 传到分析机
editcap -F pcapng /tmp/issue.pcap /tmp/issue.pcapng                      # 需要 pcapng 时转格式

配套选项

选项作用使用建议
-s 0不截断,抓完整报文排查应用层问题必加
-G <秒>按时间滚动生成新文件长时间抓取配合 -W 限卷数
-W <数量>配合 -G/-C 限制文件数量,写满后回卷覆盖卷数与单卷大小要算好总占用
-C <MB>按文件大小分卷适合估算磁盘余量的场景
-z gzip写完后交给 gzip 压缩文本类协议压缩率可观
默认 snaplen 未必等于完整报文,各版本取值也不同。需要分析载荷时明确写 -s 0,否则事后在 Wireshark 里会看到 Packet size limited during capture 的截断提示。
-w 与 -A/-X 这类打印选项互斥:一旦写了 -w,输出就只有 pcap 二进制。需要在抓包同时看摘要,就同时开 -w 和若干 -c,或者先抓后读。

回读与验证

回读与验证
capinfos /tmp/issue.pcap            # 看包数、时长、是否有截断
mergecap -w /tmp/all.pcap /tmp/*.pcap   # 把分卷合并成一个文件
tshark -r /tmp/issue.pcap -Y 'http.response.code >= 500' | head   # 用显示过滤器筛回读内容

场景与参数组合

场景建议参数选择原因
短时复现单次故障-s 0 加 -c 上限写单文件样本够用就停,避免留下占空间的大文件
长时间盯一个端口-G 与 -W 做环形分卷,再加 timeout写满自动回卷覆盖,总占用可控不会写满磁盘
排查应用层内容显式写 -s 0默认快照长度可能截断载荷,事后无法还原
高并发大流量口先加主机或端口过滤再落盘全量抓取会让磁盘与抓包进程同时成为瓶颈
交接给他人分析停止后改属主再拷贝,附抓包时间与接口名对方要知道抓包点位置才能正确解读报文方向
与业务日志交叉比对文件名带现场时间,抓包机与业务机校时时钟不同步时无法把抓包与日志对齐到同一时刻

命名与归档习惯

  • 文件名带业务名与现场时间,事后不必靠回忆确认这份文件是哪个故障的
  • 抓包前记录接口名、抓包点位置与当时客户端地址,这三项决定报文方向怎么读
  • 分卷文件先用 mergecap 合并再分析,避免只看其中一段就下结论
  • 归档前用 capinfos 核对包数与时长,防止把空文件或不完整文件交出去

易错点

  • 不带 -s 0 抓包容易截断载荷,TLS 与 HTTP 内容事后无法还原,只能重抓
  • -w 仍把文件句柄开着,抓包中直接 scp 会拷到不完整文件,先停止再传或抓完分卷
  • 写文件不改属主:tcpdump 以 root 写入的文件普通用户读不了,交接前 chown 或改权限
  • 磁盘写满会导致抓包静默停止,长期抓包必须先估算占用并做环形分卷
  • pcapng 与 pcap 两种格式不是一回事,用旧版 tcpdump 读 Wireshark 默认保存的文件会报错

数据来源与参考

  • man 8 tcpdump(-w/-s 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌