机房没有显示器、服务器没有图形栈、目标机在千里之外——真实世界的采集多数发生在命令行里。本节把 2.1 节的配置原则翻译成命令行姿势:dumpcap 做最小权限的长跑采集,tcpdump 做应急与管道,加密通道把远程流量实时回流到本地解剖台。这些技能是第 8 章自动化分析和第 9 章云原生采集的前置。
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 的价值在于装机量和熟练度:几乎每台 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 在这里不是可选项——不加它,管道会把自己的传输流量也喂回来,形成回声放大。

姿势二:远端落盘再拉回。 高流量或证据案不适合管道:回流本身占带宽,网络抖动会污染时间轴。远端用 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 节的留痕要求)。
-b 滚动 -a 收工,是采集机的全部。-w -、-U、not port 22,缺一个体验就崩。% 要转义,整点任务主动错峰。采集能力就位。下一章打开解剖台的外壳,看帧从网卡到屏幕之间那条流水线是怎么转的。