侧边栏壁纸
博主头像
一叶舟的秘密花园 博主等级

行动起来,活在当下

  • 累计撰写 37 篇文章
  • 累计创建 15 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

tcpdump抓包脚本

Li
Li
2025-09-22 / 0 评论 / 0 点赞 / 128 阅读 / 0 字
温馨提示:
本文最后更新于2025-09-22,若内容或图片失效,请留言反馈。 八月长江万里晴,千帆一道带风轻

👌 那我给你写一个 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

🚀 使用方法

  1. 保存脚本

vi tcpdump_rotate.sh
chmod +x tcpdump_rotate.sh
  1. 运行示例

    • 抓所有接口,保存到 /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"
  1. 运行中止

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.sh

2. 创建 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.target

3. 启动并设置开机自启

sudo systemctl daemon-reload
sudo systemctl enable tcpdump-rotate
sudo systemctl start tcpdump-rotate

4. 查看运行情况

  • 查看日志(实时输出):

journalctl -fu tcpdump-rotate
  • 查看服务状态:

systemctl status tcpdump-rotate

5. 修改配置

  • 如果你想改接口 / 路径 / 大小 / 保留文件数 / 过滤条件,只要改 /etc/systemd/system/tcpdump-rotate.service 里的 ExecStart 行,然后:

sudo systemctl daemon-reload
sudo systemctl restart tcpdump-rotate

📦 示例配置

  1. 抓所有接口,保留 10 个文件,每个 500MB,保存到 /var/log/tcpdump

ExecStart=/usr/local/bin/tcpdump_rotate.sh any /var/log/tcpdump 10 500
  1. 只抓 3306 端口,保留 20 个文件,每个 200MB,保存到 /data/pcap

ExecStart=/usr/local/bin/tcpdump_rotate.sh any /data/pcap 20 200 "tcp port 3306"

0

评论区