SNMPを利用して1日の通信量を取得する

SNMPを利用してルーターの1日の通信量を取得

最近のクラウド、VPSでは管理画面で外部との通信量はクラウドやVPSの管理画面で確認できますが、物理サーバーでYAMAHAのルーターにつながっているサーバーのインターネット回線の通信量を計測する必要があり、SNMPを使って計測しました

事前にYAMAHAのルーターの情報は、サーバー側からSNMPで取得できている状態です

ルーターの通信量(トラフィック)は、「 snmpwalk -v <バージョン>-c <コミニティ名> <IPアドレス><OID(ifHCOutOctets|ifHCInOctets)>」で収録できます

# コミニティ名が「public」で、IPアドレスが「192.268.0.1」でSNMPv1の場合は下記になります
$ snmpwalk -v1 -c public 192.168.0.1  ifInOctets
IF-MIB::ifInOctets.1 = Counter32: 4213508919
IF-MIB::ifInOctets.2 = Counter32: 631112732
IF-MIB::ifInOctets.3 = Counter32: 0
IF-MIB::ifInOctets.4 = Counter32: 0

# コミニティ名が「public」で、IPアドレスが「192.268.0.1」でSNMPv2cの場合は下記になります
$ snmpwalk -v2c -c public 192.168.0.1  ifInOctets
IF-MIB::ifInOctets.1 = Counter64: 14523508919
IF-MIB::ifInOctets.2 = Counter64: 34631112732
IF-MIB::ifInOctets.3 = Counter64: 34223320
IF-MIB::ifInOctets.4 = Counter64: 4350430

今回取得した、「ifHCOutOctets」と「ifHCInOctets」は、以下のような項目です。

OID MIB 説明
1.3.6.1.2.1.2.2.1.10.(ifIndex) ifInOctets インタフェースで受信したパケットの総バイト数(32bitカウンタ)
1.3.6.1.2.1.2.2.1.16.(ifIndex) ifOutOctets インタフェースで送信したパケットの総バイト数(32bitカウンタ)
1.3.6.1.2.1.31.1.1.1.6.(ifIndex) ifHCInOctets インタフェースで受信したパケットの総バイト数(64bitカウンタ)
1.3.6.1.2.1.31.1.1.1.10.(ifIndex) ifHCOutOctets インタフェースで送信したパケットの総バイト数(64bitカウンタ)

1日の通信量を取得(SNMP v2C/v3)

1日の通信量を取得するには、先ほど説明した「ifHCOutOctets」と「ifHCInOctets」を取得して、前日の値と比較すれば取得できます。Cronで1日1回取得して、その際に前回の値と比較すれば所得できます。

下記のようなシェルスクリプトで取得できるかと思います。インターネット回線はルーターの1番ポートに接続されている条件で作成しています。「ifInOctets.1, ifOutOctets.1」の箇所が1番ポートです。環境によって違うと思いますので任意のポートを指定して下さい。

Cronで1日1回実行すれば取得できます。トラフィック量はechoコマンドで表示しているので、そちらをファイルに出力やメール送信すれば確認できるかと思います

$ vim 
#!/bin/bash

COMMUNITY="public"
HOST="192.168.0.1"
INFILE="/var/tmp/in.txt"
OUTFILE="/var/tmp/out.txt"

DATE=`date "+%Y/%m/%d %H:%M:%S"`

#前回の値を取得
if [ -f $INFILE ]; then
  LAST_IN=$(tail -1 $INFILE | awk -F ',' '{print $2}')
else
  LAST_IN="0"
fi

if [ -f $OUTFILE ]; then
  LAST_OUT=$(tail -1 $OUTFILE | awk -F ',' '{print $2}')
else
  LAST_OUT="0"
fi

#今回の値を取得
IN=`snmpwalk -v1 -c $COMMUNITY $HOST ifInOctets.1 | awk '{print $4}'`
OUT=`snmpwalk -v1 -c $COMMUNITY $HOST ifOutOctets.1 | awk '{print $4}'`

#差分を算出して通信量を取得
DIFF_IN=`expr $IN - $LAST_IN`
DIFF_OUT=`expr $OUT - $LAST_OUT`

# ファイルに書き込み
echo "${DATE},${IN}" >> $INFILE
echo "${DATE},${OUT}" >> $OUTFILE

# 1日のトラフィック量をMBに変換して表示
DIFF_OUT =`expr $DIFF_OUT / 1024 / 1024`
DIFF_IN=`expr $DIFF_IN / 1024 / 1024`

echo "OUT: $DIFF_OUT MB"
echo "IN: $DIFF_IN MB"

1日の通信量を取得(SNMP v1)

32ビットカウンタしか使えない場合のSNMP v1だと32ビットカウンタとなり 2の32乗の 4,294,967,295 の値を超えるとカウンタは初期値に戻りますので、SNMP v1だと、前日と比較した場合通信量が多い場合は10分、1時間おきに前回の差分を取って、日にちを指定してその日の差分を集計する必要あります

下記のシェルスクリプトで1日の10分毎や1時間毎にCronで実行して、トラフィック量を取得していきます

#!/bin/bash

COMMUNITY="public"
HOST="192.168.0.1"
INFILE="/var/tmp/in.txt"
OUTFILE="/var/tmp/out.txt"
TMPFILE="/var/tmp/tmp.txt"

DATE=`date "+%Y%m%d %H:%M:%S"`

#前回の値を取得
if [ -f $INFILE ]; then
  LAST_IN=$(tail -1 $INFILE | awk -F ',' '{print $2}')
else
  LAST_IN="0"
fi

if [ -f $OUTFILE ]; then
  LAST_OUT=$(tail -1 $OUTFILE | awk -F ',' '{print $2}')
else
  LAST_OUT="0"
fi

#今回の値を取得
IN=`snmpwalk -v1 -c $COMMUNITY $HOST ifInOctets.2 | awk '{print $4}'`
OUT=`snmpwalk -v1 -c $COMMUNITY $HOST ifOutOctets.2 | awk '{print $4}'`

#差分を算出して通信量を取得
DIFF_IN=`expr $IN - $LAST_IN`
DIFF_OUT=`expr $OUT - $LAST_OUT`

# 32bitの上限を超えた場合は、4294967295を足す
if [ $DIFF_IN -lt 0 ]; then
  DIFF_IN=`expr $DIFF_IN + 4294967295`
fi

if [ $DIFF_OUT -lt 0 ]; then
  DIFF_OUT=`expr $DIFF_OUT + 4294967295`
fi

# ファイルに書き込み(日付,32ビットカウント,差分)
echo "${DATE},${IN},${DIFF_IN}" >> $INFILE
echo "${DATE},${OUT},${DIFF_OUT}" >> $OUTFILE

次に集計用のシェルスクリプトを作成します。下記のシェルスクリプトでは、トラフィックの差分の値を取得して日付を指定してその日のトラフィック量の集計しています。

日付は「date -d “1 days ago"」としているの取りたい日の翌日に実行すればいいかと思います。

#!/bin/bash

INFILE="/var/tmp/in.txt"
OUTFILE="/var/tmp/out.txt"
TMPFILE="/var/tmp/tmp.txt"


# 1日の通信量を集計
DAY1=`date -d "1 days ago" +"%Y%m%d"`

# ---- IN ----
# 日付を指定して32ビットカウントの差額の値をファイルに出力
grep "$DAY1" $INFILE | awk -F ',' '{print $3}' > $TMPFILE

# 1日のトラフィック量を集計してMBに変換
InSum=`awk '{sum += $1} END {print sum}' $TMPFILE`
InSum=`expr $InSum / 1024 / 1024`

# ---- OUT ----
# 日付を指定して32ビットカウントの差額の値をファイルに出力
grep "$DAY1" $OUTFILE | awk -F ',' '{print $3}' > $TMPFILE

# 1日のトラフィック量を集計MBに変換
OutSum=`awk '{sum += $1} END {print sum}' $TMPFILE`
OutSum=`expr $OutSum / 1024 / 1024`

echo "IN: $InSum MB"
echo "OUT: $OutSum MB"

 

スポンサーリンク

0
0