tcpdump 本身不支持定时轮转,但可通过 cron、find、logrotate 或 shell 脚本实现自动化抓包与按时间/大小轮转:用 -G(秒级轮换)、-W(文件数量限制)、-C(大小切分)组合控制生命周期;cron 可定时启停并嵌入 date 生成带时间戳文件;logrotate 适用于已有 pcap 的归档清理;需注意磁盘保护、权限配置、接口选择及过滤优化。

tcpdump 本身不内置定时任务或自动轮转功能,但结合 Linux 常用工具(cron、find、logrotate 或 shell 脚本),完全可以实现自动化抓包 + 按时间/大小轮转存储 pcap 文件。关键在于控制抓包生命周期和文件管理逻辑。
按固定时长轮转(推荐用于持续监控)
使用 -G(按秒轮换)配合 -W(限制文件数量)和 -C(按大小切分)是最直接的方式。例如:
-
每 300 秒生成一个新文件,最多保留 12 个(即覆盖 1 小时内的数据):
tcpdump -i eth0 -w /var/log/pcap/capture-%s.pcap -G 300 -W 12
%s 会被替换为 Unix 时间戳,文件名如capture-1751881020.pcap,便于排序和清理。 -
同时按大小切分(比如每 100MB 新建一个)并限制总数:
tcpdump -i eth0 -w /var/log/pcap/capture-%s.pcap -G 300 -C 100 -W 24
这样既防止单个文件过大,又避免磁盘被占满。
按指定时间窗口抓包(适合计划性任务)
用 cron 定时启停 tcpdump 进程,配合 -c(包数限制)或 timeout 控制时长:
- 每天凌晨 2 点抓 10 分钟,保存带日期的文件:
0 2 * * * timeout 600 tcpdump -i eth0 -w /var/log/pcap/daily-$(date +\%Y\%m\%d).pcap - 每小时抓取一次,每次 5000 个包:
0 * * * * tcpdump -i eth0 -c 5000 -w /var/log/pcap/hourly-$(date +\%Y\%m\%d-\%H).pcap
注意:cron 中需用 \% 转义 date 格式符;建议加 -nn -s0 提升效率和完整性。
用 logrotate 管理已有 pcap 文件
如果已用简单方式(如长期运行 tcpdump -w)生成单个大文件,可交由 logrotate 处理归档与清理:
- 新建配置
/etc/logrotate.d/tcpdump:/var/log/pcap/*.pcap { daily rotate 7 compress missingok notifempty sharedscripts postrotate pkill -f "tcpdump.*-w.*pcap" 2>/dev/null || true endscript } - 该配置每天轮转一次,保留 7 天,压缩旧文件,并在轮转后尝试重启抓包(需配合脚本补全)。
安全与稳定性要点
- 避免无限抓包耗尽磁盘:务必设置 -C 或 -G + -W,或用 timeout 包裹。
-
权限与路径:确保运行用户对目标目录有写权限;生产环境建议用专用目录(如
/var/log/pcap/)并设好 SELinux/AppArmor 策略。 - 接口选择:-i any 可能捕获过多噪音,优先指定业务网卡(如 eth0、bond0)。
-
过滤减少体积:加过滤表达式(如
host 10.1.2.3 and port 443)比全量抓包更可持续。

















