生產環境需長期抓包分析異常流量,但單一 pcap 檔案過大難以分析,磁碟空間有限。需實現:**按大小切割、按日期歸檔、自動壓縮、磁碟滿清理舊檔、進程自動重啟**。
#!/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
#!/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 &
#!/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 內建輪轉參數** 簡化架構,或納入 systemd 管理提升可靠性。