Как отправить ловушку v3 с помощью enginedId с помощью snmp4j

Я пытаюсь создать автономное приложение Java для отправки ловушек SNMP v3 вместе с engineId.

Я использую snmp4j 2.5.3 и Java 1.8

Ниже приведен фрагмент кода, который я использую.

Когда я указываю engineId во время addUser, он выдает ошибку «Модель обработки сообщений 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.

Что мне здесь не хватает?

Заранее спасибо.


person Praveen Vaidya    schedule 15.05.2019    source источник


Ответы (1)


Я была такая же проблема. Я использовал snmp4j 2.5.3 и Java 1.7. Вы можете использовать более новую версию snmp4j lib с Java 1.8.

Поэтому, когда вы добавляете пользователя в USM с идентификатором двигателя и отправляете Pdu, этот идентификатор двигателя фактически не используется для извлечения UsmUserEntry из таблицы userTable. Фактически localEngineID используется для извлечения UsmUserEntry. Следовательно, объект UsmUserEntry становится пустым, и вы получаете исключение, поскольку «Модель обработки сообщений 3 вернула ошибку: Неизвестное имя безопасности».

Таким образом, вам необходимо предоставить тот же идентификатор двигателя для локального идентификатора двигателя.

Попробуйте следующее.

Допустим, ваш идентификатор двигателя - «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);

Удачи!

person Atul Panda    schedule 16.05.2019
comment
Спасибо, Атул. Предложенные вами изменения работают. Ваше здоровье. - person Praveen Vaidya; 17.05.2019