【问题标题】:How to send v3 trap with enginedId using snmp4j如何使用 snmp4j 发送带有 enginedId 的 v3 陷阱
【发布时间】:2019-05-15 13:09:55
【问题描述】:

我正在尝试创建一个独立的 java 应用程序来发送 SNMP v3 陷阱和 engineId。

我正在使用 snmp4j 2.5.3 和 Java 1.8

下面是我正在使用的代码 sn-p。

当我在 addUser 时提供 engineId 时,它会抛出“消息处理模型 3 返回错误:未知安全名称”。

当我删除时,它工作正常。但是,我的 SNMP 管理器无法识别陷阱。

// Sample code snippet

Address targetAddress = GenericAddress.parse("udp:" + ipAddress + "/" + port);
                TransportMapping<?> transport = new DefaultUdpTransportMapping();
                Snmp snmp = new Snmp(transport);

                USM usm = new USM(SecurityProtocols.getInstance().addDefaultProtocols(),
                        new OctetString(MPv3.createLocalEngineID(new OctetString(engineId))), 0);
                SecurityProtocols.getInstance().addPrivacyProtocol(new PrivAES192());
                SecurityProtocols.getInstance().addPrivacyProtocol(new PrivAES256());
                SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES());
                SecurityModels.getInstance().addSecurityModel(usm);

                switch (securityLevel) {
                    case SecurityLevel.NOAUTH_NOPRIV:
                        snmp.getUSM().addUser(new OctetString(username), new OctetString(engineId), new UsmUser(new OctetString(username), null,
                                null, null, null));
                        break;
                    case SecurityLevel.AUTH_NOPRIV:
                        snmp.getUSM().addUser(new OctetString(username), new OctetString(engineId), new UsmUser(new OctetString(username), auth,
                                new OctetString(authpassPhrase), null, null));
                        break;
                    case SecurityLevel.AUTH_PRIV:
                        snmp.getUSM().addUser(new OctetString(username), new OctetString(engineId), new UsmUser(new OctetString(username), auth,
                                new OctetString(authpassPhrase), privacy, new OctetString(privacypassPhrase)));
                        break;
                    default:
                        System.err.println("Undefined Security level for SNMP v3");
                        System.exit(1);
                }

                UserTarget target = new UserTarget();
                target.setAddress(targetAddress);
                target.setRetries(1);
                target.setTimeout(5000);
                target.setVersion(SnmpConstants.version3);
                target.setSecurityLevel(securityLevel);
                target.setSecurityName(new OctetString(username));

                ScopedPDU pdu = new ScopedPDU();
                pdu.setType(ScopedPDU.NOTIFICATION);
                pdu.setRequestID(new Integer32(1234));
                pdu.add(new VariableBinding(SnmpConstants.sysUpTime));
                pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, SnmpConstants.linkDown));
                pdu.add(new VariableBinding(new OID(Oid), new Integer32(123)));

                snmp.send(pdu, target);
                System.out.println("Sending Trap to (IP:Port)=> " + ipAddress + ":" + port);
                snmp.close();

我希望 SNMP 管理器应该识别陷阱并且应该在 SNMP 管理器中接收它。

我在这里错过了什么?

提前致谢。

【问题讨论】:

    标签: java snmp snmp4j snmp-trap


    【解决方案1】:

    我有同样的问题。我使用的是 snmp4j 2.5.3 和 Java 1.7。您可以在 Java 1.8 中使用更高版本的 snmp4j 库。

    因此,当您使用引擎 id 将用户添加到 USM 并发送 Pdu 时,此引擎 id 实际上并没有用于从 userTable 中提取 UsmUserEntry。实际上,localEngineID 用于提取 UsmUserEntry。因此,UsmUserEntry 对象变为 null,并且您会收到“消息处理模型 3 返回错误:未知安全名称”的异常。

    因此,您还需要为本地引擎 ID 提供相同的引擎 ID。

    试试下面的。

    假设您的引擎 ID 是“12345”。

    USM usm = new USM(SecurityProtocols.getInstance(),  new OctetString(MPv3.createLocalEngineID()), 0);
    
    SecurityModels.getInstance().addSecurityModel(usm);
    
    //Add engine id while addinf user
    snmp.getUSM().addUser(new OctetString(username), new OctetString("12345"),
                            new UsmUser(new OctetString(username), AuthSHA.ID, new OctetString(authpassphrase), PrivAES192.ID, new OctetString(privacypassphrase)));
    
    //set the same engine to localEngineId
    snmp.setLocalEngine(new OctetString("12345").getValue(),0,0);
    

    祝你好运!

    【讨论】:

    • 谢谢阿图尔。您建议的更改有效。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多