SNMPトラップの送信条件、トラップ抑止方法について

こんにちは。サイオステクノロジー OSS サポート担当何敏欽です。

SNMPトラップの種別

net-snmp を利用している場合、実際に SNMP トラップ送出するのでしょうか。送出するならば、それはどのようなときでしょうか。

ココに記載されているとおり、net-snmp を利用している場合、coldStart / linkDown / linkUp / authenticationFailure の4つトラップが実際に送信されうるトラップとなります。

  • ColdStart
  • SNMPエージェントが初期化されて、起動した。

  • LinkDown
  • ネットワークとのインタフェースが Up から Down 状態になった。

  • LinkUp
  • ネットワークとのインタフェースが Down から Up 状態になった。

  • AuthentificationFailure
  • 認証違反を検出した。

それぞれのトラップの送信条件

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トラップの種類、トラップの送信条件と抑止する方法を説明しました。

Be the first to comment

コメント投稿

Your email address will not be published.


*