SNMP4J CommandResponder не получает ловушки V3 - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь реализовать прослушиватель 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 Ответ

0 голосов
/ 05 января 2019

V3 немного сложнее, так как для этого требуется зарегистрированный пользователь в моем случае у меня был пользователь без учетных данных поэтому мне пришлось изменить следующее

USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);

до

USM usm = new USM(SecurityProtocols.getInstance(), new OctetString("Receiver"), 0);

UsmUser был определен правильно

Надеюсь, это кому-нибудь поможет

...