《从零理解SNMP协议:网络监控系统的设计与实现》
- 什么是SNMP?
- SNMP是广泛应用于TCP/IP网络的网络管理标准协议,该协议能够支持网络管理系统,用以检测连接到网络上的设备是否有任何引起管理上关注的情况。
- SNMP采用轮询的机制,提供最基本的功能及,适合小型、快速、低价格的环境使用,而且SNMP以UDP报文为承载,因而受到绝大多数设备的支持,同时保证管理信息在任意两点传送,便于管理员在网络上的任何节点检索信息,进行故障排查
- 为什么使用SNMP?
- 网络设备数量成几何级数增加,网络管理员对设备的管理变得困难,晚会罗 作为一个复杂的分布式系统,覆盖地域大,对设备的实时监控和故障排查变的困难
- 网络设备多种多样,不同厂商提供的管理接口各不相同
- SNMP应运而生,利用网络管理网络的方式
- 网络管理员利用snmp平台在网络上的任意节点完成信息查询、信息修改和故障排查等工作
- 屏蔽了设备间的物理差异,SNMP仅提供最基本的功能集,使得管理任务与被管理任务的物理特性、网络类型相互独立,因而实现对不同设备的统一管理,管理成本低
- 设计简单、运行代价低,SNMP采用尽可能简单的设计思想,其在设备上添加硬件、软件、报文的种类和报文的格式都力求简单,因此运行SNMP给设备造成的影响和代价都被最小化
- SNMP的基本组件
- NMS(Network Management System)
- 管理者的角色,是一个采用SNMP协议对网络设备进行管理/见识的系统,运行在NMS服务器上
- NMS可以向设备上的Agent发出请求,查询或修改一个或多个具体的参数值
- NMS可以接受设备上的Agent主动发送的Trap信息,以获知被管理设备当前的状态
- 管理者的角色,是一个采用SNMP协议对网络设备进行管理/见识的系统,运行在NMS服务器上
- 代理进程(Agent)
- 被管理设备中的衣蛾代理进程,用于维护和管理设备的信息数据并相应来自NMS的请求,把管理数据汇报给发送请求的NMS
- Agent收到NMS的请求信息后,通过MIB表完成相应指令后,并把操作结果响应给NMS
- 当设备发生故障或其他事件时,设备会通过Agent主动发送信息给NMS,向NMS报告设备当前的状态变化
- 被管理设备中的衣蛾代理进程,用于维护和管理设备的信息数据并相应来自NMS的请求,把管理数据汇报给发送请求的NMS
- 被管对象(Managed Object)
- 每一个设备可能包含多个被管理对象,被管理对象可以是设备中的某个硬件,也可以是在硬件、软件上配置的参数集合
- 管理信息库MIB(Management Information Base)
- MIB是一个数据库,指明了被管理设备所维护的变量,是能够被Agent查询和设置的信息。MIB在数据库中定义了被管理设备的一系列属性:对象的名称、对象的状态、对象的访问权限和对象的数据类型等。
- Agent通过查询MIB,可以获知设备当前的状态信息
- Agent通过修改MIB,可以设置设备的状态参数
- MIB是一个数据库,指明了被管理设备所维护的变量,是能够被Agent查询和设置的信息。MIB在数据库中定义了被管理设备的一系列属性:对象的名称、对象的状态、对象的访问权限和对象的数据类型等。
- NMS(Network Management System)
- SNMP端口
- SNMP端口是SNMP的通信端电脑,SNMP消息传输通过UDP进行,通常使用UDP端口号161/162,有时候也使用TLS和DTLS
- SNMP端口是SNMP的通信端电脑,SNMP消息传输通过UDP进行,通常使用UDP端口号161/162,有时候也使用TLS和DTLS
- SNMP如何工作?
- 一旦网络中启动SNMP协议,NMS作为整个网络的网管中心,会对设备进行管理。每个被管理设备都包含驻留在设备上的Agent,多个被管对象和MIB。NMS通过与在被管理设备上的Agent交互,由Agent通过对设备端的MIB的曹组,完成NMS指令。
- 操作类型
- 工作原理:基于代理和管理器之间的通信。
- 管理器是网络管理系统的一部分,负责监视和控制网络中的设备和应用程序。
- 代理是安装在被管理设备上的软件模块,负责收集设备的信息并响应来自管理器的SNMP的请求
- 具体步骤
- 管理器发送请求:管理器向代理发送SNMP请求,请求获取特定的信息
- 代理处理请求:代理接收到请求后,根据请求类型执行相应的操作,如获取设备状态、配置信息等
- 代理发送响应:代理将请求的结果打包成SNMP相应,并发送回管理器
- 管理器处理响应:管理器接收到响应后,解析先攻数据并响应的进行处理,如显示状态信息、生成警报等。
- 使用SNMP的实例
-
from pysnmp.hlapi import *# 定义SNMP请求 snmp_object = ObjectIdentity('IF-MIB', 'ifInOctets', 1) snmp_target = SnmpEngine() snmp_community = CommunityData('public', mpModel=0) snmp_context = ContextData()# 发送SNMP请求 snmp_data = getCmd(snmp_target, snmp_community, snmp_object, snmp_context)# 处理SNMP响应 error_indication, error_status, error_index, var_binds = next(snmp_data) if error_indication: print('SNMP请求错误:', error_indication) else: if error_status: print('SNMP错误:', error_status.prettyPrint()) else: for var_bind in var_binds: oid = var_bind[0] value = var_bind[1] print('OID:', oid) print('值:', value)
- 参考文章
什么是SNMP?为什么需要SNMP? - 华为
详细介绍SNMP协议的原理、功能和应用_如何在软件中应用snmp-CSDN博客
网络工程师必知:SNMP是什么?如何配置? - 知乎