使用Python监控SNMP Trap并获取OSPF邻居状态
实验目的:
实时监控指定路由器上OSPF邻居状态情况。
实验环境:
2台CSR1000v,提前配置好OSPFv2,建立邻居关系。
实验步骤:
一、在需要监控的设备上配置SNMPv2 Trap ospf的状态信息:
snmp-server enable traps ospf state-change
snmp-server enable traps ospf errors
二、使用python,作为snmptrap_v2的服务器,分析接受到的SNMPv2 Trap ospf的状态信息:
其中get_ip_address函数的目的是获取指定接口的IP地址,请参考:https://blog.csdn.net/tushanpeipei/article/details/116572723?spm=1001.2014.3001.5501
from get_ip_netifaces import get_ip_address
from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
from pysnmp.carrier.asynsock.dgram import udp
from pyasn1.codec.ber import decoder
from pysnmp.proto import api
from pprint import pprintdef analysis(info): # 分析处理过后的Trap字典信息,当OSPF邻居关系改变时,使用python打印出信息# 分析Trap信息字典函数# 下面是这个大字典的键值与嵌套的小字典# 1.3.6.1.2.1.1.3.0 {'value': 'ObjectSyntax', 'application-wide': 'ApplicationSyntax', 'timeticks-value': '103170310'}# 1.3.6.1.6.3.1.1.4.1.0 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'objectID-value': '1.3.6.1.6.3.1.1.5.4'}# 1.3.6.1.2.1.2.2.1.1.2 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'integer-value': '2'}# 1.3.6.1.2.1.2.2.1.2.2 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'string-value': 'GigabitEthernet2'}# 1.3.6.1.2.1.2.2.1.3.2 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'integer-value': '6'}# 提取OSPF状态和邻居信息if '1.3.6.1.2.1.14.10.1.6' in info.keys():if info["1.3.6.1.2.1.14.10.1.6"]['integer-value'] == '8':print('OSPF Neighbor', info["1.3.6.1.2.1.14.10.1.3"]['ipAddress-value'], "FULL")elif info["1.3.6.1.2.1.14.10.1.6"]['integer-value'] == '1':print('OSPF Neighbor', info["1.3.6.1.2.1.14.10.1.3"]['ipAddress-value'], "Down")# pprint(info, indent=4) # 打印字典信息def cb_fun(transport_dispatcher, transport_domain, transport_address, whole_msg): # 处理Trap信息的函数,返回处理后的字典信息while whole_msg:msg_ver = int(api.decodeMessageVersion(whole_msg)) # 提取版本信息if msg_ver in api.protoModules: # 如果版本兼容p_mod = api.protoModules[msg_ver]else: # 如果版本不兼容,就打印错误print('Unsupported SNMP version %s' % msg_ver)returnreq_msg, whole_msg = decoder.decode(whole_msg, asn1Spec=p_mod.Message(), # 对信息进行解码)print('Notification message from %s:%s: ' % (transport_domain, transport_address # 打印发送TRAP的源信息))req_pdu = p_mod.apiMessage.getPDU(req_msg)if req_pdu.isSameTypeWith(p_mod.TrapPDU()):if msg_ver == api.protoVersion1: # SNMPv1的特殊处理方法,可以提取更加详细的信息print('Enterprise: %s' % (p_mod.apiTrapPDU.getEnterprise(req_pdu).prettyPrint()))print('Agent Address: %s' % (p_mod.apiTrapPDU.getAgentAddr(req_pdu).prettyPrint()))print('Generic Trap: %s' % (p_mod.apiTrapPDU.getGenericTrap(req_pdu).prettyPrint()))print('Specific Trap: %s' % (p_mod.apiTrapPDU.getSpecificTrap(req_pdu).prettyPrint()))print('Uptime: %s' % (p_mod.apiTrapPDU.getTimeStamp(req_pdu).prettyPrint()))var_binds = p_mod.apiTrapPDU.getVarBindList(req_pdu)else: # SNMPv2c的处理方法var_binds = p_mod.apiPDU.getVarBindList(req_pdu)result_dict = {} # 每一个Trap信息,都会整理返回一个字典# 下面是这个大字典的键值与嵌套的小字典# 1.3.6.1.2.1.1.3.0 {'value': 'ObjectSyntax', 'application-wide': 'ApplicationSyntax', 'timeticks-value': '103170310'}# 1.3.6.1.6.3.1.1.4.1.0 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'objectID-value': '1.3.6.1.6.3.1.1.5.4'}# 1.3.6.1.2.1.2.2.1.1.2 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'integer-value': '2'}# 1.3.6.1.2.1.2.2.1.2.2 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'string-value': 'GigabitEthernet2'}# 1.3.6.1.2.1.2.2.1.3.2 {'value': 'ObjectSyntax', 'simple': 'SimpleSyntax', 'integer-value': '6'}for x in var_binds: # 打印详细Trap信息result = {}for x, y in x.items():# print(x, y.prettyPrint()) # 最原始信息打印# 处理信息到字典if x == "name":id = y.prettyPrint() # 把name写入字典的键else:bind_v = [x.strip() for x in y.prettyPrint().split(":")]for v in bind_v:if v == '_BindValue':continueelse:result[v.split('=')[0]] = v.split('=')[1]result_dict[id] = result# 把字典传到分析模块进行分析analysis(result_dict)return whole_msgdef snmp_trap_receiver(ifname, port=162): # 创建snmp_trap_receiver服务器,监听CSR1000v发送来的SNMP Trap信息if_ip = get_ip_address(ifname)transport_dispatcher = AsynsockDispatcher() # 创建实例transport_dispatcher.registerRecvCbFun(cb_fun) # 调用处理Trap信息的函数# UDP/IPv4transport_dispatcher.registerTransport(udp.domainName, udp.UdpSocketTransport().openServerMode((if_ip, port)) # 绑定到本地地址与UDP/162号端口)transport_dispatcher.jobStarted(1) # 开始工作print("SNMP Trap Receiver Started!!!")try:transport_dispatcher.runDispatcher() # 运行except Exception:transport_dispatcher.closeDispatcher()raiseif __name__ == "__main__":# 使用Linux解释器 & WIN解释器snmp_trap_receiver("ens33")
测试结果:
参考资料来源:现任明教教主
使用Python监控SNMP Trap并获取OSPF邻居状态相关推荐
- donotage标记、MTU及MTU不匹配问题、OSPF邻居状态记录
目录 一. donotage标记 二.MTU详解 (1)-- MTU简介 (2)--图解 (3)--!!!邻居关系起不来原因: (4)-- 解决: 三.两种特殊的邻居关系: 四.OSPF邻居状态的记录 ...
- zabbix监控SNMP Trap 类型
环境 两台虚拟机,一台server(公网IP),一台proxy(内网IP). Docker环境, 使用 docker compose启动. 内网里有一台华为网络设备 目的 通过内网下的proxy接收内 ...
- SNMP和LLDP获取网络邻居节点
LLDP协议可以获取网络邻居节点的信息,本次使用eNSP模拟仿真. 1.网络设备的配置 建立如下网络拓扑结构,建立过程可参考使用eNSP搭建一个局域网. 首先需要在网络设备上开启SNMP.LLDP服务 ...
- OSPF邻居状态详解
OSPF 邻居路由器之间之所以要建立邻接关系,是为了相互交换路由信息.在广播网络环境中,并非每台邻居路由器之间都要建立"齐备的" OSPF 邻接关系.OSPF邻居路由器之间会通过 ...
- 技术要点|Python监控学生端电脑屏幕自动识别学习状态
技术要点: 1)使用pillow扩展库进行屏幕截图: 2)使用多线程监听学生端连接: 3)使用TCP协议传输屏幕图像: 4)使用标准库zlib进行数据压缩: 5)使用OCR提取屏幕截图中的文字. 具体 ...
- OSPF 协议中各种邻居状态的含义是什么?
原文链接:https://zhidao.baidu.com/question/174294544.html ospf邻居状态有7种,分别是: down init 2way Exstart Exchan ...
- IEEP部署企业级网络工程-OSPF邻居关系故障排除
OSPF邻居关系故障-现象与排除 一.OSPF邻居关系故障-现象与排除 1.OSPF建立邻居关系时,将检验hello报文中的Area ID .Autype.Authentication.network ...
- 使用Zabbix的SNMP trap监控类型监控设备的一个例子
转载来源 :使用Zabbix的SNMP trap监控类型监控设备的一个例子 :https://www.jianshu.com/p/aa795afdf655 介绍 本文以监控绿盟设备为例. 1.登录被监 ...
- 【Zabbix-SNMP trap】使用Zabbix的SNMP trap监控类型监控设备的一个例子
本文以监控绿盟设备为例. 1.登录被监控的设备的管理系统,配置snmptrap地址指向zabbix服务器或代理服务器. snmptrap地址也叫陷阱. 2.配置或关闭防火墙,并验证是否能在zabbix ...
- Python:通过远程监控用户输入来获取淘宝账号和密码的实验(二)
从今天早上产生了写个获取淘宝账号及密码的想法后,到现在,全天都在看书.调试程序,12小时内写了三篇相关博客,如下: <Python:通过获取淘宝账号和密码的实验,来看登陆方式选择的重要性> ...
最新文章
- 赠书 | 热潮下的冷思考,人工智能即将改变的三大领域
- restful接口定义的几种方式
- c语言的编译过程,程序编译过程
- 面试题目集锦 -- 排序算法
- Serializable java序列化
- 根据服务器ip地址查看虚拟目录,IIS虚拟目录实现与文件服务器网络驱动器映射共享...
- 【小程序】【Tips】跨页面全局变量的正确方法 - globalData
- Linux开机启动过程(11):start_kernel 初始化(至setup_arch解析cmdline前)
- 12年后,索尼重启机器人业务
- SQL Server高级查询之常见数据库对象(视图)第五章节
- mvc2 在 .net 4.0 下的ValidateInput(false) 无效
- 巴巴运动网学习笔记(51-55)
- ACM常用算法及练习(2)
- ApolloStudio高手之路(12):机器视觉图像匹配定位与激光打标领域深度结合(基于海康威视VisionMaster九点标定、模板快速匹配定位、标定转换以及金橙子EzCad2二次开发)
- 林子雨大数据java练习
- 简单说说我是怎么找回U盘删除的文件
- iphone应用隐私政策_如何在iPhone上“隐藏”联系人以获得更大的隐私
- poi导出excel无法打开文件
- 工业现场云解决方案的设计与实践
- 在Word中将所有指定的标题统一进行升降级操作