2011-12-30 1834 views

回答

6

这要求您通过RFC文档,这意味着这不是编程相关的,并且可能属于ServerFault。

给你一些提示:

  1. SNMP V1定义了一个特殊TRAP消息格式,从其它消息(例如GET)不同。 http://tools.ietf.org/html/rfc1157#page-27此消息格式在SNMP v2和v3中不再使用。如果SNMP代理发送v2或v3的TRAP消息,那可能是一个错误。
  2. 自v2开始,TRAP开始使用通用消息格式(与GET等相同)。所以它被称为SNMPv2-Trap-PDU。 http://tools.ietf.org/search/rfc3416#page-22
  3. SNMP v3将安全模型引入到所有消息中,因此TRAP也会收到此类更新。它仍然基于SNMPv2-Trap-PDU。
+0

关于:“如果SNMP代理为v2或v3发出这样的TRAP消息,那可能是一个错误。” @ lex-li你有这个评论的任何参考或网址吗?谢谢。 – k1eran 2014-07-31 16:36:35

+2

这是我个人的观点,基于RFC1157和RFC3416。由于后者定义了新的TRAP消息格式,因此前者的旧格式应完全过时。事实上,我确实知道有些设备会发送SNMP v2的旧格式(一个#SNMP Library用户向我报告),但我认为这应该是固件的错误。 – 2014-08-01 02:16:44

+0

可能是#3以上的原因,Wireshark在头文件中显示这样的数据包为“msgVersion:3”,在msgData中显示为“snmpV2-trap”(解密后) – vyom 2017-02-17 08:53:03

2

SNMPv2以稍微不同的方式定义陷阱。

在MIB中,SNMPv1陷阱定义为Trap-PDU,SNMPv2陷阱定义为NOTIFICATION-TYPE。 SNMPv2也取消了通用陷阱的概念,它在公有MIB中定义了许多特定的陷阱(正确地说,通知)。 (通用认证技术MD5或SHA)和隐私功能(加密技术 - DES,3DES,AES128/192/256)SNMPv3陷阱,这些陷阱只是简单的SNMPv2陷阱。

大多数SNMP实现仅支持v1。

Reference_1Reference_2

下面是SNMP4J代码发送到SNMPv3陷阱。

public void sendTrap_Version3() { 
    //TrasportMapping 
    TransportMapping transport; 
    try { 
     transport = new DefaultUdpTransportMapping(); 
     transport.listen(); 
     //Creating SNMP object 
     snmp = new Snmp(transport); 

     //Creating USM 
     USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0); 
     SecurityModels.getInstance().addSecurityModel(usm); 

     // Add user to the USM 
     snmp.getUSM().addUser(
       new OctetString("MD5DES"), 
       new UsmUser(new OctetString("MD5DES"), AuthMD5.ID, new OctetString("MD5DESUsrAuthPwd"), PrivDES.ID, 
         new OctetString("MD5DESUsrPrivPwd"))); 

     // Create the target 
     Address targetAddress = GenericAddress.parse("udp:10.120.7.107/162"); 
     UserTarget target = new UserTarget(); 
     target.setAddress(targetAddress); 
     target.setRetries(3); 
     target.setTimeout(5000); 
     target.setVersion(SnmpConstants.version3); 
     target.setSecurityLevel(SecurityLevel.AUTH_PRIV); 
     target.setSecurityName(new OctetString("MD5DES")); 
     // Create PDU 
     ScopedPDU pdu = new ScopedPDU(); 

     pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTic(new Date().toString()))); 
     pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID,SnmpConstants.linkDown)); 
     pdu.add(new VariableBinding(SnmpConstants.snmpTrapAddress, new IpAddress("127.3.4.1"))); 
     pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.1.1"), new Integer32(1))); 

     pdu.setType(ScopedPDU.TRAP); 
     snmp.send(pdu, target); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

上述v2代码片段?为什么在代码段中有相关的安全性? – ifelsemonkey 2017-12-12 14:57:31