snmp协议的trap操作采用基于,snmp get trap

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: