5-1 SNMP协议v2和MibBrowser和snmp库
介绍
通过SSH协议和netmiko库,可以使用python代码远程登录服务器设备并执行命令。但当问题更复杂时,比如上传、下载配置,判断工作状态,甚至个别情况下伪终端不能完成特定功能。 需要一种专用于管理网络设备的协议。
(摘自维基百科)
SNMP:简单网络管理协议(SNMP,Simple Network Management Protocol)构成了互联网工程工作小组(IETF,Internet Engineering Task Force)定义的Internet协议族的一部分。 该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。它由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模式(database schema),和一组资料对象。
SNMP协议组件
在典型的SNMP用法中,有许多系统被管理,而且是有一或多个系统在管理它们。每一个被管理的系统上有运行一个叫做代理者(agent)的软件组件,且透过SNMP对管理系统报告信息。 基本上,SNMP代理者以变量呈现管理资料。管理系统透过GET,GETNEXT和GETBULK协议指令取回信息,或是代理者在没有被询问的情况下,使用TRAP或INFORM发送资料。管理系统也可以发送配置更新或控制的请求,透过SET协议指令达到主动管理系统的目的。配置和控制指令只有当网络基本结构需要改变的时候使用,而监控指令则通常是常态性的工作。 可透过SNMP访问的变量以层次结构的方式结合。这些分层和其他元数据(例如变量的类型和描述)以管理信息库(MIBs)的方式描述。
一个SNMP管理的网络由下列关键组件组成:
网络管理站NMS:(Network Management Station) NMS通常是一个独立的设备,运行网络管理应用程序。网络管理应用程序至少能够提供一个人机交互界面,网络管理员通过它完成绝大多数网络管理工作。
SNMP代理器:(Agent) Agent是驻留在被管理设备的一个软件模块,主要负责接收和处理来自NMS的请求报文,并形成响应报文,返回给NMS,在一些紧急情况下,它会主动发送Trap报文,通知NMS。
SNMP协议: SNMP协议属于应用层协议,基于UDP协议、默认端口161。用于在NMS和被管理设备间交互管理信息。
管理信息库MIB:(Management Information Base) MIB是一个被管理对象的集合,是NMS同Agent进行沟通的桥梁,可以使网管软件和设备进行标准对接。每一个Agent都维护这样一个MIB库,NMS可以对MIB库中对象的值进行读取或设置。
尝试简化这些新概念,计算机行业喜欢发明新名词。网络管理站--图形化客户端,代理器--设备上的snmp后台服务,Mib管理信息库--数据结构。
结合图示来理解:
整体架构
GET/SET: 从manager管理器对agent代理发送取信息或设置命令。 

eNSP配置
首先在S5700设备上配置ip和与物理机互通。详见2-1节。
(两种写法二选一)
简单版:<Huawei>sy [Huawei]interface vlanif 1 [Huawei-vlanif1]ip address 192.168.56.100 24 [Huawei-vlanif1]quit [Huawei-vlanif1]display ip interface brief # eNSP中连通后,GE0/0/1口隐式地与vlan1绑定。或
更为标准配置,显式地指明与vlan1绑定的GE口。<Huawei>system-view [Huawei]vlan batch 1 [Huawei]interface vlanif 1 [Huawei-vlanif1]ip address 192.168.56.100 24 [Huawei-vlanif1]quit [Huawei-vlanif1]display ip interface brief # 将GE0/0/1口显式与vlan 1口绑定,这样GE0/0/1口就有ip了,后面snmp设置时不会报警告。 [Huawei]interface GigabitEthernet 0/0/1 [Huawei-GigabitEthernet0/0/1]port link-type access [Huawei-GigabitEthernet0/0/1]port default vlan 1 [Huawei-GigabitEthernet0/0/1]quit开启snmp代理,使用SNMP v2c版协议,设置团体名read和密码Huawei@123 ,设置trap。
# 开启snmp-agent代理服务、开启所有协议版本、设置团体名(相当于一种用户组或简易密码的概念) # 下面四行代码结束后已经可以进行客户端的v2 GET测试。 [Huawei]snmp-agent [Huawei]snmp-agent sys-info version all [Huawei]snmp-agent community write public100 # 密码随意设置。习惯上read community默认设置public,write community private,这里我写反了,也可以设置成同一个密码。 [Huawei]snmp-agent community read public100 # 联系人,这两句可以省略 [Huawei]snmp-agent sys-info contact Zhangsan [Huawei]snmp-agent sys-info location Guangdong # 设置消息陷阱 [Huawei]snmp-agent trap source GigabitEthernet 0/0/1 # 这句可省略。可能报一个警告Warning: The interface has no IP address. Please specify an IP address later.因为配置vlan1 ip时没有显式地与GE0/0/1口绑定,不影响。 [Huawei]snmp-agent trap enable # 会询问 Warning: All switches of SNMP trap/notification will be open. Continue? [Y/N]:y 。属于y回车。 [Huawei]snmp-agent target-host trap address udp-domain 192.168.56.1 params securityname Test # 向网关192.168.56.1推送即可推送到物理机 # 下面两行display信息没有什么帮助,如果后面客户端连不上、确定客户端连接没问题、能ping通服务端,那么就把服务端snmp命令再输入一遍。 [Huawei]display snmp-agent community [Huawei]display snmp-agent sys-info # ------ # 上面的代码已经可以实验v2c协议。如果要配置v3 usm,再添加下面两行代码。 [Huawei]snmp-agent group v3 MyGroup privacy write-view ViewDefault [Huawei]snmp-agent usm-user v3 MyUser MyGroup authentication-mode sha admin123 privacy-mode des admin123 # ------ # display相关命令看不到什么重要信息,上面代码不输要输错不然不好排查。 # display snmp-agent community # display snmp-agent sys-info详细解释:
协议版本:v1、v2、v2c(v2的改进版)、v3(根据加密方式分为 USM(基于用户的安全模型)和 VACM(基于视图的访问控制模型))。
特性
SNMPv1
SNMPv2c
SNMPv3
认证方式
团体名
团体名
用户名/密码(基于密钥对USM、TSM)
安全性
低 (明文)
较低(明文)
高(密文)
数据检索
效率低
效率较高
效率较高
错误处理
简单
改进
改进
复杂操作
不支持
部分支持
支持
团体名:相当于账户组名或一种简易的密码。
snmp-agent target-host trap 向目标主机发送陷阱消息。 udp-domain 走udp协议、udp是snmp的底层协议。params SNMP参数。securityname Test 类似跟团体名。
客户端实验
概念
管理信息库MIB:
Mib(Management Information Base)MIB是一个被管理对象的集合,是NMS同Agent进行沟通的桥梁,可以使网管软件和设备进行标准对接。每一个Agent都维护这样一个MIB库,NMS可以对MIB库中对象的值进行读取或设置。
设备定义好了各种信息组成的Mib结构,程序员不需要自己写接口和定义,从而加速开发和保持结构统一。 
OID:
对象标识符(Object Identifier,OID),按照GB/T 17969. 1(ISO/IEC 9834-1)的定义,对象是指“通信和信息处理世界中的任何事物,它是可标识(可以命名)的,同时它可被注册”。 OID是与对象相关联的用来无歧义地标识对象的全局唯一的值,可保证对象在通信与信息处理中正确地定位和管理。通俗地讲,OID就是网络通信中对象的身份证。 由国际组织统一管理,管理方式类似域名,域名转化为数字后为OID,前面的几位比较固定 PowerNet-MIB {iso org(3) dod(6) internet(1) private(4) enterprises(1) apc(318) }
Mib查看器软件:
主要有MG-soft mibBrowser和iReasoning MibBrowser,比较小众,都收费且没有可用的盗版。github上一些开源软件也来自于十年前,说明后面会有更先进的技术取代SNMP。
下面选用ireasonging官网mibBrowser下载页 ,personal version free个人版免费,免费版支持snmp v1 v2(v2c)、不支持v3。
客户端1-安装iReasoning MibBrowser
连接服务器和几种实验
连接
输入服务器地址。
点击Advanced高级设置,输入团体名密码,服务器中设置为了public和private (与服务器中设置的保持一致)。输入协议版本,服务器中开启了v1 v2 v3所有版本。
点击go按钮进行连接。成功后自动走nextvalue方法得到第一个值。

GET取单个值:
展开mib顶层目录,找到iso.org.dod.internet.mgmt.mib-2/systems/sysName。双击鼠标左键或单击右键选GET请求。
得到sysName的值结果为huawei, 另外左下角可以观察到代表sysName的OID ,复制到后面python代码中。
右键点击Mib树,get-bulk可以批量查看更多值。
SET设置值:
展开mib顶层目录,找到iso.org.dod.internet.mgmt.mib-2/systems/sysName。
鼠标右键菜单/SET。
对话框中填写新值。
eNSP中设备终端中发现设备名变化了。

Trap Receive捕获消息:
打开MibBrowser 菜单栏/tools/trap receiver。刚开始trap receiver内容为空白。
eNSP设备端终端里执行
sysname Switch1触发改设备名操作。MibBrowser中的TrapReceiver接收到了信息

python snmp库
选型:
pysnmp:pysnmp(课本上)库经测试库版本和代码已经大幅度变化,代码方法名变化、包路径变化和开始异步写法。课本和网上博文代码对应的是4.x版本,现在已经是8.x版本,后面的都是async语法的,文档也不全。
snmp: 下面例子选用 snmp docs 同步写法。
其它:netty-snmp看上去高度封装、代码简单、同步异步都支持、有文档,但安装失败(应该会在后续版本中修复)。还有些库开始基于async异步写法没有同步的简单好理解。
安装snmp库 Windows终端下执行
pip默认安装最新版,指定了具体版本号。
(本校校园网一定概率封pypi.org,可能上节课请求的人多,加-i参数和国内源)
代码 snmp库文档
其它
参考文章 知乎专栏-snmp实验
eNSP-SNMP配置+SnmpB的搭建
抓包查看get请求和响应包:自行实验,eNSP设备右键抓包,mibBrowser软件发起get请求。
set实验:通过mibBrowser,set值修改设备名,未成功。 trap实验:打开关闭GE0/0/2口触发trap捕获消息,未成功,mibbrowser配置时提示162端口已经绑定。
思考:SNMP的缺点。