snmp协议的trap操作采用基于,snmp get trap
学习笔记的SNMP陷阱介绍和过程,利用Python _Jettytomcat的技术博客_博客实现接受陷阱信息
0x00 SNMP TRAP介绍SNMP(简单网络管理协议)TRAP是一个非常有用的协议,但是也很难理解。
虽然名为简单网络管理协议,但实际上并不是字面意思,尤其是当你看到一串像. 1.3.6.1.2.1.1.1.1.0这样怪异的数字时,就有点崩溃了。
反正现在所有的网络设备都需要支持SNMP。而且现在有很多开源的网络管理系统,所以学习和了解SNMP对我们是有帮助的。
SNMP trap是被管理设备主动向管理服务器发送设备异常情况的过程,可视为管理服务器的被动接收过程。
因此,许多工具会将snmptrap集成到自己的工具中来监控网络设备。
将SNMP陷阱集成到Nagios的一般工作流程是:
1.snmptrapd接收网络设备发送的陷阱。
2.snmptrapd调用snmptt(snmp陷阱转换器)
3.SNMP TT中定义了每个陷阱的级别,以及需要写入系统日志的陷阱类型。
4.SEC(简单事件关联器是一个事件收集器)从syslog中读取每个事件,并处理调用用户的脚本snmptraphandling.py
5.snmptraphandling.py将根据主机名和陷阱级别调用等效的Nagios命令行。
这个过程涉及很多层,所以感觉比较复杂。让我们深入一下,看看snmptrapd是如何工作的。从而尽可能简化snmptrap的使用方法。
Snmptrapd来自开源软件Net-SNMP。Net-SNMP会有很多用途,当然使用trap也是很有用的用途。snmptrapd收到陷阱后,可以调用用户定义的脚本或命令行来处理陷阱。如果要使用这个函数,需要在snmptrapd的配置文件中设置traphandle。snmptrapd接收的陷阱信息的格式为:
1.数据包来源的主机名。
2.数据包来源的ip地址。
3.数据包的内容。
Traphandle的工作就是读取这些内容并进行处理。
陷阱信息示例:
Cisco 2611 . lon . altity
192.168.10.20
RFC 1213-MIB:sys uptime . 0 0:18:14:45.66
SNMP v2-MIB:snmptrapoid . 0 IF-MIB:link down
RFC1213-MIB:ifIndex.2 2
RFC 1213-MIB:if descr . 2 serial 0/0
RFC1213-MIB:ifType.2 ppp
OLD-CISCO-INTERFACES-MIB:locifreason . 2“管理性关闭”
SNMP-COMMUNITY-MIB:SNMP trap address . 0 192 . 168 . 10 . 20
SNMP-COMMUNITY-MIB:SNMP trap COMMUNITY . 0 public
SNMP v2-MIB:SNMP trap enterprise . 0 Cisco-SMI:Cisco products . 186因为snmptt在陷阱信息中转换了OID,如果没有转换,陷阱信息应该如下所示
Cisco 2611 . lon . altity
192.168.10.20
.1.3.6.1.2.1.1.3.0 0:18:13:59.95
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.6.3.1.1.5.3
.1.3.6.1.2.1.2.2.1.1.2 2
Serial0/0
公私伙伴关系
行政关闭
.1.3.6.1.6.3.18.1.3.0 192.168.10.20
公共
1 . 3 . 6 . 1 . 6 . 3 . 1 . 1 . 4 . 3 . 0 . 1 . 3 . 6 . 1 . 4 . 9 . 1 . 186这说明snmptt有自己的配置文件,其中包含OID和相应的属性名,使用OID进行索引。如果snmptt在配置文件中找不到对应的OID,那么snmptt就无法翻译信息,我们看到的是原始格式。
snmptt使用的配置文件称为MIBs(管理信息库)。在MIBs中,OID索引键可以快速找到相应的文本形式和警告级别。每个MIB都有自己的固定定义格式,其中将包含一个宏(用于解释要显示的信息内容)。
但是MIB为什么要存在呢?snmptrapd不能直接把OID翻译成信息吗?
1.MIB可以由用户自己定义和使用。因为不同厂商定义的陷阱信息内容肯定是不一样的,所以如果snmp要有一定的扩展性,就必须支持用户定义MIBs文件。这就是MIB存在的原因。
2.如果由服务器自己来完成翻译也是可以的,因为如果每次都去通过检索似…的对应的消息的话,那对性能的影响是非常的大的,因此服务器就需要读入米布斯。问题也就出现了,如果更新非理性信念量表话,就要把服务器重新启动,必定会影响到圈套消息的接收。所以把snmptt作为一个独立的守护线程存在是很正确的选择。
最后要做的事情就是添加活板把手了,手柄会影响到snmptrap的接收性能,所以处理的速度要快,因为处理有可能一秒中会有数百次的调用。
这样以来上面的处理流程就可以进行简化的:
1.服务器接收到圈套的信息
2.服务器调用手柄(如果不是调用现有的命令的话,在处理中就可以完成所有的处理了,就没有下面的处理了。又节省了一步,哈哈)
3.处理中再调用纳吉奥斯的命令行就可以了
这样一看流程就简单许多了,以后再使用snmptrap的时候也可以参考这个处理的流程
0x01 SNMP陷阱流程简单网络管理协议(Simple Network Management Protocol)陷阱流程可参考这篇文章
0x02 SNMP陷阱接受用计算机编程语言实现下载安装pysnmp-4.2.5.tar.gz(MD5)
https://pypi.python.org/pypi/pysnmp/
从py SNMP。承运人。asynsock。派遣导入AsynsockDispatcher
从pysnmp.carrier.asynsock.dgram导入udp,udp6
从pyasn1.codec.ber导入解码器
从pysnmp.proto导入美国石油学会(American Petroleum Institute)
从测试用例公共导入*
def cbFun(transportDispatcher,transportDomain,transportAddress,wholeMsg):
wholeMsg:
msg ver=int(API。decodemessageversion(整个消息))
if msgVer in api.protoModules:
pMod=api.protoModules[msgVer]
否则:
打印(不支持的简单网络管理协议(Simple Network Management Protocol)版本% s“% msg ver”)
返回
reqMsg,wholeMsg=decoder.decode(
wholeMsg,asn1Spec=pMod .消息(),
)
打印(来自%s的通知消息:% s:“%(
传输域,传输地址
)
)
请求PDU=pmod。API消息。获取PDU(请求消息)
if reqPDU.isSameTypeWith(pMod .TrapPDU()):
如果msgVer==api.protoVersion1:
打印(企业:% s“%(
pmod。阿皮特拉普杜。获取企业(请求PDU).漂亮打印()
)
)
打印(代理地址:% s“%(
pmod。阿皮特拉普杜。getagentaddr(请求PDU).漂亮打印()
)
)
打印(通用陷阱:% s“%(
pmod。阿皮特拉普杜。getgenerictrap(请求PDU).漂亮打印()
)
)
打印(特定陷阱:% s“%(
pmod。阿皮特拉普杜。getspecifictrap(请求PDU).漂亮打印()
)
)
打印(正常运行时间:% s“%(
pmod。阿皮特拉普杜。gettimestamp(请求PDU).漂亮打印()
)
)
var binds=pmod。阿皮特拉普杜。getvarbindlist(请求PDU)
否则:
var binds=pmod。API PDU。getvarbindlist(请求PDU)
打印( Var-binds:)
对于oid,varBinds中的val:
a=oid.prettyPrint().条状()
b=val.prettyPrint().剥离()。拆分( \n )
打印一份
对于b中的行:
item=line.strip()
如果项目。以(字符串值)开头:
打印“string-value=”项。替换( string-value=0x , ).解码("十六进制")
否则:
打印项目
返回wholeMsg
if __name__==__main__ :
传输调度程序=AsynsockDispatcher()
运输调度员。已注册的
# UDP/IPv4
运输调度程序。注册运输(
域名UdpSocketTransport().openServerMode((0.0.0.0 ,162))
)
# UDP/IPv6
运输调度程序。注册运输(
域名,udp6 .Udp6SocketTransport().openServerMode((:1 ,162))
)
运输调度员。作业开始(1)
尝试:
#调度员永远不会完成,因为作业#1永远不会达到零
运输调度员。运行调度程序()
除了:
运输调度员。关闭调度程序()
上升
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。