用管道做统计
tcpdump 每行输出的结构很规整,把它交给 awk、sort、uniq 就能算出来源地址排行、端口分布、SYN 次数等聚合结果,比逐行肉读高效得多。这种方式不依赖额外工具,现场只有 tcpdump 时特别实用;但对精度要求高的统计,仍建议换用 tshark 的统计功能。
基本信息
| 适用平台 | Linux / macOS / BSD 均可 |
|---|---|
| 依赖工具 | awk、sed、sort、uniq 等基础命令 |
| 推荐流程 | 先按条件抓取或落盘,再做离线聚合 |
| 替代方案 | tshark -z 系列统计更精确,适合正式报告 |
| 注意 | 输出字段位置随选项变化,写脚本前先看实际格式 |
典型使用场景
- 统计哪个来源 IP 发包最多,快速锁定扫描或异常主机
- 统计目标端口分布,看业务流量构成
- 统计某个端口上出现的 SYN 次数,判断连接尝试规模
- 离线重放历史抓包,得到总量与时间跨度
- 抓包样本较大时先落盘,再用同一条命令反复统计
常用示例
常用示例
tcpdump -i eth0 -nn -c 1000 'tcp[tcpflags] & tcp-syn != 0' | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head # 来源排行
tcpdump -nn -r a.pcap | awk '{print $5}' | sed 's/.*\.//' | sort | uniq -c | sort -rn | head # 端口分布
tcpdump -nn -r a.pcap 'tcp[13] & 2 != 0' | wc -l # SYN 总数
tcpdump -nn -r a.pcap | wc -l # 总包数统计目标与做法
| 统计目标 | 做法要点 | 说明 |
|---|---|---|
| 来源地址排行 | 取源地址字段后排序计数 | 先确认字段所在列 |
| 端口分布 | 取目标端口字段去重计数 | 注意 -q 会改变列数 |
| SYN 次数 | 先过滤 SYN 再计数 | 配合 wc -l 得到规模 |
| 总包数 | 离线重放后统计行数 | 最直观的量级指标 |
大样本下管道处理慢会拖累抓包消费并触发内核丢包,先落盘再统计更稳妥。
写 awk 之前先用 -c 5 抓几行看真实输出格式,字段号对不上是这类脚本最常见的失败原因。
补充要点
- 统计前先固定抓包条件,否则每次结果口径不同、无法横向比较
- 把常用统计命令写成小脚本,重复排查时直接调用
- 容器环境要确认抓的是容器网卡还是宿主机网卡,两者结果差异很大
- 结果量级明显异常时先怀疑抓包点漏采,不要急于下业务结论
需要写进正式报告时优先用 tshark 的统计输出,结果可复现且不受终端格式影响。