针对开发SNMPTrap的总结 本文关键词:开发,SNMPTrap
针对开发SNMPTrap的总结 本文简介:浅谈Linux中开发SNMPTrapSNMPTrap是一种标准的报告机制,广泛应用在各种网络管理软件中。本文详细介绍了SNMPTrap的基本概念,以及Linux下面net-snmp对SNMPTrap的开发与应用。1.SNMPTrap简介SNMP简单网络管理协议(SimpleNetworkManage
针对开发SNMPTrap的总结 本文内容:
浅谈Linux中开发SNMP
Trap
SNMP
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包含的部分都是为描述事件而定义的,见下图所示:
PDU
enterprise
agent-addr
generic-trap
specific-trap
time-
stamp
var-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.2
fxPortReset、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(
首先添加trap对象,指定告警的对象为fxPortReset。
如果trap需要根据情况绑定数据,以提供更多事件信息,可继续添加数据到链表,也可指定绑定数据的对象标识符。
snmp_varlist_add_variable(
如果有多组数据绑定,就要简单重复调用snmp_varlist_add_variable
函数,因此链表var_list包含了指定类型的数据。
一个
SNMP
Trap创建成功后,调用相应的API将其发送出去即可:
send_v2trap(
var_list
);
最后需要做清理工作,代码如下:
snmp_free_varbind(
var_list
);
具体可参考源代码包~/agent/mibgroup/examples下的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
的知识。