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でもできるということで。
Sorry, the comment form is closed at this time.