zabbix-agentからpingを送る方法

デフォルトでは対応していない

監視対象のホストからpingを送りたい

背景:
LinuxベースのVPNルーター strongSwan構築したのですが、ipsecでルーター間VPNを張った際に遠隔のルーター側でNATをかけた際のアドレス宛に疎通監視の為に、strongSwanからping監視をしたい。

シンプルチェック icmpping

シンプルチェックと有る通り、zabbix-agentが関わらない監視です。
pingの送信元がZABBIXサーバーになり、pingを送信します。
アイテム設定の際にキーとしてicmppingとだけ設定すると、アイテムを設定したホスト宛の監視になります。
icmpping[1.1.1.1]の様に設定するとZABBIXサーバーから1.1.1.1宛ping監視になり、結果がアイテムを設定したホストの最新データに表示されます。

それで当然VPNの疎通先はZABBIXサーバーからは見えないので、直接pingは打てません。

UserParameterを使う

pingの挙動確認

ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=55 time=3.62 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.629/3.629/3.629/0.000 ms

cオプションで1を指定すると1回だけping送信します。

ping -c 1 -w 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=3.17 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.170/3.170/3.170/0.000 ms

-wオプションでタイムアウトを1秒に設定します。

ping -c 1 -w 1 8.8.8.8 > /dev/null 2>&1

標準出力やエラーを/dev/nullにリダイレクトして捨てます。(何も出力されない)

ping -c 1 -w 1 8.8.8.8 > /dev/null 2>&1 ; echo $?
.0

セミコロンで次のコマンドに繋いで、echo $?でpingの戻り値を出力しています。ping応答有りで0, 応答なしで2を返します。

実際は0の前のドットは出力されません。プラグインの問題で0だけだと表示出来ないのでドットを入れています。

UserParameterに設定する

vi /etc/zabbix/zabbix_agentd.conf
UserParameter=remote.ping[*],/usr/bin/ping -c 1 -w 1 $1 > /dev/null 2>&1 ; echo $?

ping送信元にしたいホストのzabbix_agentd.confに設定してからagentを再起動します。

zabbix-getで確認する

sudo zabbix_get -s 127.0.0.1 -k remote.ping[8.8.8.8]
.0

ホストにアイテムを追加する

名前:ping test from remote
タイプ:Zabbixエージェント
キー:remote.ping[8.8.8.8]
データ型:数値(整数)
監視間隔:1m (任意)

※テストで8.8.8.8宛にping設定しています。

tcpdumpで確認する

sudo tcpdump -nvA -i eth0 host 8.8.8.8
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:59:42.431481 IP (tos 0x0, ttl 64, id 6542, offset 0, flags [DF], proto ICMP (1), length 84)
172.18.1.196 > 8.8.8.8: ICMP echo request, id 21749, seq 1, length 64
E..T..@.@.c5……….t.T…N..b….d………………….. !”#$%&'()*+,-./01234567
14:59:42.435115 IP (tos 0x0, ttl 116, id 0, offset 0, flags [none], proto ICMP (1), length 84)
8.8.8.8 > 172.18.1.196: ICMP echo reply, id 21749, seq 1, length 64
E..T….t………….|.T…N..b….d………………….. !”#$%&'()*+,-./01234567
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel

確かに監視対象のホストから8.8.8.8にpingが飛んでいる事が分かります。

値のマッピングの設定をする

ping応答有りの場合0, 無しで2なので分かりにくいので値のマッピングの設定をホストで行います。
=0の場合 OK, >=1 (1以上の場合) Downとします。

アイテムで値のマッピングを選択します。

データ確認

OK (0) としてデータが取れています。

トリガーを設定する

名前:ping down: test from host
深刻度:(任意)
条件式:last(/<host>/remote.ping[8.8.8.8])>=1

1以上の値が返ってきたら障害とします。

トリガーの動作テスト

監視対象を一時的に8.8.8.8から1.2.3.4に変更するとping不通で障害になります。

8.8.8.8に戻すと解決します。

レスポンスタイムを測定するUserParameter

vi /etc/zabbix/zabbix_agentd.conf
UserParameter=remote.ping.time[*],/usr/bin/ping -c 1 -w 1 $1 | grep from | awk ‘{ print $$7 }’ | cut -c 6-

UserParameter=remote.ping.time[*],/usr/bin/ping -c 1 -w 1 $1 | grep from | awk ‘{ print $$7 }’ | cut -c 6-

実際はUserParameterは1行です。プラグインの問題で行が別れています。

awkの部分の$が2個必要な点に注意して下さい。
データ型:整数(浮動少数)
単位:ms

sudo zabbix_get -s 127.0.0.1 -k remote.ping.time[8.8.8.8]
3.70

zabbix-getでデータ取得を確認

デフォルトでも実装してほしい機能

監視対象から更に別の対象へのping監視は、需要は有ると思うのですが。
なぜデフォルトで実装されていないのか不思議です。
でもUserParameterを使うと簡単に実装できます。

今回は実際はstrongSwanをLLD(ローレベルディスカバリ)で監視して、ipsec疎通先を自動でping監視に加える設定を行いました。
ルーター間VPNの接続先が増えても自動でping監視に加えてくれます。
監視を充実させましょう。

TwitterFacebookLinkedInHatenaPocketCopy Link