👌 那我给你写一个 tcpdump 抓包脚本,具备以下功能:
自动切割文件(按大小或时间)。
自动 gzip 压缩,节省磁盘空间。
最多保留 N 个文件(旧文件自动删除/覆盖)。
可以设置抓包过滤条件(比如只抓某个端口)。
📜 抓包脚本(tcpdump_rotate.sh)
#!/usr/bin/env bash
#
# 自动切割、压缩的 tcpdump 抓包脚本
# 用法:
# sudo ./tcpdump_rotate.sh <iface> <save_dir> <max_files> <file_size_MB> [filter]
#
# 示例:
# sudo ./tcpdump_rotate.sh any /var/log/tcpdump 20 200 "tcp port 3306"
#
# 表示:
# - 抓 any 接口
# - 保存到 /var/log/tcpdump
# - 最多保留 20 个文件
# - 每个文件最大 200MB
# - 只抓 3306 端口
#
set -euo pipefail
IFACE="$1"
SAVE_DIR="$2"
MAX_FILES="$3"
FILE_SIZE="$4"
FILTER="${5:-}"
mkdir -p "$SAVE_DIR"
echo ">>> 抓包开始: iface=$IFACE, 保存目录=$SAVE_DIR, 保留文件=$MAX_FILES, 单文件大小=${FILE_SIZE}MB"
echo ">>> 抓包过滤器: ${FILTER:-无}"
tcpdump -i "$IFACE" -nn -s 0 -w - $FILTER 2>/dev/null | \
while true; do
# 时间戳文件名
ts=$(date +%Y%m%d_%H%M%S)
filename="$SAVE_DIR/capture_$ts.pcap.gz"
# 从管道读数据 -> 限制大小 -> gzip 压缩 -> 写文件
dd bs=1M count="$FILE_SIZE" 2>/dev/null | gzip > "$filename"
echo ">>> 保存文件: $filename"
# 删除旧文件,保持数量不超过 MAX_FILES
files=( $(ls -1t "$SAVE_DIR"/capture_*.pcap.gz 2>/dev/null) )
if [ "${#files[@]}" -gt "$MAX_FILES" ]; then
for old in "${files[@]:$MAX_FILES}"; do
rm -f "$old"
echo ">>> 删除旧文件: $old"
done
fi
done🚀 使用方法
保存脚本
vi tcpdump_rotate.sh
chmod +x tcpdump_rotate.sh运行示例
抓所有接口,保存到 /var/log/tcpdump,最多保留 10 个文件,每个 500MB:
sudo ./tcpdump_rotate.sh any /var/log/tcpdump 10 500只抓 MySQL (3306) 流量,保存到 /data/pcap,最多 20 个文件,每个 200MB:
sudo ./tcpdump_rotate.sh any /data/pcap 20 200 "tcp port 3306"运行中止
pkill -f tcpdump_rotate.sh
pkill tcpdump # 确保 tcpdump 也停了📝 说明
每个文件约 N MB 压缩后大小,磁盘占用不会超过 N × max_files。
如果流量很大,可以配合 过滤条件(port 80, host 1.2.3.4 等)。
适合长期挂后台跑,不怕磁盘爆掉。
好嘞 👍 那我给你把刚才的 tcpdump_rotate.sh 改造成一个 systemd 服务,这样:
开机自启;
崩溃后自动重启;
日志写到 journalctl,方便查看;
你只需要修改参数(接口 / 保存目录 / 保留文件数 / 文件大小 / 过滤条件)。
1. 放置脚本
假设脚本路径是 /usr/local/bin/tcpdump_rotate.sh:
sudo cp tcpdump_rotate.sh /usr/local/bin/tcpdump_rotate.sh
sudo chmod +x /usr/local/bin/tcpdump_rotate.sh2. 创建 systemd unit 文件
新建:
sudo vi /etc/systemd/system/tcpdump-rotate.service内容:
[Unit]
Description=Tcpdump Rotate Capture Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/tcpdump_rotate.sh any /var/log/tcpdump 10 500 "tcp port 3306"
Restart=always
RestartSec=5
User=root
# 限制资源(防止失控)
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target3. 启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable tcpdump-rotate
sudo systemctl start tcpdump-rotate4. 查看运行情况
查看日志(实时输出):
journalctl -fu tcpdump-rotate查看服务状态:
systemctl status tcpdump-rotate5. 修改配置
如果你想改接口 / 路径 / 大小 / 保留文件数 / 过滤条件,只要改 /etc/systemd/system/tcpdump-rotate.service 里的 ExecStart 行,然后:
sudo systemctl daemon-reload
sudo systemctl restart tcpdump-rotate📦 示例配置
抓所有接口,保留 10 个文件,每个 500MB,保存到 /var/log/tcpdump:
ExecStart=/usr/local/bin/tcpdump_rotate.sh any /var/log/tcpdump 10 500只抓 3306 端口,保留 20 个文件,每个 200MB,保存到 /data/pcap:
ExecStart=/usr/local/bin/tcpdump_rotate.sh any /data/pcap 20 200 "tcp port 3306"
评论区