はじめに
NET-SNMPのSNMPエージェント(snmpd)からlinkUp/DownのTRAPを送信する方法の解説です。
すでに
という記事に解説があります。この記事の補足説明です。
この記事ではCentOSで実施していますが、UbuntuやDebianの環境の場合には、そのままでは、TRAPを送信できません。
linkUpDownNotificationsを認識しない
もとの記事を参考に
trap2sink 192.168.11.200 trap
rouser _internal
createUser _internal MD5 _internalPassword DES
agentSecName _internal
linkUpDownNotifications yes
(192.168.11.200がTRAPの送信先)
のような設定してを追加snmpdを再起動します。
#systemctl restart snmpd.servece
または
#/etc/init.d/snmpd restart
そうすると、syslogに
snmpd[1225]: /etc/snmp/snmpd.conf: line 18: Warning: Unknown token: linkUpDownNotifications.
が記録されます。linkUpやlinkDownのTRAPも送信されません。
この状態をNET-SNMP,DebianやUbuntuにバグとして報告している人がいます。
困っている人が世界中に多くいるようです。
原因は、linkUpDownNotificationsの設定を処理するMIBモジュールを読み込まない設定になっているからです。バグではありません。
systemdから起動していう場合は、
#systemctl edit --full snmpd
でsnmpdサービスの設定ファイルを編集します。
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Environment="MIBSDIR=/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site"
Environment="MIBS="
Type=simple
ExecStartPre=/bin/mkdir -p /var/run/agentx
- ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f -p /run/snmpd.$
+ ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux -f -p /run/snmpd.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
-IのパラメータからmteTrigger,mteTriggerConfを削除します。
/etc/init.d/snmpdにも同じ設定があります。これを削除します。
実は、この設定でTRAPを送信するための監視機能(DISMAN)を無効にしているのです。
これを有効にすることでTRAPを送信できます。
defaultMonitors yes
も同じ理由で動作しません。
MIBファイルが足りない
最初のTRAP送信の方法を紹介したサイトにlinkUp/Downの変化をチェックする周期を短くする方法が記載さています。
trap2sink 192.168.11.200 trap
rouser _internal
createUser _internal MD5 _internalPassword DES
agentSecName _internal
- linkUpDownNotifications yes
+ #linkUpDownNotifications yes
+ notificationEvent linkUpTrap linkUp ifIndex ifAdminStatus ifOperStatus
+ notificationEvent linkDownTrap linkDown ifIndex ifAdminStatus ifOperStatus
+ monitor -r 10 -e linkUpTrap "Generate linkUp" ifOperStatus != 2
+ monitor -r 10 -e linkDownTrap "Generate linkDown" ifOperStatus == 2
のような設定です。
Debian(Ubuntu)の環境で、この設定でsnmpdを起動すると
Nov 28 06:36:41 miniPC2 snmpd[2267]: notificationEvent OID: linkUp
Nov 28 06:36:41 miniPC2 snmpd[2267]: /etc/snmp/snmpd.conf: line 149: Error: unknown notification OID
のようなsyslogが記録されます。
これは、linkUpなどを数値のOIDに変換できないことを示しています。MIBの定義が足りないのです。
DebianとUbuntuでは、RFCで定義されている標準MIBの定義ファイルをデフォルトではインストールしません。
(昔はインストールされていたと思いますが、現在はされません)
インストールするには、
#apt install snmp-mibs-downloader
を実行します。
Debianの場合には、non-freeのパッケージをインストールできるようにapt-sourceを設定する必要があります。
をみてください。
systemdのサービス設定も変更が必要です。
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Environment="MIBSDIR=/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site"
- Environment="MIBS="
+ Environment="MIBS=all"
Type=simple
ExecStartPre=/bin/mkdir -p /var/run/agentx
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux -f -p /run/snmpd.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
私は面倒なので、MIBS=allにしていますが、MIBS=IF-MIBなど必要なMIBだけ設定してもよいです。
これでエラーログは記録されなくなり、linkUp/DownのTRAPも送信されるようになります。
TWSNMP FCでTRAPを受信した例
TWSNMP FCは
です。
DockerやLinuxなどのWindows以外の環境は
です。