SNMP TRAP实战

一、什么是SNMPTRAP

  • SNMP trap(SNMP 陷阱):某种入口,到达该入口会使SNMP被管设备主动通知SNMP管理器,而不是等待SNMP管理器的再次轮询。在网管系统中,被管理设备中的代理可以在任何时候向网络管理工作站报告错误情况,例如预制定阈值越界程度等等。代理并不需要等到管理工作站为获得这些错误情况而轮询他的时候才会报告。正如人们用中断通知 CPU 数据的到达,而不是让 CPU 进行轮询一样。Trap 通知是更加合理的选择。用一句话来说的话,SNMP Trap 就是被管理设备主动发送消息给 NMS 的一种机制。

二、SNMPTRAP功能特点

  • 1、事件驱动,第一时间收到设备故障告警
    以事件为驱动,由被监控的主机、网络设备、应用在发生故障时向NMS发送SNMP Trap,通过对接收到的SNMP Trap进行翻译和展现,以最快速度向管理人员发送告警。SNMP Trap不同于SNMP的主动采集,SNMP采集服务器按照固定的时间间隔,由网管系统以询问的方式,采集被监控端性能指标,因此发现被监控端性能问题的快慢取决于采集的频率间隔。而SNMP Trap是以事件为驱动,在被监控端设置陷阱,一旦被监控端设备出现相关问题,立刻发送SNMP Trap,因此能够在最短的时间内发现故障,避免因为设备故障带来的经济损失。
  • 2、提供SNMPTrap的接收,并通过对Trap信息翻译,展现事件
    支持设备,主机和应用的SNMP Trap信息,从被动变为主动,全面监控IT系统。通过对SNMP Trap的翻译和展现,一旦某个IT组件出现问题,可以在短时间之内,即可收到故障信息,满足企业的快速发现问题的需要。
    通过SNMPTrap的接收规则定义,管理员可以过滤非重要设备的Trap信息,也可以过滤被监控设备的非重要故障信息,帮助管理员在第一时间收到真正需要的管理信息。
  • 3、支持事件导出
    汇总特定时间内特定SNMPTrap事件,同时可以以Excel格式导出事件数据,便于管理人员对故障信息进行统计和分析。
  • 4、支持各类设备厂家MIB库的导入
    虽然国内各种网络设备都支持SNMP Trap,但是各个厂家的MIB库并不能很好的支持公共标准,因此,很多监控系统都支持私有MIB库的导入,确保能够全面兼容各个厂家设备的SNMP Trap信息.

三、SNMPTRAP工作流程

  • 1、Agent端
    A、编写MIB文件,确定好TRAP名称等信息
    B、命令方式:发送各种TRAP命令(Manager地址后面一定要加端口号162),在Manager端看反应结果,在Agent端无反应
    C、自动触发:配置snmpd.conf设置触发TRAP,系统发生某类错误时会自动触发相应类型的TRAP,发送给Manager
    D、程序方式:一部份TRAP需要写C语言程序,用相应的api(send_easy_trap或send_v2trap)发送
  • 2、Manager端
    A、配置snmptrapd.conf文件,设置访问权限
    B、将MIB文件导入到mibs文件夹中
    C、用perl等脚本语言编写处理trap的程序
    D、配置snmptrapd.conf文件,添加traphandler项,将不同的TRAP对应到不同的处理程序上

四、TRAP MIB编写及编译
NET-SNMP中TRAP的实现是基于一个由NOTIFICATION-TYPE 定义的MIB对象实现的。该对象在TrapPDU中头部位置,后续紧跟着该Trap携带的其他节点的信息,这些节点信息是Trap中有意义的信息,体现本次“告警”的真正内容,这些节点一般为普通的MIB对象。其中OBJECTS 子句中可以包含多个对象。

  • 实现私有Trap的方法与之前的普通MIB开发方法类型:

    • 先定义Trap的MIB对象,然后借由mib2c和相应的框架代码配置文件,“mib2c.notify.conf”,生成Trap框架代码。
      命令如下:
      mib2c -c mib2c.notify.conf TEST-TRAP-MIB::TestTraps

其生成的框架代码:

  1. 注册Trap对象
  2. 绑定对象发送列表
  3. 最后调用API发送:send_easy_trap() send_v2trap() send_v3trap().

Trap的发送逻辑一般具有重复发送的特性,这一特性可有snmp_alarm_register()实现。该API能够准确地实现计时器功能。示例代码中也是由该API实现重复,周期调用的功能。
五、TRAP MIB示例文件

TEST-TRAP-MIB DEFINITIONS ::= BEGIN
IMPORTS
	MODULE-IDENTITY, OBJECT-TYPE, TimeTicks FROM SNMPv2-SMI
	DisplayString, FROM SNMPv2-TC
	jsHostInfo FROM JS-MAIN-MIB ;
	TestTraps OBJECT IDENTIFIER ::= { jsHostInfo 99 }
     
	cpuRatioHigh NOTIFICATION-TYPE
		OBJECTS  {TestTrapDescription}  --可以包含多个对象
		STATUS  current
		DESCRIPTION "."
         ::= { TestTraps 1 }    
         
  
	TestDescription OBJECT IDENTIFIER ::= { TestTraps 2 }
      
	TestTrapDescription  OBJECT-TYPE
		SYNTAX  DisplayString (SIZE (0..256))
		MAX-ACCESS read-only
		STATUS current
		DESCRIPTION "  "
		::= { TestDescription 1 }
           
  END

六、TRAP 示例代码

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "TestTraps.h"

//extern const oid snmptrap_oid[];
//extern const size_t snmptrap_oid_len;
int  cpu = 0; 
const oid snmptrap_oid[] = {1,3,6,1,6,3,1,1,4,1,0};
const size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid);
//如果CPU大于80 则发送告警 否则不发送
void judge_send_cputrap(int cpu)
{
    static unsigned int cputrap_clientreg = 0;
    if(cpu > 80)
    {
        if(cputrap_clientreg == 0){
            send_cpuRatioHigh_trap();
			//注册每5秒发送一次
            cputrap_clientreg = snmp_alarm_register(5,SA_REPEAT,send_cpuRatioHigh_trap,NULL);
 
        }
    }
    else
    {
        if(cputrap_clientreg != 0)
        {
            snmp_alarm_unregister(cputrap_clientreg);
            cputrap_clientreg = 0;
        }
    }
}
void read_cpudata_repeat(unsigned int clientreg, void *clientarg)
{
    cpu = 90;
    judge_send_cputrap(cpu); //判断发送告警
}


void init_TestTraps(void)
{
    printf(("TestTraps","Initializing\n"));
    snmp_alarm_register(1,SA_REPEAT,read_cpudata_repeat, NULL);
}

int
send_cpuRatioHigh_trap(void)
{
    netsnmp_variable_list *var_list = NULL;
    const oid       cpuRatioHigh_oid[] =
        { 1, 3, 6, 1, 4, 1, 88888, 1, 1, 99, 1 };
    const oid       TestTrapDescription_oid[] =
        { 1, 3, 6, 1, 4, 1, 88888, 1, 1, 99, 2, 1, 0 }	
    /*
     * 设置 snmpTrapOid.0 的值为私有MIB中定义的TestTrapDescription_oid
     */
    snmp_varlist_add_variable(&var_list,
                              snmptrap_oid, snmptrap_oid_len,
                              ASN_OBJECT_ID,
                              cpuRatioHigh_oid, sizeof(cpuRatioHigh_oid));

    /*
     * Add any objects from the trap definition
     */
    snmp_varlist_add_variable(&var_list,
                              TestTrapDescription_oid,
                              OID_LENGTH(TestTrapDescription_oid),
                              ASN_OCTET_STR,
                              /*
                               * Set an appropriate value for TestTrapDescription 
                               */
                              (int*)&cpu, sizeof(cpu));

    /*
     * Add any extra (optional) objects here
     */

    /*
     * Send the trap to the list of configured destinations
     *  and clean up
     */
     //发送TRAP之后并释放
    send_v2trap(var_list);
    snmp_free_varbind(var_list);

    return SNMP_ERR_NOERROR;
}

七、TRAP 注册到子代理中
方法跟普通MIB对象一样

八、测试和验证
需启动主代理进程和子代理进程 以及snmptrapd进程
直接到/usr/local/sbin/目录下 启动代理进程
./snmpd -f -Le -c /usr/local/share/snmp/snmpd.conf
然后启动子代理进程
./ example-demon

最后启动snmptrapd进程。
 ./snmptrapd -f -Le -c /usr/local/share/snmp/snmptrapd.conf

启动snmptrapd进程需要snmptrapd.conf配置文件
启动后即可看到
则每过5秒可以看到trap返回来的告警信息。

九、snmptrapd.conf编写
说明:配置文件所有指令都要顶格写,左侧不要留空格。
允许使用空格,但不能使用Tab键。
路径分隔符不能使用反斜杠,必须使用“/”。
此文件用来指定管理进程如何处理接收到的snmp notification。

  1. 在net-snmp安装目录下新建snmptrapd.conf文件,使用以下路径:/usr/local/share/snmp/snmptrapd.conf。

  2. 在snmptrapd.conf中加入以下指令:
    authCommunity log,execute,net public
    这条指令指明以“public”为“community”请求的snmp “notification”允许的操作。
    各变量意义如下:
    log: log the details of the notification - either in a specified file, to standard output (or stderr), or via syslog(or similar).
    execute: pass the details of the trap to a specified handler program, including embedded perl.
    net: forward the trap to another notification receiver.

  3. 若想对接收到的信息进行处理,可以使用traphandle,示例如下:
    traphandle SNMPv2-MIB::coldStart /usr/nba/bin/traps cold
    traphandle SNMPv2-MIB::warmStart /usr/nba/bin/traps warm
    traphandle IF-MIB::linkDown /usr/nba/bin/traps down
    traphandle IF-MIB::linkUp /usr/nba/bin/traps up
    第一个参数为从snmptrapd接收的OID,第二个参数为调用的程序。此次未做traphandle处理。

注意:上述是使用服务器本机获取TRAP ,如果想使用远程的管理设备获取TRAP
需要修改snmpd.conf文件

Trap的发送还需要指定到管理端地址和端口。在配置文件中,添加下面关键字:
不是关键点:Authtrapenable 1 //打开trap自动告警的开关,1代表开启,2代表关闭
Trap2sink localhost [community] [port] //指定trap发送的地址,共同体和端口
共同体和端口可以不指定,默认为public 和 162。

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值