我正在尝试使用 SNMP4J 在 Java 中创建一个 SNMP TRAP/Notify 代理。陷阱/通知旨在发送到远程侦听器。
我想通过身份验证添加对 V2 和 V3 陷阱的支持。
我目前的设置:
运行通知程序的开发机器。(192.168.1.61)
运行 snmptrapd 的 debian 9(Stretch) (192.168.1.92) 上的 VM
我的问题简短地描述了:
- V2 消息有效。
- 从 Java 发送时,V3 消息被接收但不被处理。
我已经使用以下命令尝试了我的设置,确认它有效:
虚拟机:
sudo snmptrapd -f -Lo -c /usr/share/snmpdtrapd.conf
开发:
sudo snmptrap -e 0x80001370017f000101 -v 3 -a SHA -A 02m-auth -x DES -X o2m-priv -l authPriv o2m-user 192.168.1.92:162 1 .1.3.6.1.2.1.1.8
在 VM 上,它会生成以下日志消息:
2018-10-29 14:42:21 <UNKNOWN> [UDP: [192.168.1.61]:44309->
[192.168.1.92]:162]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-MIB::sysORLastChange
现在我运行了以下代码,并确认它到达了 VM(运行 snmptrapd 命令并启用 -d 以查看 snmp 数据包实际到达)
TransportMapping transportMapping = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transportMapping);
OctetString localEngineId = new OctetString(MPv3.createLocalEngineID());
USM usm = new USM(SecurityProtocols.getInstance(), localEngineId, 0);
SecurityModels.getInstance().addSecurityModel(usm);
OctetString securityName = new OctetString("o2m-user");
OID authProtocol = AuthSHA.ID;
OID privProtocol = PrivDES.ID;
OctetString authPassphrase = new OctetString("o2m-auth");
OctetString privPassphrase = new OctetString("o2m-priv");
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(new UdpAddress("192.168.1.92" + "/" + 162));
target.setVersion(SnmpConstants.version3);
snmp.listen();
ScopedPDU pdu = new ScopedPDU();
pdu.setType(PDU.TRAP);
pdu.setContextEngineID(localEngineId);
pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(1)));
pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID(".1.3.6.1.2.1.1.8")));
System.out.println("Sending V3 trap");
snmp.send(pdu, target);
snmp.close();
上面的代码不会在 snmptrapd 服务器上生成任何日志消息。
我也尝试用MPv3.createLocalEngineId()
实际的引擎 ID 替换,但这似乎也没有帮助。
我已经 Wireshark 了这两个请求(来自 JAVA 和来自 snmp-trap),我注意到的唯一区别是它们都有不同的 AuthorativeEngineID。
Java 有一个生成的,因为它在每个请求上都不同,snmp-trap 有一个静态的。
我究竟做错了什么?