2.3 命令行采集三件套:dumpcap、tcpdump 与远程回流


2.3 命令行采集三件套:dumpcap、tcpdump 与远程回流

机房没有显示器、服务器没有图形栈、目标机在千里之外——真实世界的采集多数发生在命令行里。本节把 2.1 节的配置原则翻译成命令行姿势:dumpcap 做最小权限的长跑采集,tcpdump 做应急与管道,加密通道把远程流量实时回流到本地解剖台。这些技能是第 8 章自动化分析和第 9 章云原生采集的前置。

dumpcap:专职采集,长跑首选

GUI 版 Wireshark 抓包时,真正干活的也是 dumpcap——它是家族里唯一需要特权的成员,别的成员都能以普通用户运行。单独部署时它就是一台"采集机":

# 每 5 分钟滚动一个文件,保留 12 个,共一小时窗口,过滤掉管理流量 $ sudo dumpcap -i eth0 -f "not port 22" \ -b duration:300 -b files:12 -w /data/capture/hourly.pcapng # 采集 10 分钟后自动收工(-a 与 -b 是一对:a 触发停止,b 触发滚动) $ sudo dumpcap -i eth0 -a duration:600 -w incident.pcapng Packets: 48211, Wrote: 48211 (100.0%)

两个细节值得记住:-f 后面是 BPF 语法(捕获过滤,进门筛),-b duration 按时间滚动而 -b filesize 按大小滚动;-a 是"到点收工",和 -b 可以组合成"滚着抓、到点停"。权限上,Linux 可以把账号加进 pcap 组或用 setcap 给二进制授权,避免脚本里到处是 sudo。

tcpdump:哪里都有它

tcpdump 的价值在于装机量和熟练度:几乎每台 Unix 机器都预装它。会话示例——先看摘要再决定要不要落盘:

# 快速目检:只看 20 条,-nn 禁用名字与端口解析,输出最快 $ sudo tcpdump -nn -i eth0 -c 20 tcp port 443 10:41:07.213901 IP 192.168.31.14.52114 > 203.0.113.25.443: Flags [S], seq 3316898041, win 64240, ... 10:41:07.240822 IP 203.0.113.25.443 > 192.168.31.14.52114: Flags [S.], seq 4081221925, ack 3316898042, win 28960, ... 10:41:07.241109 IP 192.168.31.14.52114 > 203.0.113.25.443: Flags [.], ack 1, win 64240, length 0

这三行是一场完整握手的前两个回合(第三次 ACK 已在途)—— Flags 列的 S、S.、. 是 tcpdump 界的速记:S 是 SYN,S. 是 SYN+ACK,一个点是无标志纯 ACK。length 0 说明纯确认不带数据。能读懂这行摘要,服务器上不用传文件也能做初筛。

落盘姿势与 dumpcap 一致(-w-s-G 按秒滚动、-W 保留个数),tcpdump 独有的优势在下一小节:它的标准输出可以当管道用。

远程回流:把千里之外的流量引上台面

姿势一:加密管道实时回流。 远端 tcpdump 抓、本地 Wireshark 剖,一行命令:

$ ssh admin@203.0.113.10 "sudo tcpdump -i eth0 -w - -s 0 -U not port 22" \ | wireshark -k -i -

拆开看:远端 -w - 表示写标准输出,-U 让每包立刻吐出而不是攒满缓冲;本地 wireshark -k -i - 从标准输入读、-k 立即开始。于是本地屏幕上,远程网卡像本地网卡一样滚动出实时报文。not port 22 在这里不是可选项——不加它,管道会把自己的传输流量也喂回来,形成回声放大。

02-03-fig01

姿势二:远端落盘再拉回。 高流量或证据案不适合管道:回流本身占带宽,网络抖动会污染时间轴。远端用 dumpcap 环形滚动,结束后用 scp 拉回,capinfos 验明正身再上解剖台。

姿势三:定时采集。 例行的业务高峰观测交给计划任务,例如每天 10 点整抓一刻钟:

# crontab 条目:每天 10:05 起抓 15 分钟,文件名带日期,抓完自动压缩 5 10 * * * /usr/bin/dumpcap -i eth0 -a duration:900 -s 256 \ -f "tcp port 443 or tcp port 8443" \ -w /data/capture/peak_$(date +\%Y\%m\%d).pcapng && gzip /data/capture/peak_*.pcapng

三个工程细节:故意错开整点 5 分钟,避免与其他整点任务抢资源;snaplen 256 只留头部,观测吞吐与握手足够;% 在 crontab 里有特殊含义,必须写成 \%

无线与特殊介质的补充

无线采集要先把网卡切到监听模式:iw dev wlan0 set monitor none 之后,tcpdump 就能收到空口帧(含 802.11 管理帧与重传前的原始帧)。容器场景的采集姿势(kubectl exec 进目标 Pod 或在宿主机按 veth 抓)留到 9.2 节展开——那里的难点不在命令,而在"网卡在哪"。

⚠️ 回流姿势一的隐蔽坑:本地 Wireshark 若开着名称解析,会对每个新地址发反向 DNS 查询,这些查询发往本地网络,混进你的分析视野。远程勘验时把解析关掉(视图里的名字解析选项,或 tshark 加 -n)。

采集会话实录:一次"远程服务偶发超时"的取证式采集

把三件套串成一个真实流程。案情:异地机房的网关服务偶发超时,每天约十几次,无法复现。

方案设计(案由决定姿势,1.3 节):偶发问题抓不到"恰好在抓"的那一刻,改为值守式环形采集——用短窗口环形文件组保住"事发前后的现场"。

# 第 1 步:远程部署 dumpcap 守候(SSH 到网关旁的采集机) $ ssh admin@203.0.113.10 admin$ sudo dumpcap -i eth1 -f "tcp port 8443 and host 10.0.3.17" \ -b filesize:65536 -b files:48 -w /data/watch/gw.pcapng # 单文件 64MB × 48 个 = 最多 3GB 磁盘,滚动窗口约覆盖两小时 # 第 2 步:次日告警再来时,先定位事发窗口再取件 admin$ capinfos /data/watch/gw_0021.pcapng | grep -E "First|Last" First packet time: 2026-09-04 14:02:11 ... Last packet time: 2026-09-04 14:19:45 ... # 超时告警时间 14:15 → 对应文件 0021,前后各取一个文件 # 第 3 步:拉回本地(加密通道传输证据) $ scp admin@203.0.113.10:/data/watch/gw_002[012].pcapng ./evidence/ # 第 4 步:本地合并窗口、开始解剖 $ mergecap -w window.pcapng evidence/gw_0020.pcapng evidence/gw_0021.pcapng evidence/gw_0022.pcapng $ tshark -r window.pcapng -Y "tcp.analysis.flags" -c 10

第 1 步的过滤条件是关键决策:限定端口与主机把 3GB 的价值密度拉满——事后证明,事发窗口的重传证据就安静地躺在 0021 号文件里。值守式采集的设计核心是"滚动窗口 ≥ 故障间隔",文件粒度 ≤ 症状持续时间,参数都是为案情特征服务的。

常见疑问

**问:管道回流和远端落盘到底选哪个?**看两个维度:交互性(想边看边筛选管道)与完整性(要证据链选落盘)。管道断线即断流且时间轴受网络抖动影响;落盘不受回流链路任何影响。偶发问题值守一律落盘,交互探索才用管道。

**问:远程机器没有 root 怎么办?**dumpcap 需要抓包权限,两个出路:让管理员把你的账号加进抓包权限组(一次配置长期有效);或请管理员起一个受限的 systemd 采集服务,你只读产物文件。后者在取证场景更规范——权限与操作全程可审计(6.2 节的留痕要求)。

结案要点

  • 长跑采集用 dumpcap:最小权限、专职、-b 滚动 -a 收工,是采集机的全部。
  • tcpdump 摘要即初筛:Flags 速记(S、S.、.、R、F)让你不传文件也能读出现场。
  • 管道回流三要素-w --Unot port 22,缺一个体验就崩。
  • 案型选姿势:交互用管道、取证用落盘、例行用定时。
  • crontab 里 % 要转义,整点任务主动错峰。

采集能力就位。下一章打开解剖台的外壳,看帧从网卡到屏幕之间那条流水线是怎么转的。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U