0

ここ数日、Auth と priv フレーズを使用して SNMPV3 トラップを送信するのに苦労しています。これが私のコードです。

トラップレシーバー

private void init() throws UnknownHostException, IOException {
        threadPool = ThreadPool.create("Trap", 10);
        dispatcher = new MultiThreadedMessageDispatcher(threadPool,
                new MessageDispatcherImpl());
        listenAddress = GenericAddress.parse(System.getProperty(
                "snmp4j.listenAddress", "udp:0.0.0.0/165"));
        TransportMapping<?> transport;
        if (listenAddress instanceof UdpAddress) {
            transport = new DefaultUdpTransportMapping(
                    (UdpAddress) listenAddress);
        } else {
            transport = new DefaultTcpTransportMapping(
                    (TcpAddress) listenAddress);
        }
        USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
                MPv3.createLocalEngineID()), 0);
        usm.setEngineDiscoveryEnabled(true);

        snmp = new Snmp(dispatcher, transport);
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3(usm));
        SecurityModels.getInstance().addSecurityModel(usm);
        snmp.getUSM().addUser(  new OctetString("MD5DES"),
                new UsmUser(new OctetString("karthikprasad"), AuthMD5.ID,
                        new OctetString("UserName"), PrivDES.ID,
                        new OctetString("PasswordUser")));
        snmp.getUSM().addUser(new OctetString("MD5DES"),
                new UsmUser(new OctetString("MD5DES"), null, null, null, null));

        snmp.listen();
}

トラップ送信者

private static void sendSnmpV3Trap() {
        try {
            long start = System.currentTimeMillis();
            Address targetAddress = GenericAddress.parse("udp:" + ipAddress
                    + "/" + port);

            // Create Transport Mapping
            TransportMapping<?> transport = new DefaultUdpTransportMapping();
            Snmp snmp = new Snmp(transport);
            USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
                    MPv3.createLocalEngineID()), 0);
            SecurityModels.getInstance().addSecurityModel(usm);
            transport.listen();

            snmp.getUSM().addUser(  new OctetString("MD5DES"),
                    new UsmUser(new OctetString("karthikprasad"), AuthMD5.ID,
                            new OctetString("UserName"), PrivDES.ID,
                            new OctetString("PasswordUser")));

            // Create Target
            UserTarget target = new UserTarget();
            target.setAddress(targetAddress);
            target.setRetries(1);

            // set timeout
            target.setTimeout(11500);
            target.setVersion(SnmpConstants.version3);
            target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
            target.setSecurityName(new OctetString("karthikprasad"));
            target.setSecurityModel(SecurityModel.SECURITY_MODEL_USM);

            // Create PDU for V3
            ScopedPDU pdu = new ScopedPDU();
            pdu.setType(ScopedPDU.NOTIFICATION);

            // need to specify the system up time
            long sysUpTime = (System.currentTimeMillis() - start) / 10;
            pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(
                    sysUpTime)));
            pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID,
                    SnmpConstants.linkDown));
            pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.1.1"),
                    new Integer32(1)));

            // Send the PDU
            System.out.println("Sending V3 Trap to " + ipAddress + " on Port "
                    + port);
            snmp.send(pdu, target);
            snmp.addCommandResponder(new CommandResponder() {
                @Override
                public void processPdu(CommandResponderEvent arg0) {
                    System.out.println(arg0);
                }
            });
            snmp.close();
        } catch (Exception e) {
            System.err.println("Error in Sending V2 Trap to " + ipAddress
                    + " on Port " + port);
            System.err.println("Exception Message = " + e.getMessage());
        }
    }

noauthand nopriv を設定すると正常に動作します。しかし、authpriv に設定すると、トラップ メッセージが表示されません。デバッグを有効にしても、送信者でエラーが発生しません。ファイルを別のマシンにコピーしてレシーバーを実行し、wireshark を使用してトラップと監視対象のネットワークを送信しようとしましたが、メッセージが宛先サーバーに送信されていることを確認できましたが、レシーバーに渡されませんでした。復号化中に何らかの問題が発生していると思います。誰か助けてくれませんか?ところで、私はjdk 6 update 32を使用しています。

4

3 に答える 3

1

snmp v3 トラップ レシーバの動作例

private synchronized void startTrapReceiver() throws UnknownHostException,
            IOException {
    ThreadPool threadPool = ThreadPool.create("DispatcherPool", 10);

    Address listenAddress = new UdpAddress("localhost/162");
    TransportMapping transport;
    if (listenAddress instanceof UdpAddress) {
        transport = new DefaultUdpTransportMapping(
                (UdpAddress) listenAddress);
    } else {
        transport = new DefaultTcpTransportMapping(
                (TcpAddress) listenAddress);
    }
    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
            MPv3.createLocalEngineID()), 0);
    usm.setEngineDiscoveryEnabled(true);

    MessageDispatcher mDispathcher = new MultiThreadedMessageDispatcher(
            threadPool, new MessageDispatcherImpl());

    // add message processing models
    mDispathcher.addMessageProcessingModel(new MPv1());
    mDispathcher.addMessageProcessingModel(new MPv2c());
    mDispathcher.addMessageProcessingModel(new MPv3(usm));
    // add all security protocols
    SecurityProtocols.getInstance().addDefaultProtocols();
    SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES());

    SecurityModels.getInstance().addSecurityModel(usm);

    CommunityTarget target = new CommunityTarget();

    target.setCommunity(new OctetString("public"));

    Snmp snmp = new Snmp(mDispathcher, transport);

    snmp.getUSM().addUser(
            new OctetString("MD5DES"),
            new UsmUser(new OctetString("saikrishna"), AuthMD5.ID,
                    new OctetString("saikrishnapassword"), PrivDES.ID,
                    new OctetString("PasswordUser")));
    snmp.addCommandResponder(this);

    transport.listen();
    System.out.println("listening");
    try {
        this.wait();
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
}

public synchronized void processPdu(CommandResponderEvent cmdRespEvent) {
    System.out.println("Received PDU...");
    PDU pdu = cmdRespEvent.getPDU();
    if (pdu != null) {
        System.out.println("Trap Type = " + pdu.getType());
        System.out.println("Variables = " + pdu.getVariableBindings());
    }
}
于 2015-06-26T10:10:42.047 に答える
0

SNMPv3 は設定が難しいです。SNMP4j の上でhttp://friendlysnmp.orgを使用してみてください。FriendlySNMP は、v2c および v3 を含むすべての SNMP バージョンをサポートします。

于 2014-03-27T16:42:16.573 に答える