NET-SNMPのSNMPエージェント(snmpd)からlinkUp/linkDownのSNMP TRAPを送信する方法（ Ubuntu/Denbian)

# はじめに

NET-SNMPのSNMPエージェント(snmpd)からlinkUp/DownのTRAPを送信する方法の解説です。
すでに

https://qiita.com/Ki2neudon/items/c9729929593d9a4b93f3

という記事に解説があります。この記事の補足説明です。

この記事ではCentOSで実施していますが、UbuntuやDebianの環境の場合には、そのままでは、TRAPを送信できません。


# linkUpDownNotificationsを認識しない

もとの記事を参考に

```conf:/etc/snmpd/snmpd.conf
trap2sink 192.168.11.200 trap
rouser _internal
createUser _internal MD5 _internalPassword DES
agentSecName _internal
linkUpDownNotifications yes
```
（192.168.11.200がTRAPの送信先）
のような設定してを追加snmpdを再起動します。

```terminal
#systemctl restart snmpd.servece
```
または
```terminal
#/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から起動していう場合は、

```terminal
#systemctl edit --full snmpd
```
でsnmpdサービスの設定ファイルを編集します。

```diff_conf
[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を送信できます。

```conf
defaultMonitors          yes
```
も同じ理由で動作しません。

# MIBファイルが足りない

最初のTRAP送信の方法を紹介したサイトにlinkUp/Downの変化をチェックする周期を短くする方法が記載さています。

```diff_conf
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の定義ファイルをデフォルトではインストールしません。
（昔はインストールされていたと思いますが、現在はされません）

インストールするには、

```terminal
#apt install snmp-mibs-downloader

```
を実行します。

Debianの場合には、non-freeのパッケージをインストールできるようにapt-sourceを設定する必要があります。

https://note.com/twsnmp/n/n87ccd4cd1e0d

をみてください。

systemdのサービス設定も変更が必要です。

```diff_conf
[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を受信した例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/fd2d0321-903c-93c9-4370-89f192afad63.png)


TWSNMP FCは

https://note.com/twsnmp/n/nee6b36c00683?magazine_key=meed0d0ddab5e

です。

DockerやLinuxなどのWindows以外の環境は

https://note.com/twsnmp/n/nc6e49c284afb?magazine_key=meed0d0ddab5e

です。