SNMP介绍与netsnmp库使用

SNMP协议

SNMP基础概念

概述

  • 简单网络管理协议(Simple Network Management Protocol),该协议能够支持网上管理系统,用以监测连接到网络上的设备的情况。它由一组网上管理的标准组成,包含应用层协议(基于UPD)、数据库模式(MIB库)和一组数据对象。
  • 基本思想:统一不同设备、不同生产厂家、不同型号的设备的接口和协议。

SNMP示意图

SNMP系统的三大基本组件

  • 网管系统(NMSs,Network-management systems):该应用程序监视并控制被管理的设备。
  • 被管理的设备(managed device):每个被管理的设备都是一个节点,被管理的设备透过管理信息库(MIB)收集并存储管理信息,并且让网管系统能够透过SNMP代理者获取这项信息。
  • 代理者(agent):是一种存在于被管理的设备中的网管软件模块。代理者控制本地机器的管理信息,以和SNMP兼容的格式发送这项信息。

SNMP协议的常见版本

SNMP通常支持多个版本:通常是SNMPv1、SNMPv2c和SNMPv3。

  • SNMPv1:是SNMP协议的最初版本,提供最小限度的网络管理功能( 读、写MIB功能),存在较多安全缺陷(团体字可见于报文)。
  • SNMPv2c:增加批量数据的获取(GetBulk操作),inform报文在发出报文之后能收到响应报文,仍使用团体字。(常用该版本)
  • SNMPv3:主要在安全性方面进行了增强,USM技术提供了认证和加密功能,VACM技术确定用户是否允许访问特定的MIB对象以及访问方式。

Community的安全问题(SNMPv1与v2c)

  • 分为:只读密码/只写密码
  • 密码:纯明文传输
  • SNMPv3:使用完整性校验、认证和加密提升了安全性

SNMPv3

  • USM(基于用户的安全模型):USM引入了用户名和组的概念,可以设置认证和加密功能。认证用于验证报文发送方的合法性,避免非法用户的访问;加密则是对NMS和Agent之间传输的报文进行加密,以免被窃听。通过有无认证和有无加密等功能组合,可以为NMS和Agent之间的通信提供更高的安全性。
  • VACM(基于视图的访问控制模型):VACM技术定义了组、安全等级、上下文、MIB视图、访问策略五个元素,这些元素同时决定用户是否具有访问的权限,只有具有了访问权限的用户才能管理操作对象。在同一个SNMP实体上可以定义不同的组,组与MIB视图绑定,组内又可以定义多个用户。当使用某个用户名进行访问的时候,只能访问对应的MIB视图定义的对象。

MIB管理信息库

  • 树状数据库
  • 每个节点都有ID
  • 每一个节点表示:一个可以查询的资源,如:CPU利用率、路由表、接口的IP地址表等等。
  • 示例:ip结点下一个名字为ipInReceives的MIB变量(对应数字值为3)

在这里插入图片描述

  • 该变量的名字:iso.org.dod.internet.mgmt.mib.ip.ipInReceives

  • 其对象标识符OID(唯一标识某MIB对象):1.3.6.1.2.1.4.3

  • 当网络管理协议在报文中使用MIB变量时,每个变量名后还要加一个后缀,以作为该变量的一个实例。如ipInReceives的实例数字表示为:1.3.6.1.2.1.4.3.0。(.0往往表示该节点的内容)

  • 本机mib库示例
    在这里插入图片描述

查看MIB库的软件

  • OidView
  • SnmpB
  • 华为:官网下载 MIB文件 和 指南
  • 思科:官网有 搜索工具(translate.browse/cisco mib locator)

SNMP常用操作

最基本的三种操作

  • get:manager始发,想要看什么。
  • set:manager始发,想要设置什么。
  • trap:agent始发,告知manager一些情况。
  • 默认端口号:
    • manager始发的操作(get,set),使用UDP端口161
    • agent始发的操作(trap),使用UDP端口162
  • SNMP工作示意图
    在这里插入图片描述

SNMP报文格式

  • 一个SNMP报文共有三个部分组成,即公共SNMP首部、get/set首部/trap首部、变量绑定。

在这里插入图片描述

  • 报文示例图
    在这里插入图片描述

  • get-next-request
    在这里插入图片描述

  • get-response
    在这里插入图片描述

关注字段
  • 版本:SNMP版本
  • 共同体:团体字(community),类似密码
  • 变量绑定(variable-bindings):oid节点名称 和 唯一标识符

SNMP七种操作

get-request
  • 获取指定OID,只要一个信息
get-next-request
  • 获取指定OID的下一个OID,以这样的方式获取该OID下的所有子节点,常用于获取表格信息

  • 示例:有时候OID节点不是一个点,而是一个表。
    在这里插入图片描述

  • 子节点为一列
    在这里插入图片描述

getBulkRequest
  • 获取1个节点的所有子节点,效率比getnext更高。
get-response
  • 响应请求,返回结果
  • 报文中的value即为 某oid的结果内容
set-request
  • 设置指定OID,要一个信息
trap
  • 由agent始发,去往manager,用162端口
informRequest
  • inform用于确认trap操作。

snmpwalk工具

  • snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。
  • snmpwalk -v 1或2c(代表SNMP版本) -c SNMP密码 IP地址 OID(对象标示符)
    • –v:指定snmp的版本, 1或者2c,该参数必须有。
    • –c:指定连接设备SNMP读密码,该参数必须有。
    • IP:指定要walk的设备的IP地址,该参数必须有。
    • OID:代表要获取设备的指标oid,该参数不是必须的。(默认:遍历所有OID)
  • v3版本:参数不同
  • 示例:snmpwalk -c public -v 2c 10.211.55.3 ifName
    在这里插入图片描述

常用操作

snmpwalk
  • 因为基于get-next,可以获取多种类型节点(点,列,表等)
  • 对各种类型 标识码和节点名称,支持更好。
oid的几种转型
  • .1.3.6.1.2.1.1.1.0
  • .1.3.6.1.2.1.1.1
  • 1.3.6.1.2.1.1.1
    在这里插入图片描述
snmpget
  • 专门 点状oid,必须加.0
  • snmpget -c public -v 2c 10.211.55.3 sysDescr.0
    在这里插入图片描述
snmptable
  • 专门获取 表装节点,显示为 表状结构
  • snmptable -c public -v 2c 10.211.55.3 ifXTable
snmpbulkget
  • 基于snmp的getbulk操作
  • snmpbulkget -c public -v 2c 10.211.55.3 .1.3.6.1.2.1.1
    在这里插入图片描述

netsnmp-python库的使用

代码示例

import netsnmp

# 建立会话
session = netsnmp.Session(Version=2, DestHost=host, Community=community, Timeout=3000000, Retries=1)
# 变量绑定
var_list = netsnmp.VarList(netsnmp.Varbind(oid))
# walk方法注意不写最后的 .0
res = session.walk(var_list)
# get方法获取单个点
res = session.get(var_list)

用法介绍

建立会话及参数

  • Session方法:建立会话
    • Version:协议版本选择
    • DestHost:目标IP
    • Community:团体字
    • Timeout:超时设置(单位:微秒)
    • Retries:重试次数

变量绑定

  • Varbind可以绑定 变量名(ifIndex) 或 唯一标识符(.1.3.6.1.2.1.2.2.1.1),也可以组合使用。
  • VarList可以绑定多个变量
  • VarList中有一个变量错误,则List全部错误

常用方法

walk方法
  • 类似snmpwalk,基于get-next操作,可以获取多种类型oid。
  • 返回值:返回含有字符串的元组,失败则返回空元组。
  • 注意:此方法的oid节点不要.0,同时无法访问 列节点的指定行(ifName.1)。
get方法
  • 只能获取 点状oid。
  • 返回值:返回含有字符串的元组,失败则返回含有None的元组。
  • 注意:此方法的oid节点需要.0,可以访问ifName.1。

生产环境注意

  • netsnmp库其所有返回值,只含有 节点内容部分。
    • snmpwalk工具:则返回,变量名+完整节点,数据类型 和 节点内容。
  • 需要端口索引与端口名称,访问 ifIndex 和 ifName。
    • 端口索引与相关资源的oid内容可能有对应关系。
  • 流量节点:IF-MIB::ifHCInOctets,IF-MIB::ifHCOutOctets是累计数据。
    • 项目经验:流速=(现在数据-redis数据)/时间差
    • 有些oid不是完整的累计数据,有些节点由 高字节 和 低字节数据 组合而成。
  • 设备会有多个单板,使用什么槽位(单板),需要参考实际情况。

扩展与参考资料

猜你喜欢

转载自blog.csdn.net/weixin_42359693/article/details/83792427