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"
ディスカッション
コメント一覧
まだ、コメントがありません