为什么snmpv3使用不存在的OID成功返回PDU?

时间:2016-08-09 03:39:41

标签: snmp snmp4j

当我使用SNMP4J模拟snmpv3的GET PDU时,我发现尽管我在变量绑定列表中添加了一个不存在的OID,但我仍然得到了有效的响应。
但是当协议时版本 v1 我收到错误代码2 ,表示没有这样的名称'。
当协议版本为 v2c 时,我没有获得错误,并且返回的vb列表大小为1,并且列表(0)变量绑定' s语法是异常,这意味着"没有这样的对象"。
因此我可以在使用v1或v2c时弄清楚它是否存在,但是当它的v3时,我得到了以下响应:

<!doctype html>
<html ng-app="sortApp">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-animate.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.0.1/ui-bootstrap-tpls.min.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
</head>

<body ng-controller="mainController">
  <div class="col-md-12">
    <input type="text" ng-model="selected" uib-typeahead="c.country for c in countries | filter:$viewValue | limitTo:8" class="form-control">
    <pre ng-bind-template="Model: {{selected | json}}"></pre>
  </div>
</body>

</html>

** xx是一个数字。

代码是:

SNMP-USER-BASED-SM-MIB::usmStatsUnknownEngineIDs.0 = Counter32: xx

所以我的问题是:
(1)v3的这种行为是否正确实现?为什么我没有得到某种错误?
(2)如何使用SNMP4J测试OID是否存在?

2 个答案:

答案 0 :(得分:1)

您正在接收所谓的 SNMP REPORT PDU 。会发生什么情况是代理从管理器接收请求PDU并确定缺少某些重要的安全属性,如engine_idengine_bootsengine_time,并发回一个REPORT以通知管理员。管理员应完全按照https://tools.ietf.org/html/rfc5343中详细描述的所谓SNMP引擎发现程序处理REPORT PDU。

答案 1 :(得分:0)

对于问题1,当我设置securityName&amp; userTarget的securityLevel,它工作正常。

        userTarget.setSecurityName(new OctetString(_V3_USERNAME));
        userTarget.setSecurityLevel(SecurityLevel.AUTH_PRIV);

对于问题2,它与版本1&amp; 2c现在。

参考:rfc3414:

  

3)如果msgAuthoritativeEngineID字段的值在       securityParameters是未知的:       a)执行发现的非权威SNMP引擎可以          可选地在其本地配置中创建新条目          数据存储(LCD)并继续处理;   要么       b) usmStatsUnknownEngineIDs计数器递增,并且          错误指示(unknownEngineID)与OID和          递增计数器的值返回给调用          模块。