Linux中可用tcpdump内置参数实现自动分片与清理:-C指定大小轮转、-W控制文件数量、-G配合时间命名,再用find按天清理;务必加-s 0和-nn,推荐用systemd管理进程。

Linux 系统中实现定期自动分割并清理过大的 tcpdump 抓包文件,关键在于“分片控制 + 时间/大小轮转 + 清理策略”三者协同,避免单文件膨胀、磁盘占满或历史包堆积。不需要写复杂脚本,tcpdump 自身参数就能完成大部分工作。
用 -C 和 -W 实现环形自动轮转
这是最轻量、最稳定的方式,适合长期无人值守运行:
- -C 100:每个文件达到 100MB(注意:单位是字节 ×10⁶,即 100,000,000 字节)时自动新建文件
- -W 5:最多保留 5 个轮转文件,新文件生成时自动覆盖最旧的
- -w /var/log/cap/cap%03d.pcap:文件名带序号(如 cap000.pcap、cap001.pcap),便于识别顺序
完整命令示例:
sudo tcpdump -i eth0 -s 0 -nn -C 100 -W 5 -w /var/log/cap/cap%03d.pcap
该命令会持续运行,自动维持最近 500MB 的抓包数据,无需额外监控进程或定时 kill。
按时间切片 + 命名自带日期
若需对齐业务日志、方便人工归档或按天分析,推荐结合 -G(秒级轮转)和时间格式化命名:
- -G 300:每 300 秒(5 分钟)新建一个文件
-
-w cap-%Y%m%d_%H%M%S.pcap:文件名含精确起始时间,如
cap-20260925_100000.pcap - 配合 find + -mtime 实现自动清理,例如只保留最近 7 天:
find /var/log/cap/ -name "cap-*.pcap" -mtime +7 -delete
可将此清理命令加入 crontab 每日凌晨执行:
0 2 * * * find /var/log/cap/ -name "cap-*.pcap" -mtime +7 -delete
避免常见陷阱的实操要点
实际部署中,这几个细节决定是否真正“自动可靠”:
- 必须加 -s 0:否则默认只截前 68 字节,HTTP header、TLS ClientHello 等关键内容会被截断
- 推荐加 -nn:禁用 DNS 和端口名解析,防止抓包卡顿或因 DNS 超时丢包
-
目录权限要提前创建好:确保运行用户(如 root)对
/var/log/cap/有读写权限,且磁盘空间充足 - 不要依赖后台 & + nohup 长期挂起主进程:容易被 OOM killer 杀掉或异常退出;应配合 systemd service 或 supervisord 管理生命周期
补充:压缩归档节省空间(可选)
若存储资源紧张,可在轮转后自动 gzip 压缩(注意别压缩正在写的文件):
- 用 -z 参数(tcpdump 4.9.3+ 支持):直接生成
.pcap.gz,如-w cap%03d.pcap -z - 或用 inotifywait 监听新文件生成后触发压缩,更安全可控
例如监听并压缩非正在写的 pcap:
inotifywait -m -e moved_to --format '%w%f' /var/log/cap/ | while read f; do [[ "$f" == *.pcap ]] && gzip "$f"; done


















