简单网络管理协议(Simple Network Management Protocol,SNMP)是由互联网工程任务组定义的一套网络管理协议。该协议是基于简单网关监视协议(Simple Gateway Monitor Protocol,SGMP)制定的。
SNMP 可以使网络管理员通过一台工作站完成对计算机、路由器和其他网络设备的远程管理和监视。利用 SNMP 协议可以更好地管理和监控网络。管理工作站可以远程管理所有支持该协议的网络设备,如监视网络状态、修改网络设备配置、接收网络事件警告等。
原来只能用telnet这种方法一台一台查看管理,一下子就变成了统一管理,果然懒才是社会进步的一大动力
1.目的
SNMP是一种简单的UDP协议,通常用来管理一些网络设备,例如路由器,交换机等设备;
SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。
统一接口,统一定义,统一方式,秦始皇诚不我欺
2.组成
我们常接触到的分为两部分,管理者NMS和代理Agent,可以简单的认为就是服务端和客户端,另外还有一个关键概念:MIB;
NMS:运行在服务器上的服务,作为一个中心节点,负责收集维护各个SNMP元素的信息,并对这些信息进行处理,最后反馈给网络管理员;
SNMP代理:运行在各个被管理的网络节点之上的程序,负责统计该节点的各项信息,并且负责与NMS交互,接收并执行管理站的命令,上传各种本地的网络信息;
MIB(管理信息库):任何一个被管理的设备都表示成一个对象,并称为被管理的对象。而 MIB 就是被管理对象的集合。它定义了被管理对象的一系列属性,如对象的名称、对象的访问权限和对象的数据类型等。每个设备都有自己的 MIB。MIB 是一种树状数据库,MIB 管理的对象,就是树的端节点,每个节点都有唯一位置和唯一名字。就像买东西一样,你我商量好,我说名字,你取实物给我,mib就是这种统一命名的对象。
3.通讯方法
常用的通讯方式和我们理解的客户端上报为主的方式不太一样,SNMP最常用的是NMS服务端下发命令,读取客户端数据,然后客户端偶尔会上报一些报警或者异常通知。
此处涉及到了两个关键端口,NMS服务端下发命令通过目的端口UDP161,客户端上报数据通过目的端口162。具体方法详见下一小节。
4.版本
SNMP协议目前在用的有3个版本,分别是V1,V2C,V3,主要差异在方法不同、安全性、消息封装格式、GET效率等方面。
SNMP V1方法:
- Get(获取参数值,不能遍历table类型的参数组)
- GetNext(可获取table类型的参数值,一组参数)
- Set(设置参数值)
- Trap(发送告警)
- Response(GET操作的响应信息)
SNMPv1使用团体字(community)来作为身份认证信息。当Agent接收到与其一样的团体字的管理端消息后才会进行消息应答。V1整个消息采用明文传送,通过wireshark/tcpdump等抓包工具可看到明文。
SNMP V2C
- Get(获取参数值,不能遍历table类型的参数组)
- GetNext(可获取table类型的参数值,一组参数)
- GetBulk(GetBulk操作所对应的基本操作是GetNext,通过对Non repeaters和Max repetitions参数的设定,高效率地从Agent获取大量管理对象数据,如果get-request中的参数有一个不存在,请求照样会被正常执行;而在SNMPv1种将收到一个错误消息)
- Set(设置参数值)
- Trap(发送告警)
- inform(相当于Trap的升级版,但是Trap消息发出去之后不会收到响应消息,而inform消息在发出之后能收到响应消息)
- Response(GET操作的响应信息)。
V2C也采用团体字认证,整个消息采用明文传送。
SNMP V3
- Get(获取参数值,不能遍历table类型的参数组)
- GetNext(可获取table类型的参数值,一组参数)
- GetBulk(GetBulk操作所对应的基本操作是GetNext,通过对Non repeaters和Max repetitions参数的设定,高效率地从Agent获取大量管理对象数据,如果get-request中的参数有一个不存在,请求照样会被正常执行;而在SNMPv1种将收到一个错误消息)
- Set(设置参数值)
- Trap(发送告警)
- inform(相当于Trap的升级版,但是Trap消息发出去之后不会收到响应消息,而inform消息在发出之后能收到响应消息)
- Response(GET操作的响应信息)
- report(当消息不能解密时发送该消息)
V3采用了USM和VACM技术。USM提供了认证和加密功能,VACM确定用户是否允许访问特定的MIB对象以及访问方式。USM(基于用户的安全模型):Agent通过对管理端消息中携带的用户、密码(采用MD5或者SHA加密)、authkey(认证秘钥)以及engineid(agent的标识码)对消息进行鉴权和完整性验证,整个消息体采用DES进行加密。V3数据消息采用密文传送,通过wireshark/tcpdump等抓包工具不可见其实际的内容。
开发
前面都是些基础概念,知道就行,作为程序员,关键还得会用,
通常在开发过程中,有两种方式实现NMS,涉及到的开源软件就是Net snmp,既提供了命令行的操作,也提供了c语言的lib,还提供了Agent的功能。
在Centos上只需要简单的
yum install net-snmp-*
即可完成全部需要的(不需要的)软件安装。
C 语言
直接调用 API 进行 SNMP Trap 处理
所需要的头文件
为了使用 netsnmp 的 API,必须 include 以下这些头文件:
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
命令行
命令 | 功能 |
snmpget | 用来查询叶子节点 |
snmpbulkget | snmpget 优化版 |
snmpgetnext | 通过父节点查询叶子节点 |
snmpwalk | 用来取得所有类识别代码 (OID, Object Identifier) |
snmpbulkwalk | snmpwalk优化版 |
snmptable | 用来查询表对象 |
snmpset | 修改数据 |
snmpinform | 向网管发送一个SNMP trap,并得到相应 |
snmptrap | 向网管发送一个SNMP trap |
Agent
直接运行snmpd即可运行为Agent,然后调用一个模拟器即可进行数据获取。
具体的细节内容还很多,我就不一一细说了,因为我也不知道。