Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux tcpdump 24 小時自動抓包輪轉腳本:主程式、監控、磁碟清理三位一體

編輯:Linux 系統常見問題解答

需求背景

生產環境需長期抓包分析異常流量,但單一 pcap 檔案過大難以分析,磁碟空間有限。需實現:**按大小切割、按日期歸檔、自動壓縮、磁碟滿清理舊檔、進程自動重啟**。

架構設計

  • main_dump.sh:核心抓包迴圈,100MB 切檔、5 秒間隔、gzip 壓縮。
  • monitor_dump.sh:crontab 每 6 分鐘檢查主程式與 tcpdump 進程存活,掛掉即拉起。
  • monitor_disk.sh:crontab 每 6 分鐘檢查磁碟使用率 ≥30% 刪除最舊一天資料。

核心腳本:main_dump.sh

#!/bin/bash
# /home/main_dump.sh

while :; do
    STIME=$(date +%F@%H%M%S)
    DATE_DIR=$(date +%F)
    [ ! -d /data/$DATE_DIR ] && mkdir -p /data/$DATE_DIR

    MAXSIZE=100000000   # 100MB
    # 檢查 tcpdump 是否已在跑
    DUMPPID=$(ps -ef | grep "tcpdump -i eth0" | grep pcap | awk '{print $2}')
    if [ -z "$DUMPPID" ]; then
        # 啟動抓包:針對特定 IP、完整封包
        /usr/sbin/tcpdump -i eth0 host 113.105.152.180 -w /data/$DATE_DIR/$STIME.pcap -s 0 &
    fi

    sleep 1
    DUMPPID=$(ps -ef | grep "tcpdump -i eth0" | grep pcap | awk '{print $2}')
    PACKSIZE=$(ls -l /data/$DATE_DIR | grep "$STIME.pcap" | awk '{print $5}')

    # 等待檔案達到上限
    while [ "$PACKSIZE" -lt "$MAXSIZE" ]; do
        PACKSIZE=$(ls -l /data/$DATE_DIR | grep "$STIME.pcap" | awk '{print $5}')
        sleep 1m
    done

    kill -9 $DUMPPID
    ETIME=$(date +%H%M%S)
    mv /data/$DATE_DIR/$STIME.pcap /data/$DATE_DIR/$STIME-$ETIME.pcap
    gzip /data/$DATE_DIR/*.pcap
    sleep 5
done

監控腳本:monitor_dump.sh

#!/bin/bash
# /home/monitor_dump.sh

DATE_DIR=$(date +%F)
STIME=$(date +%F@%H%M%S)
MAINDUMP=$(ps -elf | grep main_dump | grep -v grep)
DUMPPID=$(ps -ef | grep "tcpdump -i eth0" | grep pcap)

[ -z "$MAINDUMP" ] && /bin/bash /home/main_dump.sh &
[ -z "$DUMPPID" ] && /usr/sbin/tcpdump -i eth0 host 113.105.152.180 -w /data/$DATE_DIR/$STIME.pcap -s 0 &

磁碟清理:monitor_disk.sh

#!/bin/bash
# /home/monitor_disk.sh

FREEDISK=$(df -h | grep "/dev/sda3" | awk '{print $5}' | awk -F% '{print $1}')
HEADMOST=$(ls -l /data | grep ^d | awk '{print $NF}' | sort | head -n 1)

if [ "$FREEDISK" -ge 30 ]; then
    rm -rf /data/"$HEADMOST"
fi

部署與排程

chmod +x /home/*.sh

# crontab -e
*/6 * * * * /bin/bash /home/monitor_dump.sh
*/6 * * * * /bin/bash /home/monitor_disk.sh

# 立即啟動主程式 (背景)
nohup /bin/bash /home/main_dump.sh &

關鍵參數調整建議

  • MAXSIZE:根據分析工具 (Wireshark) 開啟能力設定,建議 50-200MB。
  • host IP:改為實際需監控的目標 IP 或移除 `host` 條件抓全量。
  • eth0:確認抓包介面名稱 (`ip link`)。
  • 磁碟閾值 30%:視磁碟總容量與寫入速度調整。
  • crontab 間隔 6 分鐘:平衡檢測及時性與系統負載。

進階替代方案

  • tcpdump -C -W -z:原生支援切檔數量、大小、壓縮指令,無需外層腳本。
    例:`tcpdump -i eth0 -C 100 -W 20 -z gzip -w /data/dump.pcap`
  • logrotate + tcpdump:配合 logrotate 管理輪轉。
  • systemd service:將 main_dump.sh 做成服務,享受自動重啟、日誌收集。

結語

三腳本協作實現了「抓包、存活、清理」閉環。生產環境建議優先嘗試 **tcpdump 內建輪轉參數** 簡化架構,或納入 systemd 管理提升可靠性。

Copyright © Windows教程網 All Rights Reserved