天天看點

linux檢視某個ip流量--思路一例

  在我之前的文章中分享過“實時”檢視Linux某些網卡流量的小腳本,今天再分享一個檢視本機到具體某個ip間的流量的思路。我有這個需求是因為:我們的存儲是Dell儲存設備通過nfs協定供多台業務機挂載使用,而我有必要了解每台機器和Dell存儲之間的流量。

  其實,如果僅僅是要看這個流量,iftop這個軟體就很好,通過其自身的選項就能滿足了,不需要再做什麼額外的工作。

  我的情況是:由于nfs客戶機衆多,而且雖是挂載一台儲存設備但挂載點ip卻不一樣,并且我想把這個作為一個監控項放到zabbix裡,是以我就需要用shell對iftop做進一步的“封裝”,以便能夠“通用”些且更好的和zabbix結合。

注意:iftop需要root權限,而zabbix-agent一般是以zabbix使用者運作且通過zabbix-server調用agent端的自定義腳本時是沒有終端(tty)的,這裡就需要修改sudo的配置檔案了,允許zabbix使用者遠端執行指令的過程中執行sudo操作。

#!/bin/sh
#在zabbix上監控各機器與nfs server之間的流量
#by ljk 20160803


net='192.168.1.*'    #内網網段
nfs_subnet='192.168.1.2[0-9]{2}'    #nfs所在ip的正則
#擷取nfs server的真實ip,前提是每台server無論幾個挂載點,都隻從一個ip挂載
nfs_ip=$(df -h|egrep "$nfs_subnet:"|awk -F : '{print $1}'|sort|uniq)

cd /etc/sysconfig/network-scripts
for dev in $(ls ifcfg-*|awk -F - '{print $2}');do
    ip addr show $dev|grep '192.168.1.*' >/dev/null    #判斷哪個網卡有内網網段ip
    if [ $? -eq 0 ];then
        using_dev=$dev    #擁有内網ip的網卡名賦予變量using_dev
        break
    fi
done

if [ "$1" == "request" ];then
    result=$(sudo iftop -i $using_dev -n -t -s 10 2>/dev/null | egrep -B 1 $nfs_ip|awk '$(NF-4)=="=>" {print $(NF-1)}')

elif [ "$1" == "response" ];then
    result=$(sudo iftop -i $using_dev -n -t -s 10 2>/dev/null | egrep -B 1 $nfs_ip|awk '$(NF-4)=="<=" {print $(NF-1)}')
fi

#下面部分是為了适用于zabbix而做的一些額外的工作
#iftop出來的結果為(6.60Mb 208Kb 320b等),将其結果整合進zabbix時要去掉這些機關并對數值做轉換(zabbix裡我統一用b做機關,隻給zabbix傳數值)
if [ -z "$result" ];then
    echo 0
else
    num=$(echo $result|tr -d "a-zA-Z")
    unit=`echo ${result: -2:1}`
    case $unit in
        [kK]) echo "$num*1024"|bc;;
        [mM]) echo "$num*1024*1024"|bc;;
        [gG]) echo "$num*1024*1024*1024"|bc;;
           *) echo "$num"
    esac
fi      

繼續閱讀