SNMP4J CommandResponder не получает ловушки V3
Я пытаюсь реализовать слушателя ловушки SNMP, который основан на примерах в Интернете. Я был в состоянии заставить это работать. Моя проблема в том, что сообщения ловушки V3 не перехватываются. Я знаю, что V3 имеет аутентификацию, так что я вполне уверен, что проблема может быть связана с этим, однако маршрутизатор, отправляющий ловушки, настроен так, чтобы не использовать аутентификацию.
snmp-server host 192.168.199.190 версия 3 noauth testuser mac-уведомление snmp
Вот мой соответствующий код:
public class TrapHandler implements CommandResponder {
private static final String _V3_USERNAME = "testuser";
private static final String _V3_AUTHENTICATION_PASSPHRASE = "idontKnowThis";
private static final String _V3_PRIVACY_PASSPHRASE = "dontKnowThisEither";
@Override
public void processPdu(CommandResponderEvent crEvent) {
PDU pdu = crEvent.getPDU();
System.out.println("THE TYPE OF THE PDU: " + pdu.getType());
if (pdu.getType() == PDU.V1TRAP) {
PDUv1 pduV1 = (PDUv1) pdu;
System.out.println("");
System.out.println("===== NEW SNMP 1 TRAP RECEIVED ====");
System.out.println("agentAddr " + pduV1.getAgentAddress().toString());
System.out.println("enterprise " + pduV1.getEnterprise().toString());
System.out.println("timeStam" + String.valueOf(pduV1.getTimestamp()));
System.out.println("genericTrap" + String.valueOf(pduV1.getGenericTrap()));
System.out.println("specificTrap " + String.valueOf(pduV1.getSpecificTrap()));
System.out.println("snmpVersion " + String.valueOf(PDU.V1TRAP));
System.out.println("communityString " + new String(crEvent.getSecurityName()));
} else if (pdu.getType() == PDU.TRAP) {
System.out.println("");
System.out.println("===== NEW SNMP 2/3 TRAP RECEIVED ====");
System.out.println("errorStatus " + String.valueOf(pdu.getErrorStatus()));
System.out.println("errorIndex " + String.valueOf(pdu.getErrorIndex()));
System.out.println("requestID " + String.valueOf(pdu.getRequestID()));
System.out.println("snmpVersion " + String.valueOf(PDU.TRAP));
System.out.println("communityString " + new String(crEvent.getSecurityName()));
} else {
System.out.println("Received a strange type of PDU " + pdu.getType());
}
Vector<? extends VariableBinding> varBinds = pdu.getVariableBindings();
if (varBinds != null && !varBinds.isEmpty()) {
Iterator<? extends VariableBinding> varIter = varBinds.iterator();
StringBuilder resultset = new StringBuilder();
resultset.append("-----");
while (varIter.hasNext()) {
VariableBinding vb = varIter.next();
String syntaxstr = vb.getVariable().getSyntaxString();
int syntax = vb.getVariable().getSyntax();
System.out.println("OID: " + vb.getOid());
System.out.println("Value: " + vb.getVariable());
System.out.println("syntaxstring: " + syntaxstr);
System.out.println("syntax: " + syntax);
System.out.println("------");
}
}
System.out.println("==== TRAP END ===");
System.out.println("");
}
public synchronized void listen(TransportIpAddress address) throws IOException {
AbstractTransportMapping transport;
if (address instanceof TcpAddress) {
transport = new DefaultTcpTransportMapping((TcpAddress) address);
} else {
transport = new DefaultUdpTransportMapping((UdpAddress) address);
}
ThreadPool threadPool = ThreadPool.create("DispatcherPool", 10);
MessageDispatcher mtDispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());
USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0); // maybe the issue is here?
usm.setEngineDiscoveryEnabled(true);
// add message processing models
mtDispatcher.addMessageProcessingModel(new MPv1());
mtDispatcher.addMessageProcessingModel(new MPv2c());
mtDispatcher.addMessageProcessingModel(new MPv3(usm));
// add all security protocols
SecurityProtocols.getInstance().addDefaultProtocols();
// SecurityProtocols.getInstance().addPrivacyProtocol(new PrivAES128());
SecurityModels.getInstance().addSecurityModel(usm);
// Create Target
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
Snmp snmp = new Snmp(mtDispatcher, transport);
UsmUser usmUser = new UsmUser(new OctetString("newUser"), AuthSHA.ID,
new OctetString(_V3_AUTHENTICATION_PASSPHRASE), PrivAES128.ID, new OctetString(_V3_PRIVACY_PASSPHRASE));
snmp.getUSM().addUser(new OctetString(_V3_USERNAME), usmUser); // or here
snmp.addCommandResponder(this);
transport.listen();
System.out.println("Listening on " + address);
try {
this.wait();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
1 ответ
V3 немного сложнее, так как в моем случае требовался зарегистрированный пользователь, у меня был пользователь без учетных данных, поэтому мне пришлось изменить следующее
USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
в
USM usm = new USM(SecurityProtocols.getInstance(), new OctetString("Receiver"), 0);
UsmUser был определен правильно
Надеюсь, это поможет кому-то