资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
浅谈Linux中开发SNMP TrapSNMP Trap 是一种标准的报告机制,广泛应用在各种网络管理软件中。本文详细介绍了 SNMP Trap 的基本概念,以及 Linux 下面 net-snmp 对SNMP Trap的开发与应用。1. SNMP Trap简介SNMP简单网络管理协议(Simple Network Management Protocol)是一种应用层协议,是TCP/IP协议族的一部分。它使网络设备之间能够方便地交换管理信息。能够让网络管理员管理网络的性能,发现和解决网络问题及进行网络的扩充。SNMP Trap 是 SNMP 的一部分,当被监控段出现特定事件,可能是性能问题,甚至是网络设备接口宕掉等,代理端会给管理站发告警事件。假如在特定事件出现的时刻,不是由 Agent 主动通知 NMS(Network Management Station ),那么 NMS 必须不断地对 Agent 进行轮询。这是非常浪费计算资源的方法,正如人们用中断通知 CPU 数据的到达,而不是让 CPU 进行轮询一样。Trap 通知是更加合理的选择。总的来说,SNMP Trap 就是被管理设备主动发送消息给 NMS 的一种机制。 2. SNMP Trap报文Trap PDU不同于其他类型的PDU格式,Trap PDU包含的部分都是为描述事件而定义的,见下图所示:PDUenterpriseagent-addrgeneric-trapspecific-traptime- stampvar-list各部分的解释如下:enterprise:企业标识、对象标识。agent-addr:产生Trap的被管理设备的地址。generic-trap:用于识别Trap的类型,取值0-6,6代表特殊代码的扩展。specific-trap:与generic-trap一起标识扩展Trap类型。time-stamp:时间戳,系统从上次启动到产生该Trap的系统时间。var-list:绑定的对象标识-值等数据。3. 设计一个 Trap 消息Trap 消息也是用 MIB 来定义的。在下面的例子中,我们定义了一个 Trap 消息:fxPortReset、fxPortResetOK。树型结构如下:fxBMDevTrap . 1.3.6.1.4.1.33619.10.3.1.52 +-fxBMDevAlarm . 1.3.6.1.4.1.33619.10.3.1.52.1 +-fxBMPortAlarm . 1.3.6.1.4.1.33619.10.3.1.52.1.1 |-fxPortReset . 1.3.6.1.4.1.33619.10.3.1.52.1.1.1 |-fxPortResetOK . 1.3.6.1.4.1.33619.10.3.1.52.1.1.2fxPortReset、fxPortResetOK被定义为 NOTIFICATION类型,即 SNMPv2 类型的 Trap。4. SNMP Trap的实现把定义的MIB命名为fxBMDevTrap.txt,利用mib2c.notify.conf配置文件,生成fxBMDevTrap.c和fxBMDevTrap.h。此生成方法参照mib2c工具的使用。由模版生成的文件,不论哪种对象,都会有固定模式的整体结构。在模版文件中对节点进行定义,函数定义。处理函数,用来处理代理端所要发送的数据,数据的添加就是我们要手工实现的。我们所要做的工作就是把所需上报的数据导入到其中。模版是针对单个变量来处理的:1) Trap处理函数int send_fxPortReset_trap( void )其实现主要为: snmp_varlist_add_variable(&var_list, snmptrap_oid, OID_LENGTH(snmptrap_oid), ASN_OBJECT_ID, fxPortReset_oid, sizeof(fxPortReset_oid);首先添加trap对象,指定告警的对象为fxPortReset。如果trap需要根据情况绑定数据,以提供更多事件信息,可继续添加数据到链表,也可指定绑定数据的对象标识符。 snmp_varlist_add_variable(&var_list, fxBMPortIndex_oid, OID_LENGTH(fxBMPortIndex_oid), ASN_INTEGER, (u_char *)&temp, sizeof(temp);如果有多组数据绑定,就要简单重复调用snmp_varlist_add_variable 函数,因此链表var_list包含了指定类型的数据。一个 SNMP Trap创建成功后,调用相应的API将其发送出去即可: send_v2trap( var_list );最后需要做清理工作,代码如下: snmp_free_varbind( var_list );具体可参考源代码包agentmibgroupexamples下的notification.c和notification.h文件。2) Trap的触发SNMP Trap是由Agent主动发出,NMS不对Trap做响应。当某个事件发生时,就会发送Trap消息。因此在事件触发时,可以调用上面的Trap处理函数发送。相应地事件调用相应的事件处理函数,例如:在端口重启时就可以调用send_fxPortReset_trap(),来发送PortReset的Trap。3) SNMP_TRAP_API关于SNMP Trap的发送,NET-SNMP给出了三个api函数:send_easy_trap, send_trap_vars, send_v2trap。send_easy_trap: 发送SNMPv1和SNMPv2标准的Trap消息;send_trap_vars: 发送可添加绑定数据的Trap消息;send_v2trap: 支持绑定数据的SNMPv2扩展Trap。参照源码,send_easy_trap和send_v2trap最终都是调用send_trap_vars,只是传递参数不同而已。5. NET-SNMP Trap实现1) NET-SNMP Trap配置我们将生成的XXX.c和XXX.h静态编译到snmpd进程中,Trap的发送还需指定管理端地址和端口。在配置文件中,添加下面关键字:authtrapenable 1 /打开trap自动告警的开关,1代表开启、2代表关闭trapsink host community port /指定trap发送的地址、共同体和端口共同体和端口可以不指定,默认为public和162。SNMPv2的Trap关键字为trap2sink。2) SNMP Trap查看MG-SOFT管理软件可以接收Trap消息,启动MIB Browser-Tools-Trap Ringer Console。在显示面板上可以查看接收到Trap的发送端、接收端、时间、共同体、协议版本、对象以及绑定的数据等信息。SNMP Trap分两大类:标准Trap、扩展Trap。标准Trap: generic字段标示Trap类型,specific字段为0,Time字段表示从snmpd启动到Trap发生所经历的时间,enterprise标示对象sysObjectID的值。扩展Trap: generic字段均为6,enterprise和specific在Trap定义中给出,扩展的 Trap 通常是由以下几个部分连接而成:enterprise + 0 + specific trap。可由enterprise和specific一起来判断该Trap对象,其他与标准Trap相同。3) 其他问题当开启MG-SOFT软件的Trap Ringer Console工具时,往往出现绑定162端口出错,可能原因是162端口已经被占用。解决方法有两种:a) 禁用服务,打开Windows下的本地服务,禁用windows自己的SNMP Trap功能,开启MG-SOFT SNMP Trap Service。b) 修改端口,打开MIB Browser-View-MIB Browser Preferences,设置Trap Ringer下的Ports,这里默认用的是162,我们也可以改成其他未使用的端口。同样地,snmpd的配置文件中trapsink也要指定相同地端口。总结本文只关注SNMP Trap 的相关概念和开发方法。虽然 SNMP Trap能简单地创建而且轻松地发送到指定管理端,但似乎这并不是重点,关键地事件什么时候发生,以及事件发生后如何通知snmpd进程发送Trap,都可以说是十分复杂的问题。对此,作为一个有理想的程序员,还需要坚定不移地继续深入地了解更多 SNMP 的知识。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号