如何使用 snmp4j 发送带有 enginedId 的 v3 陷阱
How to send v3 trap with enginedId using snmp4j
我正在尝试创建一个独立的 java 应用程序来发送 SNMP v3 陷阱和 engineId。
我正在使用 snmp4j 2.5.3 和 Java 1.8
下面是我正在使用的代码片段。
当我在添加用户时提供 engineId 时,它抛出 "Message processing model 3 returned error: Unknown security name"。
当我删除时,它工作正常。但是,我的 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 管理器上接收它。
我在这里错过了什么?
提前致谢。
我遇到了同样的问题。我使用的是 snmp4j 2.5.3 和 Java 1.7。您可以使用更高版本的 snmp4j lib Java 1.8.
因此,当您使用引擎 ID 将用户添加到 USM 并发送 Pdu 时,此引擎 ID 实际上并未用于从 userTable 中提取 UsmUserEntry。事实上,localEngineID 用于提取 UsmUserEntry。因此 UsmUserEntry 对象变为 null 并且您得到异常 "Message processing model 3 returned error: Unknown security name".
因此您也需要为本地引擎 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);
祝你好运!
我正在尝试创建一个独立的 java 应用程序来发送 SNMP v3 陷阱和 engineId。
我正在使用 snmp4j 2.5.3 和 Java 1.8
下面是我正在使用的代码片段。
当我在添加用户时提供 engineId 时,它抛出 "Message processing model 3 returned error: Unknown security name"。
当我删除时,它工作正常。但是,我的 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 管理器上接收它。
我在这里错过了什么?
提前致谢。
我遇到了同样的问题。我使用的是 snmp4j 2.5.3 和 Java 1.7。您可以使用更高版本的 snmp4j lib Java 1.8.
因此,当您使用引擎 ID 将用户添加到 USM 并发送 Pdu 时,此引擎 ID 实际上并未用于从 userTable 中提取 UsmUserEntry。事实上,localEngineID 用于提取 UsmUserEntry。因此 UsmUserEntry 对象变为 null 并且您得到异常 "Message processing model 3 returned error: Unknown security name".
因此您也需要为本地引擎 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);
祝你好运!