【運維實踐】使用tcpdump抓包 每十分鐘新舊進程交替 監控某日誌匹配後kill抓包進程

需求描述: shell

請經過tcpdump命令進行抓包,抓192.168.0.100IP3022端口的全部包; windows

並要求每10分鐘開啓一個新的抓包進程,新進程開啓後,再關閉原有進程(目的是防止抓包信息量過大不容易分析); tcp

同時對/jboss/server/default/log目錄下的xxx.log日誌進行監控,當日志中出現「Connection connected to :192.168.0.100:3022」後中止抓包,最後只需保留最後一個抓包文件,刪除多餘的方便分析。 工具

實現思路: spa

1)編寫collect_data腳本,使用正確的tcpdump命令按照要求抓包

/usr/sbin/tcpdump -i eth0 -n dst host 192.168.0.100 and dst port 3022 -vv -w file 日誌

說明:-w file 指把tcpdump的內容保存到一個二進制文件中,該文件使用 tcpdump -r file 來讀取,每次執行這個命令都會重寫file文件至關於>符號。 server

2)每10分鐘開啓一個新抓包進程目的是爲了防止抓包信息持續寫進一個文件中,致使文件過大不容易分析,因此shell程序必須可以進行新舊抓包命令的更替(每次更替分別將輸出重定向到不一樣的文件日誌中防止文件過大)。每10分鐘進行一次,能夠利用cron來定時,定時執行collect_data腳本,腳本中每次執行都完成開啓新tcpdump進程,確保新tcpdump進程開啓後再kill掉以前的進程的動做就能夠了。而實現這一點,須要每次執行後記錄本次執行的pid,下一次執行新的進程時再記錄新的pid而後kill掉上次的pid,這樣就知足了需求。

3)單獨編寫一個shell程序,用來實時的監視xxx.log日誌,當日志中出現關鍵字後就kill掉tcpdump進程,保留本次tcpdump的輸出的日誌,刪除上一次tcpdump進程的輸出的日誌,最後處理cron定時,再也不執行定時不然會沖掉分析記錄。 進程

# vi collect_data 用來作tcpdump新舊進程交替的動做 ci

#!/bin/sh
#author:shenxiaoran
#date:2013-3-12

prog_home=/home/shenxiaoran
prog=/usr/sbin/tcpdump
test -f $prog_home/flag || touch $prog_home/flag

        cat $prog_home/flag
        if [ $(cat $prog_home/flag) -eq 0 ];then
                $prog -i eth0 -n -nn dst host 192.168.0.100 and dst port 3022 -vv -w $prog_home/a.log & 2>/dev/null
                echo $! > $prog_home/tcpdump.0.run
                if [ $? -eq 0 ];then

        #       ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1 > $prog_home/tcpdump.0.run

    #   echo "ps : `ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1`"
    #   echo "tcpdump.0.run: `cat $prog_home/tcpdump.0.run`"

                sleep 1
                test -e $prog_home/tcpdump.1.run && cat $prog_home/tcpdump.1.run|xargs kill -9 > /dev/null
                fi
                echo 1 > $prog_home/flag
                exit
        fi
        if [ $(cat $prog_home/flag) -eq 1 ];then
                $prog -i eth0 -n -nn dst host 192.168.0.100 and dst port 3022 -vv -w $prog_home/b.log & 2>/dev/null
                echo $! > $prog_home/tcpdump.1.run
                if [ $? -eq 0 ];then

        #       ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1 > $prog_home/tcpdump.1.run

        #       echo "ps : `ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1`"
        #       echo "tcpdump.1.run: `cat $prog_home/tcpdump.1.run`"

                sleep 1
                test -e $prog_home/tcpdump.0.run && cat $prog_home/tcpdump.0.run|xargs kill -9 > /dev/null
                fi
                echo 0 > $prog_home/flag
                exit
        fi


# vi monitor 用來實時監視xxx.log日誌,一旦發現關鍵字出現當即執行相應動做(關鍵字是grep 「」引號中的部分)
#!/bin/sh
#author:shenxiaoran

prog_home=/home/shenxiaoran
log_file=/var/mqm/qmgrs/QM\!HL1/errors/xxx.log

while :
do
        tail $log_file |grep "Channel 'TO.QM.CENTER2' is starting"
        if [ $? -eq 0 ];then
                echo "Successful matches"
                current_tcpdump_pid=$(ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1)
                if [ -z "$current_tcpdump_pid" ];then
                        echo "No any tcpdump process,$0 exit"
                        break
                elif [ $current_tcpdump_pid -eq `cat $prog_home/tcpdump.0.run` ];then
                        echo "kill prog"
                        rm -f $prog_home/b.log
                        cat $prog_home/tcpdump.0.run|xargs kill -9 > /dev/null
                        sed -i -e 's/[0-9][0-9] [0-9][0-9] \* \* \* \/home\/shenxiaoran\/collect_data.*/#&/' /var/spool/cron/root
                        /etc/init.d/crond reload
                elif [ $current_tcpdump_pid -eq `cat $prog_home/tcpdump.1.run` ];then
                        echo "kill prog"
                        rm -f $prog_home/a.log
                        cat $prog_home/tcpdump.1.run|xargs kill -9 > /dev/null
                        sed -i -e 's/[0-9][0-9] [0-9][0-9] \* \* \* \/home\/shenxiaoran\/collect_data.*/#&/' /var/spool/cron/root
                        /etc/init.d/crond reload
                fi
        #       pkill tcpdump > /dev/null
                break
        fi
#      sleep 60
done


若是系統中設置了記錄用戶操做的日誌的狀況,例如(/var/account/pacct),以爲實時掃描關鍵字太過頻繁,能夠開啓sleep語句。

大功告成,這是本人運行過程當中遇到的一個實際的需求案例,寫在這裏供你們參考。 it

注:使用tcpdump抓包而後放到windows桌面利用wireshark圖形工具分析的時候,常常提示下圖出現的錯誤,如何解決?

這個問題主要是因爲tcpdump命令的參數使用不當形成的,注意使用-s 0 參數,保存文件時也不要用重定向而是使用-w file參數,保存的文件名最好直接使用xxx.pcap後綴,這樣wireshark工具直接認識。

-s 0 : 抓取數據包時默認抓取長度爲68字節。加上-s 0 後能夠抓到完整的數據包。若存在雙網卡的狀況,須要明確制定包從哪一個網卡進來,添加相似 -i eth1這樣的參數,不然默認監聽eth0網卡。

例如:tcpdump -nn -s 0 host 192.168.11.243 and port 80 -w wireshark.pcap

相關文章
相關標籤/搜索