首页/网络/抓包与流量分析速查/tcpdump 输出统计与聚合

tcpdump 输出统计与聚合

把 tcpdump 输出交给 awk/sort/uniq 做聚合:统计来源 IP 排行、端口分布、SYN 次数等,比逐行肉读高效得多。

用管道做统计

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 的统计输出,结果可复现且不受终端格式影响。

易错点

  • 在高速链路上边抓边管道统计:下游处理慢导致内核缓冲溢出,统计结果本身失真
  • 字段号根据旧版本输出写死:不同选项或版本列数不同,脚本会在升级后悄悄算错
  • 对加密流量做端口统计后当成业务分布结论:NAT 与代理会改变端口含义

数据来源与参考

  • man 8 tcpdump
  • awk 手册(POSIX)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌