我将实现客户端/代理设置,以学习使用
SNMP。我想使用SNMPv3和authPriv作为安全级别建立安全和加密的通信。
这是我的设置:

代理
该代理在Ubuntu上运行(在Docker镜像内)。要进行设置,我遵循了this tutorial
我的/etc/snmp/snmpd.conf看起来像这样:

agentAddress udp:161
...
createUser authOnlyUser MD5 "test1234"
createUser authPrivUser SHA "test1234" DES
createUser internalUser MD5 "test1234"
...
rouser authOnlyUser
rwuser authPrivUser authPriv

SNMP在端口161上运行,该端口由Docker转发到端口1025

客户
我可以使用以下方法确保我的代理正常工作

同一台机器上的
  • snmpget(Ubuntu,在Docker中):snmpget -v3 -a SHA -A test1234 -X test1234 -l authPriv -u authPrivUser localhost 1.3.6.1.2.1.1.1.0
  • 远程计算机(Debian)上的
  • snmpget:snmpget -v3 -u authPrivUser -X test1234 -A test1234 -l authPriv -x DES -a SHA <HOST-IP>:1025 1.3.6.1.2.1.1.1.0
  • 使用SNMP-Tester

  • 在所有三种情况下,我都会获得给定OID的期望值:Linux 9b98a8808b1a 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64

    现在,我想使用latest version 3.2.2 of snmp4j用Java实现一个Client。这是我实现的:

    public class SNMPTestClient {
    
        public static void main(String[] args) throws Exception {
            // enable logging
            ConsoleLogFactory consoleLogFactory = new ConsoleLogFactory();
            consoleLogFactory.getRootLogger().setLogLevel(LogLevel.DEBUG);
            LogFactory.setLogFactory(consoleLogFactory);
    
            TransportMapping<? extends Address> transport = new DefaultUdpTransportMapping();
            Snmp snmp = new Snmp(transport);
    
            // create and add user security model
            OctetString localEngineId = new OctetString(MPv3.createLocalEngineID());
            USM usm = new USM(SecurityProtocols.getInstance(), localEngineId, 0);
            SecurityModels.getInstance().addSecurityModel(usm);
    
            // user credentials
            OctetString securityName = new OctetString("authPrivUser");
            OctetString authPassphrase = new OctetString("test1234");
            OctetString privPassphrase = new OctetString("test1234");
            OID authProtocol = AuthSHA.ID;
            OID privProtocol = PrivDES.ID;
    
            UsmUser usmUser = new UsmUser(securityName, authProtocol, authPassphrase, privProtocol, privPassphrase);
            snmp.getUSM().addUser(securityName, usmUser);
    
            // create target
            UserTarget target = new UserTarget();
            target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
            target.setSecurityName(securityName);
            target.setAddress(GenericAddress.parse("udp:127.0.0.1/1025"));
            target.setVersion(SnmpConstants.version3);
            target.setRetries(3);
            target.setTimeout(10000);
    
            transport.listen();
    
            ScopedPDU pdu = new ScopedPDU();
            pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.1.0")));
            pdu.setType(PDU.GET);
            ResponseEvent event = snmp.send(pdu, target);
            if (event != null) {
                System.out.println(event.getUserObject());
                System.out.println(event.getError());
                System.out.println(event.getPeerAddress());
                PDU responsePDU = event.getResponse();
                System.out.println(responsePDU.getErrorStatus());
                System.out.println(responsePDU.getErrorIndex());
                if (responsePDU.getErrorStatus() == PDU.noError) {
                    for (int k = 0; k < responsePDU.size(); k++) {
                        VariableBinding vb = responsePDU.get(k);
                        if (vb != null) {
                            System.out.println(vb.getOid() + "-" + vb.getVariable().toString());
                        }
                    }
                } else {
                    System.out.println("SNMP Error:" + responsePDU.getErrorStatusText());
                }
            } else {
                System.out.println("SNMP send unsuccessful.");
            }
        }
    }
    

    如您所见,我正在使用与上述相同的凭据和协议(protocol)。但是当我运行它时,我收到以下异常:org.snmp4j.MessageException: Message processing model 3 returned error: Unsupported security level
    我在这里做错了什么?由于用户authPrivUser已配置为使用代理端的authPriv安全级别,并且我还在客户端中将级别设置为AUTH_PRIV并传递了正确的凭据,所以我不知道为什么抛出此异常。

    在此先感谢您的支持和提示!

    编辑
    我发现上面发布的代码确实可以在SNMP4J v2.7.0中使用。任何> = 3.0.0的版本都会引发错误Unsupported security level。不幸的是,使用2018年11月之后的旧版本无法解决问题...

    最佳答案

    在SNMP4J 3.x中,默认情况下不再将安全协议(protocol)AuthSHA(和AuthMD5)添加到静态SecurityProtocols实例,因为它们现在被认为是不安全的。

    您可以通过调用以下命令再次添加它:

    SecurityProtocols.addAuthenticationProtocol(new AuthSHA());
    

    08-27 10:18