snmptrapdは各機器からのアラートであるsnmptrapを受信する常駐プログラム(デーモン)です。主にIMPI, ネットワーク機器などの監視エージェントをインストールできないアラートを検知するのに使います。
混同しやい概念としてsnmpdがありますが、これとは異なる概念です。snmpdは監視サーバ(NMS)からのsnmp requestに対して応答する常駐プログラム(デーモン)です。
インストール
snmpdのインストール
snmpdはnet-snmpというパッケージによって提供されます。yumコマンドでnet-snmpをインストールして下さい。
dnf install net-snmp
インストールが完了したら、次にsnmptrapdを起動させます。
systemctl enable snmptrapd.service --now
snmp-utilsのインストール
必須ではありませんが、net-snmp-utilsも併せてインストールする事をお勧めします。net-snmp-utilsは、snmpget, snmpwalkなどsnmpのデバッグを行うのに有用なツールを多数備えています。
# dnf install net-snmp-utils
snmptrapd.conf トラップ受信許可の設定
snmpdの設定は、/etc/snmp/snmptrapd.confというファイルに記述します。SNMPトラップを受信するためには、以下のいずれかの設定が必要となります。
- disableauthorizationでコミュニティ名による認証を無効化する
- authCommunityでコミュニティ名単位の受信許可を設定する
方法1 認証無効化設定
/etc/snmp/snmptrapd.confというファイルを以下のように”disableauthorization yes”という設定を加筆します。
# vi /etc/snmp/snmptrapd.conf # Example configuration file for snmptrapd # # No traps are handled by default, you must edit this file! # # authCommunity log,execute,net public # traphandle SNMPv2-MIB::coldStart /usr/bin/bin/my_great_script cold disableauthorization yes
snmptrapdはデフォルト設定の場合、受信したトラップは/var/log/messagesにログとして出力されます。
snmptrapd再起動により設定を反映させます。ローカルホスト宛にsnmptrapを送信し、確かに/var/log/messagesにログ出力されている事を確認します。
[root@centos82 ~]# systemctl restart snmptrapd.service [root@centos82 ~]# snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.100 .1.3.6.1.4.1.8072.100.1 s "hoge" [root@centos82 ~]# [root@centos82 ~]# [root@centos82 ~]# tail -n 3 /var/log/messages Sep 5 21:56:50 centos82 snmptrapd[1120]: NET-SNMP version 5.8 Sep 5 21:56:50 centos82 systemd[1]: Started Simple Network Management Protocol (SNMP) Trap Daemon.. Sep 5 21:57:05 centos82 snmptrapd[1120]: 2020-09-05 21:57:05 localhost [UDP: [127.0.0.1]:44421->[127.0.0.1]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (43002) 0:07:10.02#011SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-MIB::netSnmp.100#011NET-SNMP-MIB::netSnmp.100.1 = STRING: "hoge"
方法2 コミュニティ名単位の許可
authCommunityと呼ばれるトラップ受信許可の設定を使用する事で、特定のコミュニティ名のみsnmpトラップを受信するようになります。書式は以下の通りとなります。
authCommunity TYPES COMMUNITY [SOURCE [OID | -v VIEW ]]
TYPESとはsnmptrapdがどのような処理を行うかの設定です。log, execute, netの3種類が指定可能です。
type | 説明 |
---|---|
log | ログ出力を許可します。ファイル出力、標準出力、エラー出力、syslogなどが該当します。 |
execute | プログラムの実行を許可します。例えば、メール転送を行うtraptoemailなどのperlスクリプト等が該当します。 |
net | 他のsnmptrapdサーバへの転送を許可します。 |
多くの場合は、特にsnmptrapdの処理を制限する必要はないので、現実問題として運用しやすい設定は以下のようになります。例えば、”public”, “changineer”というコミュニティからのsnmptrapと受信したいならば、/etc/snmp/snmptrapd.confの設定は以下のようになります。
# vi /etc/snmp/snmptrapd.conf # Example configuration file for snmptrapd # # No traps are handled by default, you must edit this file! # # authCommunity log,execute,net public # traphandle SNMPv2-MIB::coldStart /usr/bin/bin/my_great_script cold authCommunity log,execute,net public
snmptrapdはデフォルト設定の場合、受信したトラップは/var/log/messagesにログとして出力されます。
snmptrapd再起動により設定を反映さ、ローカルホスト宛にsnmptrapを送信し、確かに/var/log/messagesにログ出力されている事を確認します。
[root@centos82 ~]# systemctl restart snmptrapd.service [root@centos82 ~]# snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.100 .1.3.6.1.4.1.8072.100.1 s "foo" [root@centos82 ~]# [root@centos82 ~]# [root@centos82 ~]# tail -n 3 /var/log/messages Sep 5 22:01:22 centos82 snmptrapd[1191]: NET-SNMP version 5.8 Sep 5 22:01:22 centos82 systemd[1]: Started Simple Network Management Protocol (SNMP) Trap Daemon.. Sep 5 22:01:49 centos82 snmptrapd[1191]: 2020-09-05 22:01:49 localhost [UDP: [127.0.0.1]:41478->[127.0.0.1]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (71432) 0:11:54.32#011SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-MIB::netSnmp.100#011NET-SNMP-MIB::netSnmp.100.1 = STRING: "foo"
ネットワーク機器を用いた動作確認例
ネットワーク機器にsnmptrapを送信する設定を投入します。ciscoの場合の設定例は以下の通りです。
R182(config)#snmp-server enable traps snmp linkdown linkup R182(config)#snmp-server host 192.168.1.180 version 2c public
トラップをテスト送信するため、Loopback interfaceの作成を行います。
R182#terminal monitor R182#debug snmp packets SNMP packet debugging is on R182#configure terminal Enter configuration commands, one per line. End with CNTL/Z. R182(config)#interface Loopback 10 R182(config-if)# *Sep 5 13:24:17.907: %LINK-3-UPDOWN: Interface Loopback10, changed state to up *Sep 5 13:24:18.908: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback10, changed state to up *Sep 5 13:24:18.915: SNMP: Queuing packet to 192.168.1.180 *Sep 5 13:24:18.916: SNMP: V2 Trap, reqid 3, errstat 0, erridx 0 sysUpTime.0 = 113505 snmpTrapOID.0 = snmpTraps.4 ifIndex.6 = 6 ifDescr.6 = Loopback10 ifType.6 = 24 lifEntry.20.6 = up *Sep 5 13:24:19.165: SNMP: Packet sent via UDP to 192.168.1.180 R182(config-if)#
snmptrapdサーバの/var/log/messagesを確認し、確かにsnmptrapが届いている事を確認します。
[root@zabbix180 ~]# tail -n 3 /var/log/messages Sep 5 22:24:05 zabbix180 systemd[1]: Started System Logging Service. Sep 5 22:24:05 zabbix180 rsyslogd[2705]: imjournal: journal files changed, reloading... [v8.1911.0-3.el8 try https://www.rsyslog.com/e/0 ] Sep 5 22:24:30 zabbix180 snmptrapd[2681]: 2020-09-05 22:24:30 <UNKNOWN> [UDP: [192.168.1.182]:63928->[192.168.1.180]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (113505) 0:18:55.05#011SNMPv2-MIB::snmpTrapOID.0 = OID: IF-MIB::linkUp#011IF-MIB::ifIndex.6 = INTEGER: 6#011IF-MIB::ifDescr.6 = STRING: Loopback10#011IF-MIB::ifType.6 = INTEGER: softwareLoopback(24)#011SNMPv2-SMI::enterprises.9.2.2.1.1.20.6 = STRING: "up"
snmptrap メール転送
メール環境の準備
マニュアル上はtraptoemailというツールを使用するように記載されていますが、CentOS 8.0以降ではtraptoemailがリポジトリから消えてしまっています。そこで代替手段を考えなければなりません。
今回は、postfixとmailxによる代替手段の例を紹介します。まずはpostfixとmailxをインストールします。
dnf install postfix mailx
postfixを起動します。
systemctl enable postfix.service --now
以下のようなコマンドでメールが送付可能な事を確かめます。
echo "本文" | mail -s "<メールタイトル>" <宛先メールアドレス>
もしメールが正常に転送できない場合は、/var/log/maillogなどからトラブルシュートしましょう。
tail -f /var/log/maillog
postfixのデフォルト設定はtcp25でのメール送付を試みますが、多くのインターネットサービスプロバイダはOP25Bの対策をしており、これに抵触する可能性があります。もし、インターネットサービスプロバイダの制約に抵触する場合は、SMTPS-AUTHを使用するかデザリングを使用するか等の回避策を講じましょう。
設定例1 全件転送
snmptrapをメール転送するには、traphandleという構文を使います。traphandleとは、正確にはsnmptrapをプログラムに渡す指定のことで、snmptrapによって受信したメッセージを標準入力としてプログラムに渡します。
traphandleの構文は以下のようになります。
traphandle OID|default PROGRAM [ARGS ...]
全てのOIDをメール転送する設定例は以下の通りです。/etc/snmp/snmptrapd.confを以下のように編集します。この場合ならば、snmptrapdによって受信したメッセージが/usr/bin/mailに標準入力として渡されます。
# vi /etc/snmp/snmptrapd.conf # cat /etc/snmp/snmptrapd.conf # Example configuration file for snmptrapd # # No traps are handled by default, you must edit this file! # # authCommunity log,execute,net public # traphandle SNMPv2-MIB::coldStart /usr/bin/bin/my_great_script cold authCommunity log,execute,net public traphandle default /usr/bin/mail -s "snmp trap" mXXXXXXXXXXX@lost-corona.com
snmptrapd再起動により設定を反映させ、テスト要のトラップを送信します。
[root@centos82 ~]# systemctl restart snmptrapd.service [root@centos82 ~]# snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.100 .1.3.6.1.4.1.8072.100.1 s "ktkr"
確かにsnmptrapのメールを受領できた事を確認します。
設定例2 ホワイトリスト指定
全てのsnmptrapをメール転送したくない場合は、メール転送したいトラップのみをsnmptrapd.confに記載します。以下は、CiscoルータのOSPF, BGP, linkdown, linkupをメール転送する設定例です。
traphandle .1.3.6.1.2.1.14.* /usr/bin/mail -s "snmp trap" mXXXXXXXX@asa-dea.com traphandle .1.3.6.1.2.1.15.* /usr/bin/mail -s "snmp trap" mXXXXXXXX@asa-dea.com traphandle .1.3.6.1.6.3.1.1.5.* /usr/bin/mail -s "snmp trap" mXXXXXXXX@asa-dea.com
設定例3 ブラックリスト指定
traphandleの記述は上の行から順番に処理され、初めて合致したOIDに対して処理が実施されます。この処理順序を意識すると、ブラックリスト形式の指定ができます。
以下は富士通Primergy以外からのsnmptrapをメール転送する設定例です。”.1.3.6.1.4.1.231.*”に合致するSNMPトラップは/bin/trueが実行されるため、メール転送されなくなります。
traphandle .1.3.6.1.4.1.231.* /bin/true traphandle default /usr/bin/mail -s "snmp trap" mXXXXXXXX@asa-dea.com