snmptrapの受信について
□事象内容:
snmpparser.sh でのsnmptrap受信ができないため、
原因について相談させてください。
□製品
zabbix:5.0.6
Redhat:8.2
□設定内容:
# ls -l /usr/bin/snmpparser.sh
-rwxrwxr-x. 1 zabbix zabbix 1097 Dec 15 13:25 /usr/bin/snmpparser.sh
スクリプトは以下の部分だけ変更。
printf "ZBXTRAP $NUM\r\n$host $ip $vars\r\n">> /var/log/zabbix_traps.tmp
# cat /etc/sysconfig/snmptrapd
OPTIONS="-m +ALL -Lsd -On"
# cat /etc/snmp/snmptrapd.conf
authCommunity log,execute,net private
authCommunity log,execute,net public
disableAuthorization yes
traphandle default /usr/bin/bash /usr/bin/snmpparser.sh
・/etc/zabbix/zabbix_server.conf
SNMPTrapperFile=/var/log/zabbix_traps.tmp
StartSNMPTrapper=1
・/etc/zabbix/zabbix_agentd.conf
Server=10.0.2.4
ServerActive=10.0.2.4
Hostname=zabbix-rel
Zabbixのホスト:
ホスト:zabbix-rel
SNMP:10.0.2.4
接続:IP
ポート:161
SNMPバージョン:SNMPv2
SNMPコミュニティ:public
エージェント:10.0.2.4
接続:IP
ポート:10050
アイテム:
タイプ:SNMPトラップ
キー:snmptrap.fallback
ホストインターフェース:10.0.2.4:161
データ型:ログ
□実行内容
zabbix-rel 上から以下を実施。
snmptrap -v 2c -c public 10.0.2.4 '' .1.3.6.1.4.1.8072.9999 .1.3.6.1.4.1.8072.9999 s 'Hello'
□結果
# cat /var/log/zabbix_traps.tmp
ZBXTRAP
zabbix-rel.internal.cloudapp.net UDP: [10.0.2.4]:55477->[10.0.2.4]:162 .1.3.6.1.2.1.1.3.0 = 0:0:05:54.01, .1.3.6.1.6.3.1.1.4.1.0 = .1.3.6.1.4.1.8072.9999, .1.3.6.1.4.1.8072.9999 = "Hello"
# tail /var/log/zabbix/zabbix_server.log
2113:20201215:134550.007 unmatched trap received from "zabbix-rel.internal.cloudapp.net": UDP: [10.0.2.4]:55477->[10.0.2.4]:162 .1.3.6.1.2.1.1.3.0 = 0:0:05:54.01, .1.3.6.1.6.3.1.1.4.1.0 = .1.3.6.1.4.1.8072.9999, .1.3.6.1.4.1.8072.9999 = "Hello"
設定で誤り等がありましたら、ご指摘をお願い致します。
参考サイト:
https://blog.zabbix.com/parsing-snmp-traps-with-python-or-bash-a-net-snm...
TNK - 投稿数: 4731
ホストとして「zabbix-rel」として登録されていて、トラップの
処理時に「zabbix-rel.internal.cloudapp.net」と比較して合致
しないと判断されているのではないかと思うのですが、そうなっ
た原因までは特定できていません。
KA - 投稿数: 5
TNK様
ご意見をありがとうございます。
ホスト名ですが、Azure環境ということもあり、
ホスト名は「zabbix-rel」で表示されますが、
SNMPTrap上では「zabbix-rel.internal.cloudapp.net」となってしまいました。
確認すると、シェルスクリプトで $NUM のところが空になっており、
どうもスクリプトでうまく変換ができていないようにも見えました。
シェルスクリプトでの実施が難しかったので、
pythonでも試してみました。
python で用意されているスクリプトで実行すると、以下のようなメッセージとなり
スクリプトの途中でエラーとなりました。
messages
----
Dec 16 00:48:13 zabbix-rel snmptrapd[9621]: Traceback (most recent call last):
Dec 16 00:48:13 zabbix-rel snmptrapd[9621]: File "/usr/bin/snmptrap-parser.py", line 51, in
Dec 16 00:48:13 zabbix-rel snmptrapd[9621]: main()
Dec 16 00:48:13 zabbix-rel snmptrapd[9621]: File "/usr/bin/snmptrap-parser.py", line 40, in main
Dec 16 00:48:13 zabbix-rel snmptrapd[9621]: source = re.findall(".snmpTrapAddress.0 ([\d.+]+)", r)[0]
Dec 16 00:48:13 zabbix-rel snmptrapd[9621]: IndexError: list index out of range
----
pythonのスクリプトにて、
source = re.findall(".snmpTrapAddress.0 ([\d.+]+)", r)[0]を
source = r
に変更すると、以下のように表示されました。
[root@zabbix-rel log]# cat zbx_traps.tmp
05:33:46 2020/12/16 ZBXTRAP zabbix-rel.internal.cloudapp.net
UDP: [10.0.2.4]:35790->[10.0.2.4]:162
.1.3.6.1.2.1.1.3.0 0:6:25:56.28
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.4.1.8072.9999
.1.3.6.1.4.1.8072.9999 "Hello"
そこで、
source = re.findall(".snmpTrapAddress.0 ([\d.+]+)", r)[0]を
source = re.findall("UDP: \[([\d.+]+)\]:", r)[0]
に変更することで、zabbixに無事に取り込めました。
ただ、zabbixでの用意されているスクリプトで、
かつ更新日も2週間前ということで、ここまでの変更が必要なのかが不明なところです。
ご意見をもらえると助かります。
参考までに、アイテムとして取り込まれた内容は以下でした。
Zabbix上でのホスト名やアイテム等の設定変更は行っていないです。
---
05:48:44 2020/12/16 zabbix-rel.internal.cloudapp.net
UDP: [10.0.2.4]:45226->[10.0.2.4]:162
.1.3.6.1.2.1.1.3.0 0:6:40:54.46
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.4.1.8072.9999
.1.3.6.1.4.1.8072.9999 "Hello"
---
TNK - 投稿数: 4731
ダウンロードされたURLをご確認ください。
Zabbix公式のスクリプトではありません。
公開されている公式のスクリプトとしては、ソースに含まれる
zabbix_trap_receiver.plというスクリプトになります。
https://www.zabbix.com/documentation/5.0/manual/config/items/itemtypes/s...
ただし、RHEL 8ではnet-snmp-perlパッケージがなくなってしまっ
たので、何らかの方法を使用してnet-snmp-perlパッケージを用意
するなどの対応が必要です。
https://www.zabbix.com/documentation/5.0/manual/installation/known_issue...
また、サポート契約を行っていれば、より改良されたスクリプトが
提供されるようです。
https://enterprise.zabbix.co.jp/solutions/6434
KA - 投稿数: 5
TNK様
情報を頂き、ありがとうございます。
net-snmp-perlが利用できなくなり、色々な方法を検討しているところでした。
いくつかの候補を試したいと思います。ありがとうございました。