iptablesでDROPした件数をcactiで見てみよう

 2014-09-17
前回iptablesで日本国内以外のパケットをDROPするように設定したので、どの程度効果があるのか、見える化。いえい。
 

効果確認したいよね。

なんか変えたらそれが既存のサービスを阻害していないかどうかってのと、目的の効果を出せているかどうかの確認が大事よね。PDCAっていうやつよね。


基本的には使いまわしだよ

前回のiptablesの設定の時点でDROP時にログに落とすように仕込みはすんでいるので、あとはそのログの中身を覗いて個数を数えるだけですね。そう、SSH認証失敗数のモニタリングと同じですな。スクリプトも流用でいきまっしょい。


スクリプト getiptablesdrop.sh

#!/bin/zsh -f

# arg check
if [ $# -lt 1 -o $# -gt 2 ];
then
echo "arg error: $0 [FILTER_STR]\n"
exit 1
fi
if [[ "$1" =~ ^[0-9]+$ ]];
then
;
else
echo "arg error: $0 [FILTER_STR]\n"
exit 1
fi
MIN_AGO=$1
FILTER_STR=${2:-null}
LC_ALL=C
LANG=C

LOGFILE="/var/log/iptables.log"

for MIN in {${MIN_AGO}..0}
do
MONTH_OLD=`date +%h --date "${MIN} min ago"`
DAY_OLD=` date +%-d --date "${MIN} min ago"`
HOUR_OLD=` date +%H --date "${MIN} min ago"`
MIN_OLD=` date +%M --date "${MIN} min ago"`
LINE_BEGIN=`egrep -n "${MONTH_OLD} *${DAY_OLD} *${HOUR_OLD}:${MIN_OLD}:" ${LOGFILE} |\
grep "${FILTER_STR}" | head -1 | cut -d":" -f1`

if [ ${LINE_BEGIN:-0} -ne 0 ];
then
break
fi
done
if [ ${LINE_BEGIN:-0} -eq 0 ];
then
echo "0"
exit
fi

sed -n -e "${LINE_BEGIN},\$p" ${LOGFILE} | grep "${FILTER_STR}" | wc -l

使い方

 root# ./getiptablesdrop.sh  60  DROP
9

root# ./getiptablesdrop.sh 60 DROP-CN
3
第一引数に、「ログを何分遡るか?」を指定。 第二引数に、「検索文字列」を指定。 DROPだけだと、iptablesがDROPしたすべてが対象。 上記のように DROP-CN などと装飾するとDROPした中国からのパケットが対象になる。 前回は中国米国韓国を見分けられるようにしたのでその三国は件数を分離可能。


snmpdの設定と設定リロード(再起動)

/etc/snmp/snmpd.confを開いて下記の行を追加する。
extend iptableDROP-CN5min     "/foo/var/bin/getiptablesdrop.sh 5 DROP-CN"
extend iptableDROP-KR5min "/foo/var/bin/getiptablesdrop.sh 5 DROP-KR"
extend iptableDROP-US5min "/foo/var/bin/getiptablesdrop.sh 5 DROP-US"
extend iptableDROP-others5min "/foo/var/bin/getiptablesdrop.sh 5 DROP-others"
cactiのポーリング間隔である5分を遡ってログを確認する設定にしてある。

上記の設定ファイルを保存したらsnmpdを再起動して設定を再読込させる。
 root# service snmpd restart

ちゃんと動いてるか?なにか適当な値が取れるか、snmpwalkで確認してみる。
 user% snmpwalk -v 2c -c foovarpublic localhost .1.3.6.1.4.1.8072.1.3 | grep 1Line
<中略>
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."iptableDROP-CN5min" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."iptableDROP-KR5min" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."iptableDROP-US5min" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."iptableDROP-others5min" = STRING: 0
おーけー。


cactiの設定

ログから必要な数字を取り出すスクリプトと、そのスクリプトの結果をsnmpで外に持ち出すことが出来たので、あとはcactiでグラフにしてもらうだけ。
だけと言っても今回は数種類の系列の値をグラフにするので適当にGeneric SNMP OID扱いではなく、ちゃんと(?)cactiのDataSourceの設定などもしてやります。やらなきゃいけないことは下記。
  1. DataTemplateの作成 【snmpのOIDにcactiでの名前を付ける】
  2. GraphTemplateの作成 【前項で名前を付けたデータをどうグラフにするか決める】
  3. DeviceへGraphTemplateの適用 【前項で作成したGraphTemplateをデバイスへ適用】
とりあえずこれで動きますので。
いろいろやることが細々あるんですが、おおざっぱに、OIDに名前を付けて、それをグラフに仕立て上げて、最後に対象のデバイスにひっつける、という感じ。

DataTemplateの作成 【snmpのOIDにcactiでの名前を付ける】

cactiの console -> Data Templates -> [add] から、下記をいろいろ設定する
  • DataTemplate Name 【自分で分かればなんでもよろし】
  • DataSource Name 【自分で分かればなんでもよろし】
  • DataSourceItem InternalDataSourceName 【自分で分かればなんでもよろし】
  • DataSouceItem DataSourceType 【GAUGEにする】←デフォルトのハズ
  • CustomData OID 【snmpwalkで見えた例のOIDをコピペする】
  • その他 【デフォルトでいいと思うよ】
上記を必要分やりましょう。私は iptablesDROP_CN , iptablesDROP_US , iptablesDROP_KR , iptablesDROP_others の4つを作りました。
cacti-iptablesdrop01.pngこんな感じ。


GraphTemplateの作成 【前項で名前を付けたデータをどうグラフにするか決める】

cactiのconsole->GraphTemplatesからテンプレートを追加する んですがこれが結構面倒でした。 やらなきゃいけないのは下記。
  • DataSource 【上記DataTemplateで決めた名前をプルダウンメニューから選ぶだけ】
  • Color 【適当に】
  • GraphItemType 【最初の項目はAREAにして、二個目以降はSTACKにする】 ←STACKは前にAREAかLINEがないとダメ
  • GPRINTType 【ExzctNumbersにする】 ←Normalとかだと勝手に小数点つけてくれちゃうので
  • TextFormat 【自分で分かればなんでもよろし】
  • その他 【デフォルトでいいよね】
  • とりあえず上記を必要分やる。私はiptablesDROP_CN , iptablesDROP_US , iptablesDROP_KR , iptablesDROP_others の4つを。
  • グラフの下に凡例を出したいときは下記を設定する
    • DataSource 【対象のデータソースを選択】
    • GraphItemType 【GPRINTを選択】
    • ConsolidationFunction 【LASTやMAXを選択】
    • GPRINTType 【ExzactNumbersを選択】
    • TextFormat 【自分で分かればなんでもよろし】
    • 上記を必要分だけ。
  • さらに凡例にTotalの集計値を追加する
    • DataSource 【対象のデータソースを選択】
    • GraphItemType 【COMMENTを選択】
    • TextFormat 【Total: |sum:0:atomic:0:auto|を指定】
  • 全体の和である線を引きたい場合は下記を追加する
    • DataSource 【Noneを選択】
    • Color 【適当にどうぞ】
    • GraphItemType 【LINE1を選択】
    • CDEFFunction 【TotalAllDataSourcesを選択】
    • TextFormat 【わかればよろし Totalとか】

cacti-iptablesdrop02.pngこんな感じ。

凡例にTotalの集計値を表示する、ってのが厄介な奴で、cactiのマニュアルのGraphVariablesのページを見ると、和を取りたいときは、|sum:0:current:0:auto| のように書いてありますが、できません。
Variables : http://www.cacti.net/downloads/docs/html/variables.html


どうもこれはマニュアルに書いてあるとおり、Bandwith Summationのみに適用することを期待しているらしく、非常に汎用性の無いくせにクソのようなメタ記述をしないといけないものらしい。下記のページよると、DataSourceがCOUNTERのやつで使うことを想定しているヨ!って言ってる。そんな限定した使用ならこんなメタ記述やめろや。
Cacti • View topic - Sum formula : http://forums.cacti.net/viewtopic.php?f=21&t=20204&start=15


で、その回避方法としてこんなことも言っている。
You can now use undocumented keyword "atomic"
|sum:0:atomic:0:auto|

ドキュメントには載せてないけど、atomicってのが使えるんだぜ! ってさ。 載せとけよ・・・・。
この書き込みは2009年のものなのだが、2014年現在、cactiのGraphVariablesのページには載ってない。なんか理由があんのかな…。

とにかく、cactiのGraphVariablesで和を取りたい & COUNTER値じゃないよ、っていう場合は、atomicを指定しましょう、ってことでした。
めんど・・・・

DeviceへGraphTemplateの適用 【前項で作成したGraphTemplateをデバイスへ適用】

cactiのconsole->Devices->対象デバイス AssociatedGraphTemplates に例の作成したGraphTemplateを追加してやります。
cacti-iptablesdrop03.pngね、かんたんでしょ。


できあがり

とりあえずグラフは描写されるようになりました。お疲れ様です。
graph_image_201409172115254bd.png



cactiのドキュメントが意外と整備されて無くて、CDEFとか追加しないと和も出せないのかなぁっていろいろハマりました。
は~。 cactiって結構メジャーだと思うんだけどな~。
とにかく目的は達成できたので、しばらくたってから、集計結果を眺めてニヤニヤしようね~。
 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/173-a8a22363
≪ トップページへこのページの先頭へ  ≫