Aug 092006
 

ZABBIXを使って特定ポートの通信データ量を収集してみます。
iptablesを使ってあらかじめ特定ポートの通信データ量が記録されるようにしておき、ZABBIXからはUserParameterでiptablesコマンドを実行して、そのデータ量を取得できるようにします。

以下、ssh(tcp/22)の通信データ量を記録する場合の例になります。

iptables登録

まず、記録したいポート番号をiptablesで登録します。

# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# iptables -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT

この結果、iptables –listコマンドで以下のようにパケット数やバイト数を記録できるようになります。

# iptables --list INPUT -nvx
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    8077   680931 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22

sudoでiptablesコマンドの実行を許可

通常ZABBIX Agentは、zabbixユーザで動作しているため、iptablesコマンドを実行できません。
sudoを使って、特定のiptablesコマンドを実行できるようにしておきます。

zabbix  ALL = NOPASSWD: \
        /sbin/iptables -L INPUT  -nvx,\
        /sbin/iptables -L OUTPUT -nvx

UserParameter登録

/etc/zabbix/zabbix_agentd.confにUserParameterを登録します。

UserParameter=iptables.bytes.input[*],sudo  iptables -L INPUT  -nvx|grep "dpt:$1 $"|awk '{print $ 2}'
UserParameter=iptables.bytes.output[*],sudo iptables -L OUTPUT -nvx|grep "spt:$1 $"|awk '{print $ 2}'

もうちょっと頑張れば、chain(INPUT、OUTPUT)やプロトコル(tcp or udp)も引数指定することが可能ですが、そこまでやってません。

収集テスト

zabbix_getコマンドで登録したキーの値が収集できるか確認します。

$ /home/zabbix/bin/zabbix_get -s 127.0.0.1 -k iptables.bytes.input[22]
725075

[]内の番号はポート番号です。このポート番号でiptablesの出力結果をgrepします。
引数はUserParameterで定義したコマンドの$1になります。

ZABBIX item定義

添付のスクリーンショットのようになります(クリックで拡大)。
実はiptablesを使って特定ポートのトラフィックを計測するアイディアはHotSaNICを参考にさせてもらってます。
グラフの表現力ではまだまだRRDtoolにかないませんが、そこそこのことはZABBIXでもできるということで。

ZABBIX item iptables.traffic.{in,out}

Sorry, the comment form is closed at this time.