2014-03-19 104 views
0

我挣扎从过去几天发送SNMPV3陷阱使用身份验证和特权短语。这是我的代码。无法发送snmp v3陷阱与Auth和Priv

陷阱接收

private void init() throws UnknownHostException, IOException { 
     threadPool = ThreadPool.create("Trap", 10); 
     dispatcher = new MultiThreadedMessageDispatcher(threadPool, 
       new MessageDispatcherImpl()); 
     listenAddress = GenericAddress.parse(System.getProperty(
       "snmp4j.listenAddress", "udp:0.0.0.0/165")); 
     TransportMapping<?> transport; 
     if (listenAddress instanceof UdpAddress) { 
      transport = new DefaultUdpTransportMapping(
        (UdpAddress) listenAddress); 
     } else { 
      transport = new DefaultTcpTransportMapping(
        (TcpAddress) listenAddress); 
     } 
     USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
       MPv3.createLocalEngineID()), 0); 
     usm.setEngineDiscoveryEnabled(true); 

     snmp = new Snmp(dispatcher, transport); 
     snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1()); 
     snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); 
     snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3(usm)); 
     SecurityModels.getInstance().addSecurityModel(usm); 
     snmp.getUSM().addUser( new OctetString("MD5DES"), 
       new UsmUser(new OctetString("karthikprasad"), AuthMD5.ID, 
         new OctetString("UserName"), PrivDES.ID, 
         new OctetString("PasswordUser"))); 
     snmp.getUSM().addUser(new OctetString("MD5DES"), 
       new UsmUser(new OctetString("MD5DES"), null, null, null, null)); 

     snmp.listen(); 
} 

陷阱发件人

private static void sendSnmpV3Trap() { 
     try { 
      long start = System.currentTimeMillis(); 
      Address targetAddress = GenericAddress.parse("udp:" + ipAddress 
        + "/" + port); 

      // Create Transport Mapping 
      TransportMapping<?> transport = new DefaultUdpTransportMapping(); 
      Snmp snmp = new Snmp(transport); 
      USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
        MPv3.createLocalEngineID()), 0); 
      SecurityModels.getInstance().addSecurityModel(usm); 
      transport.listen(); 

      snmp.getUSM().addUser( new OctetString("MD5DES"), 
        new UsmUser(new OctetString("karthikprasad"), AuthMD5.ID, 
          new OctetString("UserName"), PrivDES.ID, 
          new OctetString("PasswordUser"))); 

      // Create Target 
      UserTarget target = new UserTarget(); 
      target.setAddress(targetAddress); 
      target.setRetries(1); 

      // set timeout 
      target.setTimeout(11500); 
      target.setVersion(SnmpConstants.version3); 
      target.setSecurityLevel(SecurityLevel.AUTH_PRIV); 
      target.setSecurityName(new OctetString("karthikprasad")); 
      target.setSecurityModel(SecurityModel.SECURITY_MODEL_USM); 

      // Create PDU for V3 
      ScopedPDU pdu = new ScopedPDU(); 
      pdu.setType(ScopedPDU.NOTIFICATION); 

      // need to specify the system up time 
      long sysUpTime = (System.currentTimeMillis() - start)/10; 
      pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(
        sysUpTime))); 
      pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, 
        SnmpConstants.linkDown)); 
      pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.1.1"), 
        new Integer32(1))); 

      // Send the PDU 
      System.out.println("Sending V3 Trap to " + ipAddress + " on Port " 
        + port); 
      snmp.send(pdu, target); 
      snmp.addCommandResponder(new CommandResponder() { 
       @Override 
       public void processPdu(CommandResponderEvent arg0) { 
        System.out.println(arg0); 
       } 
      }); 
      snmp.close(); 
     } catch (Exception e) { 
      System.err.println("Error in Sending V2 Trap to " + ipAddress 
        + " on Port " + port); 
      System.err.println("Exception Message = " + e.getMessage()); 
     } 
    } 

当我设置noauthand nopriv它工作正常。但是当我设置为authpriv时,我没有收到陷阱信息。甚至在启用调试时也不会在发件人中发生任何错误。我试图将文件复制到另一台机器上,然后运行接收器并使用wireshark发送陷阱和受监控网络,并且我能够找到到达目标服务器的消息,但未传递给接收方。我相信解密时会出现一些问题。有人可以帮我吗?顺便说一句我正在使用jdk 6更新32.

回答

0

SNMPv3是很难设置。尝试在SNMP4j上使用http://friendlysnmp.org。 FriendlySNMP支持所有SNMP版本,包括v2c和v3。

+0

感谢您的回答。但我无法切换框架。但是,请你让我知道可能的原因。这样我就可以在那个方向上进行分析 –

0

使用像友好的snmp这样的包装API使认为不容易,但难以理解和调试。 这里的问题很可能是,发件人和reveiver具有相同的SNMPv3不允许的引擎ID。

因为这是许多用户的常见错误,所以MPv3.createLocalEngineID方法在最新的SNMP4J版本(自2.2.4版本)创建的引擎ID中使用随机组件来避免将来出现此错误。的SNMP v3陷阱接收

1

工作例

private synchronized void startTrapReceiver() throws UnknownHostException, 
      IOException { 
    ThreadPool threadPool = ThreadPool.create("DispatcherPool", 10); 

    Address listenAddress = new UdpAddress("localhost/162"); 
    TransportMapping transport; 
    if (listenAddress instanceof UdpAddress) { 
     transport = new DefaultUdpTransportMapping(
       (UdpAddress) listenAddress); 
    } else { 
     transport = new DefaultTcpTransportMapping(
       (TcpAddress) listenAddress); 
    } 
    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
      MPv3.createLocalEngineID()), 0); 
    usm.setEngineDiscoveryEnabled(true); 

    MessageDispatcher mDispathcher = new MultiThreadedMessageDispatcher(
      threadPool, new MessageDispatcherImpl()); 

    // add message processing models 
    mDispathcher.addMessageProcessingModel(new MPv1()); 
    mDispathcher.addMessageProcessingModel(new MPv2c()); 
    mDispathcher.addMessageProcessingModel(new MPv3(usm)); 
    // add all security protocols 
    SecurityProtocols.getInstance().addDefaultProtocols(); 
    SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES()); 

    SecurityModels.getInstance().addSecurityModel(usm); 

    CommunityTarget target = new CommunityTarget(); 

    target.setCommunity(new OctetString("public")); 

    Snmp snmp = new Snmp(mDispathcher, transport); 

    snmp.getUSM().addUser(
      new OctetString("MD5DES"), 
      new UsmUser(new OctetString("saikrishna"), AuthMD5.ID, 
        new OctetString("saikrishnapassword"), PrivDES.ID, 
        new OctetString("PasswordUser"))); 
    snmp.addCommandResponder(this); 

    transport.listen(); 
    System.out.println("listening"); 
    try { 
     this.wait(); 
    } catch (InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 
} 

public synchronized void processPdu(CommandResponderEvent cmdRespEvent) { 
    System.out.println("Received PDU..."); 
    PDU pdu = cmdRespEvent.getPDU(); 
    if (pdu != null) { 
     System.out.println("Trap Type = " + pdu.getType()); 
     System.out.println("Variables = " + pdu.getVariableBindings()); 
    } 
}