Почему агент snmp не принимает resquest при получении snmp4j, когда net-snmp get возвращает событие ответа - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь написать свой первый клиент snmp4j.У меня есть агент, работающий на 192.168.60.105.Используя net-snmp, я могу запросить OID и получить результат.При использовании smnp4j событие ответа для получения snmp возвращается с нулевым ответом и нулевой ошибкой.Я думаю, что сообщение истекло, но я не знаю почему.

Я получаю результат, используя net-snmp

jgaer@ljgaer2_~: snmpget 192.168.60.105 .1.3.6.1.4.1.27675.20.5.2.0
CW-NET-STG-SVR-MIB::cwNetStgSvrProvisioningEnable.0 = Hex-STRING: 00 00 00 00 

Я пытался использовать более длительное время ожидания и большее числоповторов, и это займет больше времени, чтобы вернуться.Вот почему я думаю, что время истекло.Я просто не понимаю почему.Я также ожидал бы, что если responseEvent возвращается по таймауту, ошибка будет указывать на это.Я пытался использовать verions1.Для использования версии 3 требуется PDU с областью действия.

public static void main(String[] args) throws IOException {
        String address = ("udp:192.168.60.105/161");
        TransportMapping transport = new DefaultUdpTransportMapping();
        Snmp snmp = new Snmp(transport);
        transport.listen();
        PDU pdu = new PDU();
        pdu.setType(PDU.GET);
        pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.27675.20.5.2.0")));
        Address targetAddress = GenericAddress.parse(address);
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));
        target.setAddress(targetAddress);
        target.setRetries(2);
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version2c);
        ResponseEvent response = snmp.send(pdu,target);
        System.out.println(response);
        System.out.println(response.getResponse());
        System.out.println(response.getError());

    }

в результате выполнения вышеуказанного кода

org.snmp4j.event.ResponseEvent[source=org.snmp4j.Snmp@3f91beef]
null
null

Я ожидаю, что либо ошибка, либо ответ будут ненулевыми.Я использую Java-версию Java версии "1.8.0_191" и snmp4j версии 2.5.0.Агент работает 2.5.3

Я проследил пакеты, используя wireshark, и могу подтвердить, что я никогда не получаю ответ от агента, использующего snmp4j. Я не совсем понимаю достаточно протокола, чтобы сделать байтсравнение байтов, но информационный столбец для вызова net-snmp сильно отличается от вызовов snmp4j.

net-snmp

 length       info           
 106          get-request                      : sent from client to agent
 159          report 1.3.6.1.6.3.15.1.1.4.0    : sent from agent to client
 192          encryptedPDI : privKey unknown   : sent from client to agent
 196          encryptedPDI : privKey unknown   : sent from agent to client

snmp4j - ответ никогда не получал три сообщения от клиента агенту

 89          get-request 1.3.6.1.4.1.27675.20.5.2.0 sent from client to agent

Глядя на текстовую версию байтов, я вижу строку 'public'

1 Ответ

0 голосов
/ 27 марта 2019

Проблема была в том, что агент был SNMPv3, требующий от меня использования ScopedPDU с некоторой информацией авторизации. Пользователь и парольные фразы были получены из файла ~ / .snmp / snmp.conf. Теперь я подключаюсь и получаю ответ от агента. Код показан ниже. Я получаю не правильное значение, а счетчик того, сколько я получил. Но это еще одна проблема.

Вторая проблема заключалась в использовании неправильных значений для authProtocol и privProtocol. Извлеченный урок проверяет тип ответа pdu в дополнение к проверке errorResponse. Тип ответа отчета указывает на сбой, при этом OID отчета является ключом к причине сбоя.

public static void main(String[] args) throws Exception {
        TransportMapping transport = new DefaultUdpTransportMapping();
        Snmp snmp = new Snmp(transport);

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

        OctetString securityName = new OctetString("masked");
        OID authProtocol = AuthMD5.ID;
        OID privProtocol = PrivDES.ID;
        OctetString authPassphrase = new OctetString("masked");
        OctetString privPassphrase = new OctetString("masked");

        snmp.getUSM().addUser(securityName, new UsmUser(securityName, authProtocol, authPassphrase, privProtocol, privPassphrase));


        UserTarget target = new UserTarget();
        target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
        target.setSecurityName(securityName);

        target.setAddress(GenericAddress.parse(String.format("udp:%s/%s", "192.168.60.105", "161")));
        target.setVersion(SnmpConstants.version3);
        target.setRetries(2);
        target.setTimeout(60000);
        transport.listen();

        PDU pdu = new ScopedPDU();
        pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.27675.20.10.1.2.0")));
        pdu.setType(PDU.GET);
        ResponseEvent event = snmp.send(pdu, target);
        if (event != null) {
            PDU pdu2 = event.getResponse();
            System.out.println(pdu2.get(0).getVariable().toString());
            if (pdu2.getErrorStatus() == PDU.noError) {
                System.out.println("SNMPv3 GET Successful!");
            } else {
                System.out.println("SNMPv3 GET Unsuccessful.");
            }
        } else {
            System.out.println("SNMP get unsuccessful.");
        }

}
...