SNMP TRAP

为什么要使用SNMP trap

上篇数据中心网络设备管理(一)中介绍了如何使用snmp get 获取设备信息,网管要在尽量短的时间内获取到设备告警,使用snmp get来获取设备告警,需要网管设置轮询来实现,如果设置轮询时间为5min,告警就有可能在设备发生故障5分钟后才被网管发现,如果设置轮询时间颗粒度过短,就增加了网络流量,增大设备处理数据压力,而snmp trap为网管被动接收设备的告警信息,设备出现告警,会自动给网管发送告警消息。

SNMP trap 设备配置

以华为设备为例进行配置snmp trap

snmp-agent trap type base-trap                                           //配置trap类型为base-trap
snmp-agent                                                                 //使能snmp-agent
snmp-agent sys-info version all                                           //兼容V1、V2C、V3版本
snmp-agent trap source Loopback0                                   //设置Trap源地址为Loopback0
snmp-agent mib-view included proxyping mib-2
snmp-agent target-host trap address udp-domain 网管ip params securityname 团体字 v2c

如何解析SNMP trap 报文

接下来进行抓包,分析SNMP trap报文内容,通过tcpdump进行抓包,查看包的形式

sudo tcpdump -i 网卡 udp port 162  -w snmp.pcap

使用wireshark及trapbuffer的一条数据进行分析

time device_name %%01CONFIGURATION/6/hwCfgChgNotify(t):CID=0x80cb000c-OID=1.3.6.1.4.1.2011.5.25.191.3.1;Configuration changed. (CurrentCfgChgSeqID=676, CfgChgSeqIDReveralCount=0, CfgChgTableMaxItem=10000, CfgBaselineTime=2020-01-16 时间)


variable-bindings为6项,对应分别对应

参数名称 参数含义
TIMETICKS 可以理解为时间戳
OID MIB中的告警号标识
CurrentCfgChgSeqID 系统配置变更标识。
CfgChgSeqIDReveralCount 配置变更流水号反转次数。
CfgChgTableMaxItem 系统可以保存的配置变更点数目。
CfgBaselineTime 系统配置的基线时间。

明白trap消息格式后,就可以通过程序作为snmp trap的服务器,并根据snmp trap格式还原告警。我这里使用python进行实现

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
def cb_fun(self,transport_dispatcher, transport_domain, transport_address, whole_msg):  # 处理Trap信息的函数,返回处理后的字典信息while whole_msg:msg_ver = int(api.decodeMessageVersion(whole_msg))print(msg_ver)#打印下报文def snmp_trap_receiver(self,if_ip,port):  # 创建snmp_trap_receiver服务器,监听发送来的SNMP Trap信息transport_dispatcher = AsynsockDispatcher()  # 创建实例transport_dispatcher.registerRecvCbFun(self.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 as e:transport_dispatcher.closeDispatcher()print(e)
if __name__ == '__main__':snmp_trap_receiver(0.0.0.0,162)

在设备上造一条告警出来后,打印snmp trap报文,为下一步分析做准备


Message:version=version-2ccommunity=data=PDUs:snmpV2-trap=SNMPv2TrapPDU:request-id=37471error-status=noErrorerror-index=0variable-bindings=VarBindList:VarBind:name=1.3.6.1.2.1.1.3.0=_BindValue:value=ObjectSyntax:application-wide=ApplicationSyntax:timeticks-value=45719668VarBind:name=1.3.6.1.6.3.1.1.4.1.0=_BindValue:value=ObjectSyntax:simple=SimpleSyntax:objectID-value=1.3.6.1.4.1.2011.5.25.191.3.1VarBind:name=1.3.6.1.4.1.2011.5.25.191.1.1.0=_BindValue:value=ObjectSyntax:simple=SimpleSyntax:integer-value=676VarBind:name=1.3.6.1.4.1.2011.5.25.191.1.2.0=_BindValue:value=ObjectSyntax:simple=SimpleSyntax:integer-value=0VarBind:name=1.3.6.1.4.1.2011.5.25.191.1.3.0=_BindValue:value=ObjectSyntax:simple=SimpleSyntax:integer-value=10000VarBind:name=1.3.6.1.4.1.2011.5.25.191.1.4.0=_BindValue:value=ObjectSyntax:simple=SimpleSyntax:string-value=time

使用分割将这6项的值全部提取出来


def analysis(msg_ver):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(req_msg)req_pdu = p_mod.apiMessage.getPDU(req_msg)if req_pdu.isSameTypeWith(p_mod.TrapPDU()):if msg_ver == api.protoVersion1:  # SNMPv1的特殊处理方法,可以提取更加详细的信息var_binds = p_mod.apiTrapPDU.getVarBindList(req_pdu)else:  # SNMPv2c的处理方法var_binds = p_mod.apiPDU.getVarBindList(req_pdu)result_dict = {}  # 每一个Trap信息,都会整理返回一个字典for x in var_binds:  # 打印详细Trap信息result = {}for x, y in x.items():# print(x, y.prettyPrint())  # 最原始信息打印y = {ObjectName: 9} 1.3.6.1.2.1.1.3.0# 处理信息到字典if x == "name":id = y.prettyPrint()  # 把name写入字典的键else:bind_v = [x.strip() for x in y.prettyPrint().split("\n")]for v in bind_v:print(v)if "=" in v:result[v.split('=')[0]] = v.split('=')[1]result_dict[id] = resultprint(result_dict)

根据提取出来的值和snmp trap对应OID告警模板进行拼接,就可以还原设备告警了,本条告警模板如下:


Configuration changed. (CurrentCfgChgSeqID=[CurrentCfgChgSeqID], CfgChgSeqIDReveralCount=[CfgChgSeqIDReveralCount], CfgChgTableMaxItem=[CfgChgTableMaxItem], CfgBaselineTime=[CfgBaselineTime])
设备当前运行的配置发生改变。

其他告警模板可以在华为官网对应设备文档中找到,这样当设备发生故障或因某些原因导致系统进入不正常的工作状态时,就网管可以被动收到设备产生事件和告警信息。

参考:

https://bbs.csdn.net/topics/391964541?page=1
https://support.huawei.com/carrierindex/zh/anony/index.html
https://stackoverflow.com/questions/33752602/listen-traps-with-pysnmp

数据中心网络设备管理(二)相关推荐

  1. 数据中心网络设备管理(一)

    为了保证网络的高速.高可用性.可扩展性.高安全性,需要提高网络监控及自愈能力,网管就成了设备资源.网络状态监测的集合体,自Telemetry推出以后,传统的网管协议snmp,syslog等渐渐走了下坡 ...

  2. 数据中心网络如何发展成为无损数据中心网络?

    数据中心网络如何发展成为无损数据中心网络? 作者:袁冬至 公众号:救命的药 研究方向:数据中心网络 欢迎交流,学习! 数据中心网络如何实现无丢包.低时延.高吞吐的能力? 为解决上述问题,传统原生TCP ...

  3. 某云数据中心网络解决方案(分享二十一)

    某云数据中心网络解决方案(分享二十一) 参考文章: (1)某云数据中心网络解决方案(分享二十一) (2)https://www.cnblogs.com/zywu-king/p/8284189.html ...

  4. 数据中心网络高可用架构

    文章不错,转来了 http://www.h3c.com.cn/Solution/Operational/DataCenter/Solutions/201003/802841_30004_0.htm 相 ...

  5. 数据中心网络流量精细运维

    从IDC运营商和云服务商的角度来说,做好网络运维是企业的根本.国内对互联网带宽需求的快速增长,催生出很多大型的IDC服务商,他们在全省.全国,甚至全世界布局数据中心.快速布局的同时如何对数据中心流量精 ...

  6. 什么是超融合数据中心网络?

    数据中心网络连接数据中心内部通用计算.存储和高性能计算资源,服务器间的所有数据交互都要经由网络转发.当前,IT架构.计算和存储技术都在发生重大变革,驱动数据中心网络从原来的多张网络独立部署向全以太化演 ...

  7. 200G vs 400G:谁是数据中心网络下一站?

    互联网联接全球 40 亿多用户,支撑着VR/AR.16K视频.自动驾驶.人工智能.5G.物联网等层出不穷的数字化应用.教育.医疗.办公等用户线上与线下的结合,正在影响和改变人们生活的方方面面. 数据中 ...

  8. 数据中心网络组网的不同方案

    数据中心网络组网的不同方案 一.EoR/MOR和TOR 根据网络交换机与配线设备设置的位置不同,列头柜可以设置于列头 (EOR).列中 (MOR) ,网络设备也可以设置在机柜顶部(TOR) 等. 这些 ...

  9. 数据中心网络架构的问题与演进 — 传统路由交换技术与三层网络架构

    戳蓝字"CSDN云计算"关注我们哦! 文章目录 目录传统路由交换技术路由和交换交换技术传统的 2 层交换技术具有路由功能的 3 层交换技术具有网络服务功能的 7 层交换技术路由技术 ...

最新文章

  1. Httpservlet cannot be resolved to a type的原因与解决方法
  2. git/github 生成密钥
  3. WebApplication和WebSite有什么区别?我该选择哪个?
  4. Raspberry 4B 串口通信
  5. 华为云计算之ebackup了解
  6. 基于S3C2440A+SDRAM(K4M51163)
  7. css-modules 简介
  8. 为什么我们不要 .NET 程序员
  9. javaweb开发之处理表单上传文件和文件下载
  10. js 和java有关系吗,javascript和JAVA有什么关系
  11. c ++查找字符串_C ++类和对象| 查找输出程序| 套装4
  12. 根据rtk参数在arcgis中进行可视化
  13. zsh of kali
  14. 已知矩阵 matlab,在MATLAB中,已知矩阵A,那么A(:,2:end)表示
  15. 1003 Emergency
  16. win7家庭版安装oracle,win7 home 版安装 Oracle 10g
  17. 搭建自己的ngrok服务
  18. 什么是网络操作系统?网络操作系统具有哪些基本功能?
  19. SN号获取及显示不全的问题
  20. python的加减乘除运算_python四则运算

热门文章

  1. mysql 授予数据库权限_MySQL:授予**对数据库的所有**权限
  2. IT职业教育(3)IT教育的商道
  3. 实验十四 团队项目评审课程学习总结
  4. 【BZOJ2427】【HAOI2010】软件安装(树形依赖背包,缩点)
  5. 三级分销系统是什么模式,三级分销模式合法吗?三级分销合法吗
  6. 英特尔CPU工艺发展史
  7. 微信小程序开发系列——注册申请
  8. 测量面积的手机软件有哪些?这两个不能错过
  9. 北京防灾科技学院计算机怎么样,防灾科技学院
  10. 干货:Hulu教你赴美工作怎么拿签证!