萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux tcpdump 24 小時自動抓包腳本實作:輪轉、壓縮、磁碟監控全自動化

需求背景

生產環境需長期抓取網路封包分析異常流量,但持續抓包會產生海量資料,需解決:

  • 單一檔案過大無法分析(限制 100MB 分檔)
  • 按日期目錄、時間戳命名自動歸檔
  • 主程序守護進程化、異常自動重啟
  • 磁碟空間閾值觸發自動清理最舊資料

架構設計

  • maindump.sh:主抓包程序,死迴圈每分鐘檢查、分檔、壓縮
  • monitor_dump.sh:cron 定時檢查主程序存活,掛了就拉起
  • monitor_disk.sh:cron 定時檢查磁碟使用率 ≥ 30% 刪除最舊一天資料

核心腳本程式碼

1. maindump.sh(主抓包邏輯)

#!/bin/bash
# 主抓包程式,放置於 /home/maindump.sh

# 自定義區域(需修改)
INTERFACE="eth0"           # 抓包介面
FILTER="port 80"           # BPF 過濾規則
MAX_SIZE=100               # 單檔最大 MB
SLEEP_INTERVAL=5           # 輪換間隔秒數
STORAGE_ROOT="/data"       # 儲存根目錄

while true; do
    DATE_DIR=$(date +%F)                    # 2024-01-15
    STIME=$(date +%F"@"%H%M%S)              # 2024-01-15@143022
    SAVE_DIR="${STORAGE_ROOT}/${DATE_DIR}"
    mkdir -p "$SAVE_DIR"
    
    OUTFILE="${SAVE_DIR}/${STIME}.pcap"
    
    # 啟動 tcpdump,-C 限制檔案大小(單位 MB),-W 1 僅產生一個檔案
    # 實際輪換邏輯由外層迴圈控制,tcpdump 到達大小會停止
    timeout 55 tcpdump -i "$INTERFACE" -s 0 -C "$MAX_SIZE" -W 1 -w "$OUTFILE" "$FILTER" >/dev/null 2>&1
    
    ETIME=$(date +%H%M%S)
    FINAL_NAME="${SAVE_DIR}/${STIME}-${ETIME}.pcap.gz"
    
    # 壓縮並重命名含結束時間
    if [ -f "$OUTFILE" ]; then
        gzip -c "$OUTFILE" > "$FINAL_NAME"
        rm -f "$OUTFILE"
        echo "$(date) 壓縮完成: $FINAL_NAME"
    fi
    
    sleep "$SLEEP_INTERVAL"
done

2. monitor_dump.sh(進程守護)

#!/bin/bash
# 放置於 /home/monitor_dump.sh

MAIN_SCRIPT="/home/maindump.sh"
LOCK_FILE="/tmp/maindump.lock"

# 防止重複啟動
if [ -f "$LOCK_FILE" ] && kill -0 $(cat "$LOCK_FILE") 2>/dev/null; then
    exit 0
fi

echo $$ > "$LOCK_FILE"
nohup bash "$MAIN_SCRIPT" >> /var/log/maindump.log 2>&1 &
echo $! > "$LOCK_FILE"

3. monitor_disk.sh(磁碟清理)

#!/bin/bash
# 放置於 /home/monitor_disk.sh

STORAGE_ROOT="/data"
THRESHOLD=30  # 使用率百分比

USAGE=$(df -h "$STORAGE_ROOT" | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
    OLDEST=$(find "$STORAGE_ROOT" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -n | head -1 | cut -d' ' -f2-)
    if [ -n "$OLDEST" ]; then
        echo "$(date) 磁碟使用率 ${USAGE}% ≥ ${THRESHOLD}%,刪除最舊目錄: $OLDEST" >> /var/log/disk_clean.log
        rm -rf "$OLDEST"
    fi
fi

部署與排程

chmod +x /home/maindump.sh /home/monitor_dump.sh /home/monitor_disk.sh

# 立即啟動主程序
nohup bash /home/maindump.sh >> /var/log/maindump.log 2>&1 &

# 加入 crontab(每 6 分鐘檢查一次)
crontab -e
*/6 * * * * /bin/bash /home/monitor_dump.sh
*/6 * * * * /bin/bash /home/monitor_disk.sh

關鍵參數調優建議

參數建議值調整依據
MAX_SIZE100-500 MBWireshark/分析工具開啟速度與檔案數平衡
SLEEP_INTERVAL5-30 秒避免 tcpdump 重啟間隙丟包
THRESHOLD70-80%預留緩衝空間,避免磁碟寫滿導致系統故障
FILTER精準 BPF如 "host 10.0.0.1 and port 80" 減少無效封包

進階增強方向

  • 使用 tcpdump -G 3600 -W 24 內建按小時輪換(需較新版本)
  • 整合 logrotate 管理壓縮檔保留天數
  • 推送封包至 Kafka/Elasticsearch 即時分析,落地僅存原始備份
  • 加入郵件/企業微信告警:磁碟清理觸發、主程序重啟通知

這套腳本體系已在多個生產環境穩定運行數年,可根據流量規模與分析需求彈性調整參數。

copyright © 萬盛學電腦網 all rights reserved