网络管理协议SNMP的相关介绍与应用
发布时间:2020-07-31 来源: 118云vps 阅读:
1.1什么是SNMP
SNMP是英文”Simple Network Management Protocol”的缩写,中文意思是”简单网络管理协议”。SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。由于SNMP协议简单可靠 ,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。
1.2SNMP协议构成
SNMP协议主要由两大部分构成:
SNMP管理站是一个中心节点,负责收集维护各个SNMP元素的信息,并对这些信息进行处理,最后反馈给网络管理员。
SNMP代理运行在各个被管理的网络节点之上,负责统计该节点的各项信息,并且负责与SNMP管理站交互,接收并执行管理站的命令,上传各种本地的网络信息。
1.3SNMP工作方式
两者之间是松耦合的关系,使用UDP协议进行通讯,默认端口是UDP161(也会用到162端口接收trap数据)
SNMP管理站通过向SNMP代理发送请求命令(GetRequest, GetNextRequest, GetBulkRequest或InformRequest),当SNMP代理收到命令后返回响应(Response)
SNMP管理站向SNMP代理发送SetRequest,代理设备执行设置操作。
SNMP代理发生特定重要状况改变时主动向SNMP管理站发送Trap消息。
1.4SNMP版本
SNMP目前共有v1,v2,v3这三个版本:
SNMP v1是SNMP协议的最初版本,不过依然是众多厂家实现SNMP基本方式。
SNMP v2通常被指是基于community的SNMP V2。Community实质上就是密码,默认为public
SNMP v3 是最新版本的SNMP。它对网络管理最大的贡献在于其安全性。增加了对认证和密文传输的支持。
1.5什么是MIB和OID
管理信息库(MIB,Management Information Base)MIB定义了受管设备必须保存的数据项、允许对每个数据项进行的操作及其含义,可以理解为SNMP代理维护的管理对象数据库,MIB中定义的大部分管理对象的状态和统计信息都可以被SNMP管理站进行访问。
收录的MIB文档下载地址
对象标识符(Object identifier, OID)用于定位管理信息库对象的一种方法。OID是一个整数序列,中间以”.”分割,这些整数构成一个树型结构,类似于DNS。OID结构示意图如下:
二、SNMP应用举例
2.1SNMP应用说明
准备2台Linux云服务器,一台用于SNMP管理站,另一台用于SNMP代理。在SNMP管理站上对SNMP代理进行SNMP操作。
2台服务器版本信息如下:
操作系统版本:Ubuntu 18.04.2 LTS
操作系统内核:4.15.0-45-generic
SNMP管理站IP与hostname:172.16.1.247、ubuntu-efly-node-1
SNMP代理IP与hostname:172.16.1.246、ubuntu-efly-node-2
2.2创建SNMP管理站
在SNMP管理站服务器上安装Net-SNMP,Net-SNMP是比较常用的SNMP管理工具。命令如下:
Net-SNMP官方网站
#安装Net-SNMP
root@ubuntu-efly-node-1:~# apt install snmp -y
#检查安装结果
root@ubuntu-efly-node-1:~# snmpget -V
NET-SNMP version: 5.7.3
2.3创建SNMP代理
在SNMP代理服务器上安装SNMP代理,命令如下:
#安装SNMP代理服务
root@ubuntu-efly-node-2:~# apt install snmpd snmp snmp-mibs-downloader -y
#启动SNMP代理服务并设置开机启动
root@ubuntu-efly-node-2:~# systemctl start snmpd
root@ubuntu-efly-node-2:~# systemctl enable snmpd
#检查SNMP代理服务是否启动成功
root@ubuntu-efly-node-2:~# ss -lnu | grep 161
UNCONN 0 0 127.0.0.1:161 0.0.0.0:*
在SNMP代理上,设置SNMP版本认证信息等。这里以使用snmp v2版本,community设置为public为例,命令如下:
#修改snmp代理服务配置文件
root@ubuntu-efly-node-2:~# cp /etc/snmp/snmpd.conf{,.ori}
root@ubuntu-efly-node-2:~# vim /etc/snmp/snmpd.conf
#修改snmp代理服务监听地址
agentAddress udp:172.16.1.246:161
#修改snmp代理服务权限
view systemonly included .1
#修改后重启snmp代理服务
root@ubuntu-efly-node-2:~# systemctl restart snmpd
root@ubuntu-efly-node-2:~# ss -lnu | grep 161
UNCONN 0 0 172.16.1.246:161 0.0.0.0:*
2.4在SNMP管理站获取SNMP代理状态
现在,我们可以在SNMP管理站服务器获取/设置SNMP代理服务器的相关信息。在获取SNMP代理的信息前,我们需要找到相关管理对象的OID,可以通过查看MIB库方式,更便捷的方法是直接到网上搜索。
Linux下常用OID
snmpget命令获取单个OID值
#获取SNMP代理服务器hostname信息
root@ubuntu-efly-node-1:~# snmpget -v 2c -c public 172.16.1.246:161 1.3.6.1.2.1.1.5.0
iso.3.6.1.2.1.1.5.0 = STRING: "ubuntu-efly-node-2"
#获取SNMP代理服务器物理内存大小
root@ubuntu-efly-node-1:~# snmpget -v 2c -c public 172.16.1.246:161 1.3.6.1.4.1.2021.4.5.0
iso.3.6.1.4.1.2021.4.5.0 = INTEGER: 10219176
snmpwalk命令一次获取多个OID值
#获取SNMP代理服务器内存相关所有值
root@ubuntu-efly-node-1:~# snmpwalk -v 2c -c public 172.16.1.246:161 1.3.6.1.4.1.2021.4
iso.3.6.1.4.1.2021.4.1.0 = INTEGER: 0
iso.3.6.1.4.1.2021.4.2.0 = STRING: "swap"
iso.3.6.1.4.1.2021.4.3.0 = INTEGER: 7811068
iso.3.6.1.4.1.2021.4.4.0 = INTEGER: 7811068
iso.3.6.1.4.1.2021.4.5.0 = INTEGER: 10219176
iso.3.6.1.4.1.2021.4.6.0 = INTEGER: 9031188
iso.3.6.1.4.1.2021.4.11.0 = INTEGER: 16842256
iso.3.6.1.4.1.2021.4.12.0 = INTEGER: 16000
iso.3.6.1.4.1.2021.4.13.0 = INTEGER: 10036
iso.3.6.1.4.1.2021.4.14.0 = INTEGER: 2204
iso.3.6.1.4.1.2021.4.15.0 = INTEGER: 648776
iso.3.6.1.4.1.2021.4.100.0 = INTEGER: 0
iso.3.6.1.4.1.2021.4.101.0 = ""
#获取SNMP代理服务器1、5、15分钟负载
root@ubuntu-efly-node-1:~# snmpwalk -v 2c -c public 172.16.1.246:161 1.3.6.1.4.1.2021.10.1.3
iso.3.6.1.4.1.2021.10.1.3.1 = STRING: "0.00"
iso.3.6.1.4.1.2021.10.1.3.2 = STRING: "0.00"
iso.3.6.1.4.1.2021.10.1.3.3 = STRING: "0.00"
三、SNMP开发举例
3.1SNMP开发举例说明
使用Python调用Net-SNMP包,实现获取SNMP代理信息。
Python版本:Python 3.7.0
Python Net-SNMP包:python3-netsnmp 1.1a1
3.2安装开发环境
1.安装Python 3.7.0
(略)
2.安装python3-netsnmp
pip install python3-netsnmp
3.3通过Python实现获取SNMP代理信息
1.编写Python脚本
import netsnmp
"""使用snmpget,获取SNMP代理服务器hostname信息和物理内存大小"""
sess = netsnmp.Session(Version=2,
DestHost='172.16.1.246',
Community='public')
sess.UseEnums = 1
sess.UseLongNames = 1
vars = netsnmp.VarList(netsnmp.Varbind('1.3.6.1.2.1.1.5', 0),
netsnmp.Varbind('1.3.6.1.4.1.2021.4.5', 0))
vals = sess.get(vars)
print("v2 sess.get result: ", vals, "\n")
2.运行Python脚本
[root@centos7-node-1 python370]# python net_snmp_test.py
v2 sess.get result: (b'ubuntu-efly-node-2', b'10219176')