为什么 snmp 代理不接受 snmp4j 获取的请求,当 net-snmp 获取 returns 响应事件时
Why is snmp agent not accepting resquest on an snmp4j get, when net-snmp get returns a response event
我正在尝试编写我的第一个 snmp4j 客户端。我在 192.168.60.105 上有一个代理 运行。使用 net-snmp 我可以查询 OID 并获得结果。使用 smnp4j,snmp get 的响应事件是 returned,带有空响应和空错误。我认为消息超时,但我不知道为什么。
我使用 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
我试过使用更长的超时时间和更多的重试次数,但 return 需要更长的时间。这就是为什么我认为我超时了。我只是不明白为什么。我还期望如果 responseEvent 在超时时被 returned,则错误将表明这一点。我试过使用 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.I 从代理那里得到响应我对协议的了解还不够,无法进行逐字节比较,但是信息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'
问题是代理是 SNMPv3,要求我使用带有一些授权信息的 ScopedPDU。用户和密码短语是从 ~/.snmp/snmp.conf 文件中获得的。我现在正在连接到代理并得到代理的响应。代码如下所示。我没有得到正确的值,而是计算了我发出了多少次。但那是另一个问题。
第二个问题是对 authProtocol 和 privProtocol 使用了错误的值。
除了检查 errorResponse 之外,经验教训还检查响应的 pdu 类型。响应类型的报告指示失败,报告的 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.");
}
}
我正在尝试编写我的第一个 snmp4j 客户端。我在 192.168.60.105 上有一个代理 运行。使用 net-snmp 我可以查询 OID 并获得结果。使用 smnp4j,snmp get 的响应事件是 returned,带有空响应和空错误。我认为消息超时,但我不知道为什么。
我使用 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
我试过使用更长的超时时间和更多的重试次数,但 return 需要更长的时间。这就是为什么我认为我超时了。我只是不明白为什么。我还期望如果 responseEvent 在超时时被 returned,则错误将表明这一点。我试过使用 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.I 从代理那里得到响应我对协议的了解还不够,无法进行逐字节比较,但是信息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'
问题是代理是 SNMPv3,要求我使用带有一些授权信息的 ScopedPDU。用户和密码短语是从 ~/.snmp/snmp.conf 文件中获得的。我现在正在连接到代理并得到代理的响应。代码如下所示。我没有得到正确的值,而是计算了我发出了多少次。但那是另一个问题。
第二个问题是对 authProtocol 和 privProtocol 使用了错误的值。 除了检查 errorResponse 之外,经验教训还检查响应的 pdu 类型。响应类型的报告指示失败,报告的 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.");
}
}