linux下snmp4j获取net-snmp的基本信息

java 专栏收录该内容
4 篇文章 0 订阅

linux下,net-snmp已经提供了完整的snmp服务和框架,尤其是基本的snmp信息,如sysObjectId、CPU、内存等。通过标准的snmp的oid,可以很容易的从net-snmp所提供的服务中获取这些信息。但net-snmp的trap功能需要通过脚本来配置和实现,这对于很多做web或java开发的人来说,比较陌生。借助snmp4j,很多熟悉java的人,可以快速的实现基于snmp4j的trap功能。

trap就是基于snmp的agent,运行在被检测的服务器节点上,检测所需要的服务运行状态,当某些指标超过所配置的告警指标,就自动想所配置的网管汇报告警信息。
通常情况下,对于不同的agent,网管中会有独立的标识,也即是sysObjectId。网管与agent之间也会保持心跳信息。net-snmp提供了基本的心跳服务。在心跳信息中,会包含sysObjectId,如果是V3协议,还需要在所有通讯交互的协议头中包含msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime,这些信息,snmp4j默认是不对外提供的,也就是没有现成的接口供我们使用(至少目前我没找到,如果有人找到了,告诉我一下)。
msgAuthoritativeEngineID:是trap的ID,唯一标识一个trap,网管通过该值区分不同的trap。该值可以通过net-snmp的配置文件中配置,如在snmpd.conf中增加一下配置项:
oldEngineID 0x8000bee9043133363134313438383733
oldEngineID为配置项名称,固定。
0x8000bee9043133363134313438383733的编码有固定格式,第一个字节0x80表示协议版本号为V3;00bee9是企业ID号,也就PEN号码,04表示EngineID的产生方式,04为配置方式,80为随机生成方式;后面3133363134313438383733为ASCII编码的数字,对应为13614148873。
msgAuthoritativeEngineBoots:是trap服务启动的次数,net-snmp自动提供该值,但snmp4j获取的话,需要特别方式,下面有介绍。
msgAuthoritativeEngineTime:trap本次运行的时间,net-snmp也会自动提供该值。
网管与trap之间通信,会自动进行协商,并从trap上获取上述信息,请看下面的抓包分析:

 请求消息中,msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime值都是空的。接下来看服务器对该请求的返回消息:

 

应答消息中自动携带了请求中为空的消息的值。接下来真正交互时(请求oid:1.3.6.1.2.1.1.2.0),就要携带这些参数:

 

再看服务器的返回消息:

 

服务器正确的返回了我们所请求的企业ID。
如果我们用snmp4j想服务器发送同样的请求消息,从抓包分析可以看出,snmp4j后台也会与服务器进行同样的信息交换,那我们如果基于snmp4j构建自动的trap时,如何在发送trap消息时获取到所需要的这三个信息呢?如何在trap消息头上添加上这样的信息呢?
首先,我们先来看看org.snmp4j.security下面的USM类,主要看下processIncomingMsg方法。
该方法就是snmp4j后台与服务器交互时,处理从服务器返回消息的方法,securityParameters参数就是存放了从服务器端接收到的消息,因此,只要我们把该对象抛到外面,我们就可以获取到服务器所返回给我们的信息。
因此,我们需要修改USM类,增加一个变量,保存securityParameters信息,并提供一个get方法获取即可。
如:
private UsmSecurityParameters myUsp;

 

public UsmSecurityParameters getMyUsp() {
return myUsp;
}
这样,在用snmp4j向服务器发送PDU请求后,只要服务器返回了消息,我们就可以从Snmp句柄的USM对象中获取到服务器返回的信息。

 

这样我们就可以通过snmp4j顺利的获取到服务器端返回的msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime值。
有了上述的参数值,在发送trap消息时,就可以添加到snmp消息协议头中了。
snmp.getUSM().setEngineDiscoveryEnabled(true);
UsmTimeEntry usmTimeEntry = new UsmTimeEntry(engineID,bootTimes,engineTime);
snmp.getUSM().getTimeTable().addEntry(usmTimeEntry);
engineID,bootTimes,engineTime为从服务器端获取到底msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime参数对应的值。
通过USM的TimeTable中增加UsmTimeEntry参数,就可以设置msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime参数的值。
至此,我们就完成了通过修改snmp4j的源码来获取net-snmp所提供的V3协议交互中所必须的参数,并在发送trap消息时,正确设置协议头中的参数。
有关snmp4j如何发送V3协议的trap消息,就不罗嗦了。如果需要,请留言。
  • 1
    点赞
  • 4
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值