tcpdump 本身不能自动统计 ip 流量,但可配合 awk 实时按源/目标 ip 统计字节数或包数,避免生成大文件;推荐用 -nn -t -q 简化输出,提取 $3 或 $5 的 ip 段,累加 $nf(长度)或计数,再排序取 top10。

直接用 tcpdump 本身不能自动统计各 IP 的流量字节数或包数,它只负责捕获原始数据包。但你可以用 tcpdump 配合其他命令(主要是 awk)快速完成基于 IP 的流量统计,无需保存大文件、不依赖数据库,适合应急分析。
核心思路:边抓边统计,避免生成巨型 pcap
不推荐先用 tcpdump -w 抓满 60 秒再解析——那样文件动辄几十 MB,解析慢还占磁盘。更高效的做法是:
- 用 tcpdump 实时输出简明格式(-nn 表示不解析域名和端口名,-t 去掉时间戳,-q 精简显示)
- 用 awk 按源/目标 IP 提取字段,累加包长(第 10 列通常是 IP 总长度)
- 最后按 IP 汇总排序,看谁“最能发”
统计入站(发往本机)各源 IP 流量(字节)
运行以下命令,持续 30 秒后自动结束:
sudo tcpdump -i any -nn -t -q -c 30000 'ip' 2>/dev/null | awk '{if ($3 ~ /:/) next; split($3, a, "."); ip=a[1]"."a[2]"."a[3]"."a[4]; len=$NF; if (len ~ /^[0-9]+$/) sum[ip] += len} END {for (i in sum) print sum[i], i}' | sort -nr | head -10说明:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
-c 30000控制最多抓 3 万包,防卡死;你也可改用timeout 30s限制时长 -
$3是源 IP 字段(如192.168.1.100.12345),用split截出纯 IP 部分 -
$NF是每行末尾的包长度(单位字节),tcpdump 默认输出里有 - 结果按字节数倒序,取前 10 名
统计出站(本机发出)各目标 IP 流量(包数)
如果更关心连接频次而非带宽,统计包数更轻量:
sudo tcpdump -i any -nn -t -q -c 20000 'ip and src host 192.168.1.50' 2>/dev/null | awk '{split($5, a, "."); ip=a[1]"."a[2]"."a[3]"."a[4]; count[ip]++} END {for (i in count) print count[i], i}' | sort -nr说明:
-
src host 192.168.1.50锁定本机 IP,确保只统计它发出的包 -
$5是目标地址字段(如10.0.0.8.443),同样截取 IP - 输出为“包数 + 目标 IP”,直观反映对外连接分布
进阶:按双向会话统计总流量(IP 对)
要看出哪一对 IP 之间通信最密集(比如 client ↔ server),可用:
sudo tcpdump -i any -nn -t -q -c 15000 'ip' 2>/dev/null | awk '{if ($3 ~ /:/ && $5 ~ /:/) {src=$3; dst=$5; gsub(/\.[0-9]+$/, "", src); gsub(/\.[0-9]+$/, "", dst); pair = (src说明:
- 自动归一化 IP 对顺序(
192.168.1.10-10.0.0.5和10.0.0.5-192.168.1.10视为同一对) - 累加双方所有包长度,得到该会话总字节数
- 适合快速定位异常内网通信或高频 API 调用对










