原文链接:https://www.cnblogs.com/JetpropelledSnake/p/9870336.html

推荐看作者这个SNMP专栏:https://www.cnblogs.com/JetpropelledSnake/category/1326577.html

阅读目录

  • 0x00 SNMP TRAP简介
  • 0x01 SNMP TRAP流程
  • 0x02 SNMP Trap接受用Python实现

0x00 SNMP TRAP简介

SNMP(Simple Network Management Protocol) trap是一种很有用,但是也容易让人难以理解的协议。

虽然名字叫做简单网络管理协议,但实际上并不是字面上的意思,尤其是看到.1.3.6.1.2.1.1.1.0这样一串串诡异的数字时候,就会有点让人崩溃。

不管怎么说,现在所有的网络设备的都需要支持SNMP。而且现在还有很多的开源的网络管理系统,所以就有利于我们来学习和理解SNMP。

SNMP trap是由被管理的设备主动的向管理服务器发送设备的异常情况,可以看成是管理服务器被动的去接收的过程。

所以会有很多的工具会把snmptrap集成到自己的工具中,对网络设备进行监控。

把SNMP trap集成的到Nagios当中的,大体的工作流程是:

1. 由snmptrapd来接收网络设备发出的trap
2. snmptrapd调用snmptt(snmp trap translator 翻译器)
3. snmptt中定义了每一种trap的级别,以及什么样的trap才有必要写入到syslog中
4. SEC(simple event correlator是一个事件收集器)从syslog中读取每一个事件,并把调用用户的脚本snmptraphandling.py 来处理。
5. snmptraphandling.py 会调用根据主机名和trap的级别来调用相当的Nagios命令行。

这个过程包含了很多层,所以感觉很复杂,还是深入进去看看snmptrapd是怎么工作的。从而尽可能简化snmptrap的使用方法。

snmptrapd来自开源软件Net-SNMP. Net-SNMP会有很多的用途,当然使用trap也是一个很有用的用途。当snmptrapd接收到trap以后,可以调用用户自定义的脚本或者命令行来处理trap。如果想使用这个功能就需要在snmptrapd的配置文件中设置traphandle。 snmptrapd接收到的trap信息格式是:

1. 数据包来源的主机名字。
2. 数据包来源的ip地址。
3. 数据包中的内容。

traphandle的工作就是读取这些内容并进行处理就可以了。

Trap信息例子:

cisco2611.lon.altinity
192.168.10.20
RFC1213-MIB::sysUpTime.0 0:18:14:45.66
SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkDown
RFC1213-MIB::ifIndex.2 2
RFC1213-MIB::ifDescr.2 "Serial0/0"
RFC1213-MIB::ifType.2 ppp
OLD-CISCO-INTERFACES-MIB::locIfReason.2 "administratively down"
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 192.168.10.20
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "public"
SNMPv2-MIB::snmpTrapEnterprise.0 CISCO-SMI::ciscoProducts.186

因为snmptt对trap信息中的OID进行了翻译,如果不进行翻译的话,那么trap信息的样子应该是

cisco2611.lon.altinity
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
.1.3.6.1.2.1.2.2.1.2.2 "Serial0/0"
.1.3.6.1.2.1.2.2.1.3.2 ppp
.1.3.6.1.4.1.9.2.2.1.1.20.2 "administratively down"
.1.3.6.1.6.3.18.1.3.0 192.168.10.20
.1.3.6.1.6.3.18.1.4.0 "public"
.1.3.6.1.6.3.1.1.4.3.0 .1.3.6.1.4.1.9.1.186

这就说明了,snmptt拥有自己的配置文件,文件中包含了OID和对应的属性名,并且是使用OID来进行索引的。如果snmptt在配置文件中无法找到对应的OID的话,那么snmptt也就无法对信息进行翻译,我们看到的信息内容也就是原始的格式了。

snmptt使用的配置文件叫做MIBs(Management Information Base管理信息基础),在MIBs以OID为索引的key,可以快速查找到对应的文字形式和警告的级别。每一个MIB都有自己固定的定义格式,其中会包含一个宏(用来说明要显示信息的内容)。

可是为什么要有MIBs的存在呢?直接由snmptrapd来完成OID到信息的翻译不可以么?
1. MIBs是可以由用户自己来定义,使用的。因为各厂商对trap信息定义的内容肯定是不同的,所以想要snmp有一定的扩展性,那么就必须要支持用户自定义MIBs文件。这也就是MIBs存在的原因。
2. 如果由snmptrapd自己来完成翻译也是可以的,因为如果每次都去通过检索OID对应的消息的话,那对性能的影响是非常的大的,因此snmptrapd就需要读入MIBs。问题也就出现了,如果更新MIBs话,就要把snmptrapd重新启动,必定会影响到trap消息的接收。所以把snmptt作为一个独立的deamon存在是很正确的选择。

最后要做的事情就是添加traphandle了,handle会影响到snmptrap的接收性能,所以处理的速度要快,因为handle有可能1秒中会有数百次的调用。
 这样以来上面的处理流程就可以进行简化的:
1. snmptrapd接收到trap的信息
2. snmptrapd调用handle(如果不是调用现有的命令的话,在handle中就可以完成所有的处理了,就没有下面的处理了。又节省了一步,哈哈)
3. handle中再调用Nagios的命令行就可以了

这样一看流程就简单许多了,以后再使用snmptrap的时候也可以参考这个处理的流程

0x01 SNMP TRAP流程

SNMP Trap流程可参考这篇文章

0x02 SNMP Trap接受用Python实现

下载 安装pysnmp-4.2.5.tar.gz (md5)

https://pypi.python.org/pypi/pysnmp/

from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
from pysnmp.carrier.asynsock.dgram import udp, udp6
from pyasn1.codec.ber import decoder
from pysnmp.proto import api
from test_case_common import *def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg):while wholeMsg:msgVer = int(api.decodeMessageVersion(wholeMsg))if msgVer in api.protoModules:pMod = api.protoModules[msgVer]else:print('Unsupported SNMP version %s' % msgVer)returnreqMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=pMod.Message(),)print('Notification message from %s:%s: ' % (transportDomain, transportAddress))reqPDU = pMod.apiMessage.getPDU(reqMsg)if reqPDU.isSameTypeWith(pMod.TrapPDU()):if msgVer == api.protoVersion1:print('Enterprise: %s' % (pMod.apiTrapPDU.getEnterprise(reqPDU).prettyPrint()))print('Agent Address: %s' % (pMod.apiTrapPDU.getAgentAddr(reqPDU).prettyPrint()))print('Generic Trap: %s' % (pMod.apiTrapPDU.getGenericTrap(reqPDU).prettyPrint()))print('Specific Trap: %s' % (pMod.apiTrapPDU.getSpecificTrap(reqPDU).prettyPrint()))print('Uptime: %s' % (pMod.apiTrapPDU.getTimeStamp(reqPDU).prettyPrint()))varBinds = pMod.apiTrapPDU.getVarBindList(reqPDU)else:varBinds = pMod.apiPDU.getVarBindList(reqPDU)print('Var-binds:')for oid, val in varBinds:a = oid.prettyPrint().strip()b = val.prettyPrint().strip().split('\n')print afor line in b:item = line.strip()if item.startswith('string-value'):print 'string-value='+item.replace('string-value=0x','').decode('hex')else:print itemreturn wholeMsgif __name__ == '__main__':transportDispatcher = AsynsockDispatcher()transportDispatcher.registerRecvCbFun(cbFun)# UDP/IPv4transportDispatcher.registerTransport(udp.domainName, udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162)))# UDP/IPv6transportDispatcher.registerTransport(udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162)))transportDispatcher.jobStarted(1)try:# Dispatcher will never finish as job#1 never reaches zerotransportDispatcher.runDispatcher()except:transportDispatcher.closeDispatcher()raise

SNMP学习笔记之SNMP TRAP简介、流程以及使用Python实现接受Trap信息相关推荐

  1. SNMP学习笔记之SNMP 原理与实战详解

    原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  2. SNMP学习笔记之SNMP简单概述

    1.什么是Snmp SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议".SNMP是一种 ...

  3. 历史经验之SNMP学习笔记

    整理日期:2011年9月8日 历史经验之SNMP学习笔记 export MIBDIRS=/share/snmp/mibs/ export MIBS=+LOOGSON-MIB :NET-SNMP-TUT ...

  4. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  5. OPENMP学习笔记(1)——简介,模型,运行

    OPENMP学习笔记(1)--简介,模型,运行 简介: OpenMP的英文全称是Open Multiprocessing,一种应用程序接口(API,即Application Program Inter ...

  6. HoloLens开发学习笔记(一):HoloLens简介

    HoloLens开发学习笔记(一):HoloLens简介 一.HoloLens简介 Microsoft HoloLens是Windows Holographic的使用主要设备.HoloLens是一个W ...

  7. JavaWeb学习笔记2 —— Web服务器简介

    JavaWeb学习笔记2 -- Web服务器简介 参考教程B站狂神https://www.bilibili.com/video/BV12J411M7Sj 相关技术 ASP: 微软:国内最早流行的就是A ...

  8. 小猫爪:S32K3学习笔记09-S32K3之Safety简介

    小猫爪:S32K3学习笔记09-S32K3之Safety简介 1 前言 2 Safety相关硬件介绍 3 Safety相关软件介绍 4 Safety文章目录 END 1 前言   接下来,就要开始进学 ...

  9. 5、赛灵思-Zynq UltraScale+ MPSoC学习笔记:Petalinux 的设计流程及定制Linux系统

    5.赛灵思-Zynq UltraScale+ MPSoC学习笔记:Petalinux 的设计流程及定制Linux系统 声明:本文是学习赛灵思 Zynq UltraScale+ MPSoC 5EV过程中 ...

  10. Git 学习笔记:5 分布式工作流程

    Git 学习笔记:5 分布式工作流程 分布式工作流程 集中式工作流 集成管理员工作流 司令官与副官工作流 工作流程总结 向一个项目贡献 提交准则 私有小型团队 John's Machine 私有管理团 ...

最新文章

  1. 图解TC++3.0开发教程
  2. POJ - 1328 Radar Installation(贪心+思维)
  3. 给所有想从事软件研发的年轻工程师的忠告与建议
  4. PyCharm调试错误
  5. 7-2 数组元素循环右移问题 (40 分)
  6. SAP License:SAP工业4.0 创新智能物流解决方案
  7. 机器学习:神经网络之表达
  8. c# define 类似_c#跟c++的相似之处
  9. Docker 容器学习完整笔记
  10. 小马 KMS10激活系统后的浏览器小尾巴分析与清除
  11. Scala 函数式编程(一) 什么是函数式编程?
  12. SLAM领域的优秀作者与实验室汇总
  13. 创意CSS时钟网页代码
  14. 福利来了 | 开发者社区布道师计划,奖品丰厚
  15. Warshall算法JAVA实现
  16. 故障检测、故障识别领域(分类问题)的性能评价指标
  17. java double输出 lf_为什么double类型输入(scanf)用%lf,输出(printf)用%f?
  18. pikachu-sql注入(皮卡丘)
  19. python数据处理论文_用Python玩转数据数据处理相关小例编程题
  20. 图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析

热门文章

  1. WiFi各协议理论速度计算
  2. 10道Struts2面试题
  3. IntelliJ IDEA 配置svn
  4. Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api
  5. web全栈工程师进阶学习线路图
  6. WPF 使用 Font Awesome(OTF / TTF)
  7. MATLAB随机信号分析与处理
  8. 全新开发萝卜影视源码金色版 视频影视系统APP源码
  9. 什么是ipo表,ipo图,hipo图
  10. 安装sas9.4版本sid过期问题