こんにちは。サイオステクノロジー OSS サポート担当何敏欽です。
SNMPトラップの種別
net-snmp を利用している場合、実際に SNMP トラップ送出するのでしょうか。送出するならば、それはどのようなときでしょうか。 ココに記載されているとおり、net-snmp を利用している場合、coldStart / linkDown / linkUp / authenticationFailure の4つトラップが実際に送信されうるトラップとなります。
- ColdStart
- LinkDown
- LinkUp
- AuthentificationFailure
SNMPエージェントが初期化されて、起動した。
ネットワークとのインタフェースが Up から Down 状態になった。
ネットワークとのインタフェースが Down から Up 状態になった。
認証違反を検出した。
それぞれのトラップの送信条件
snmpd.conf 内にて “trapsink” 等、トラップを送信する設定がされている場合、それぞれのトラップの送信条件は、下記の通りとなります。
-
- 1.3.6.1.6.3.1.1.5.1 (coldStart)
net-snmp の起動時に必ず送信されます。
# systemctl start snmpd # tail -f /var/log/messages May 7 14:48:39 rhel7 snmptrapd[1199]: 2018-05-07 14:48:39 rhel7.labs.sios.com [10.1.0.0] (via UDP: [127.0.0.1]:60985->[10.1.0.0]:162) TRAP, SNMP v1, community public#012#011NET-SNMP-MIB::netSnmpAgentOIDs.10 Cold Start Trap (0) Uptime: 0:00:00.09
-
- 1.3.6.1.6.3.1.1.5.4 (linkUp) / 1.3.6.1.6.3.1.1.5.3 (linkDown)
snmpd.conf 内に下記のような設定を追加し、ネットワークのリンクダウンまたはリンクアップを行うことで送信されます。
linkUpDownNotifications yes
-
- net-snmp で linkUp および linkDown トラップの送信を制御することは可能です。linkUp もしくは linkDown トラップのみを送信可能とする設定例を以下に記載します。
# trapsink の設定 trapsink IP public # linkUp トラップのみ送信設定する場合、linkDown トラップの送信設定をしない notificationEvent linkUpTrap linkUp ifIndex ifAdminStatus ifOperStatus monitor -r 60 -e linkUpTrap "Generate linkUp" ifOperStatus != 2 # linkDown トラップのみ送信設定する場合、linkUp トラップのみ送信設定しない notificationEvent linkDownTrap linkDown ifIndex ifAdminStatus ifOperStatus monitor -r 60 -e linkDownTrap "Generate linkDown" ifOperStatus == 2
-
- 1.3.6.1.6.3.1.1.5.5 (authenticationFailure)
snmpd.conf 内に下記設定を追加し、アクセスを認めていないコミュニティからの SNMP リクエストを受けた場合に送信されます。
authtrapenable 1
トラップを抑止する方法
net-snmp のソースコードを確認しましたが、これらのトラップは send_easy_trap 関数をコールすることで発出することがわかりました。そのため、send_easy_trap 関数をコメントアウトすることでトラップを抑止できると考えます。
net-snmp-5.7.2-28.el7/agent/snmpd.c
------
410 static void
411 SnmpTrapNodeDown(void)
412 {
413 //send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 2); ←ココ nsNotifyShutdown
414 /*
415 * XXX 2 - Node Down #define it as NODE_DOWN_TRAP
416 */
417 }
(略)
435 int
436 #ifdef WIN32SERVICE
437 SnmpDaemonMain(int argc, TCHAR * argv[])
438 #else
439 main(int argc, char *argv[])
440 #endif
441 {
(略)
1097 /*
1098 * Send coldstart trap if possible.
1099 */
1100 //send_easy_trap(0, 0); ←ココ coldStart
(略)
1204 static int
1205 receive(void)
1206 {
(略)
1231 while (netsnmp_running) {
1232 if (reconfig) {
1233 #if HAVE_SIGHOLD
1234 sighold(SIGHUP);
1235 #endif
1236 reconfig = 0;
1237 snmp_log(LOG_INFO, "Reconfiguring daemon\n");
1238 /* Stop and restart logging. This allows logfiles to be
1239 rotated etc. */
1240 netsnmp_logging_restart();
1241 snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
1242 netsnmp_get_version());
1243 update_config();
1244 //send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 3); ←ココ notifyRestart
1245 #if HAVE_SIGHOLD
1246 sigrelse(SIGHUP);
1247 #endif
1248 }
------
net-snmp-5.7.2-28.el7/agent/snmp_agent.c
------
1901 int
1902 handle_snmp_packet(int op, netsnmp_session * session, int reqid,
1903 netsnmp_pdu *pdu, void *magic)
1904 {
(略)
1931 if (pdu->version == SNMP_VERSION_3 &&
1932 session->s_snmp_errno == SNMPERR_USM_AUTHENTICATIONFAILURE) {
1933 //send_easy_trap(SNMP_TRAP_AUTHFAIL, 0); ←ココ authenticationFailure
1934 return 1;
1935 }
(略)
1945 if ((access_ret = check_access(asp->pdu)) != 0) {
1946 if (access_ret == VACM_NOSUCHCONTEXT) {
(略)
1964 /*
1965 * access control setup is incorrect
1966 */
1967 //send_easy_trap(SNMP_TRAP_AUTHFAIL, 0); ←ココ authenticationFailure
------
ソースコードの変更は、必ず自己責任でお願いいたします。以上で SNMPトラップの種類、トラップの送信条件と抑止する方法を説明しました。

