1. SNMP介绍

SNMP(简单网关协议,Simple Network Management Protocol)是专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。SNMP的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后人们对SGMP进行了很大的修改,特别是加入了符合Internet定义的SMI和MIB,改进后的协议就是著名的SNMP。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。

基于TCP/IP的SNMP网络管理框架由3个主要部分组成,即管理信息结构SMI(Structure ofManagement Information)、管理信息库MIB和管理协议SNMP。

  • SMI:定义了SNMP框架所用信息的组织和标识,为MIB定义管理对象及使用管理对象提供模板。

  • MIB:定义了可以通过SNMP进行访问的管理对象的集合。

  • SNMP协议:定义了网络管理者如何对代理进程的MIB对象进行读写操作。

2. SNMP管理模型

SNMP的管理模型由SNMP管理站和SNMP代理组成,对网络的管理与维护是通过SNMP管理站与SNMP代理之间的交互工作完成的。SNMP管理站是一个中心节点,负责收集维护各个SNMP元素的信息,并对这些信息进行处理,最后反馈给网络管理员;而SNMP代理是运行在被管理的网络节点之上,负责统计该节点的各项信息,并且与SNMP管理站交互,接收并执行管理站的命令,上传各种本地的网络信息。

下图是SNMP的管理模型,包括四个部分:网络管理系统NMS(Network Management Station)、代理进程Agent、被管对象Management object和管理信息库MIB(Management Information Base)四部分组成。

3. SNMP 报文结构

目前SNMP有三个版本,分别是SNMP v1、SNMP v2c和SNMP v3。

  • SNMP v1是SNMP协议的最初版本,不过众多厂家依然支持实现SNMP v1。

  • SNMP v2是基于Community的SNMP实现。Community实质上就是密码。

  • SNMP v3 是最新版本的SNMP。它对网络管理最大的贡献在于其安全性,增加了对认证和密文传输的支持。

SNMPv1/v2c报文结构

报文中的主要字段定义如下:

  • 版本:表示SNMP的版本,如果是SNMPv1报文则对应字段值为0,SNMPv2c则为1。

  • 团体名:用于在Agent与NMS之间完成认证,字符串形式,用户可自行定义。团体名包括“可读”和“可写”两种,执行GetRequest、GetNextRequest操作时,采用“可读团体名”进行认证;执行Set操作时,则采用“可写团体名”认证。

  • SNMPv1/SNMPv2c PDU:包含PDU类型、请求标识符、变量绑定列表等信息。

SNMPv3报文结构

SNMP报文中的主要字段定义如下:

  • 版本:表示SNMP的版本,SNMPv3报文则对应字段值为2。

  • 报头数据:主要包含消息发送者所能支持的最大消息尺寸、消息采用的安全模式等描述内容。

  • 安全参数:包含SNMP实体引擎的相关信息、用户名、认证参数、加密参数等安全信息。

  • Context EngineID:SNMP唯一标识符,和PDU类型一起决定应该发往哪个应用程序。

  • Context Name:用于确定Context EngineID对被管理设备的MIB视图。

  • SNMPv3 PDU:包含PDU类型、请求标识符、变量绑定列表等信息。

4. SNMP v1/v2工作原理

SNMPv1和SNMPv2c的工作原理基本一致,如下图。

下面以Get操作来说明SNMP的工作原理:假定NMS想要获取被管理设备MIB节点sysContact的值,使用可读团体名为public,过程如下所示:

  1. NMS:向Agent发送Get请求报文。报文中各字段的设置如下:版本号为所使用的SNMP版本;团体名为public;PDU中PDU类型为Get类型,绑定变量填入MIB节点名sysContact。

  2. Agent:首先对报文中携带版本号和团体名进行认证,认证成功后,Agent根据请求查询MIB中的sysContact节点,得到sysContact的值并将其封装到Response报文中的PDU,向NMS发送响应;如果查询不成功,Agent会向NMS发送出错响应。

5. SNMP v3工作原理

SNMPv3提出了一个新的体系结构,即SNMPv3实体。SNMPv3实体可以分为SNMPv3引擎(SNMPv3 Engine)和SNMPv3应用程序(SNMPv3 Application),引擎与应用程序均由多个小模块组成。

SNMPv3由于采用了用户安全模块USM(User-based Security Model)和基于视图的访问控制模块VACM(View-based Access Control Model),在安全性上得到了提升。

  • USM:提供身份验证和数据加密服务。实现这个功能要求NMS和Agent必须共享同一密钥。

    • 身份验证:身份验证是指Agent或NMS接到信息时首先必须确认信息是否来自有权限的NMS或Agent并且信息在传输过程中未被改变。RFC2104中定义了HMAC,这是一种使用安全哈希函数和密钥来产生信息验证码的有效工具,在互联网中得到了广泛的应用。SNMP使用的HMAC可以分为两种:HMAC-MD5-96和HMAC-SHA-96。前者的哈希函数是MD5,使用128位authKey作为输入。后者的哈希函数是SHA-1,使用160位authKey作为输入。

    • 加密:加密算法实现主要通过对称密钥系统,它使用相同的密钥对数据进行加密和解密。加密的过程与身份验证类似,也需要管理站和代理共享同一密钥来实现信息的加密和解密。SNMP使用以下三种加密算法:DES、3DES、AES

  • VACM:对用户组或者团体名实现基于视图的访问控制。用户必须首先配置一个视图,并指明权限。用户可以在配置用户或者用户组或者团体名的时候,加载这个视图达到限制读写操作、Inform或Trap的目的。

SNMPv3的实现原理和SNMPv1/SNMPv2c基本一致,唯一的区别是SNMPv3增加了身份验证和加密处理。下面以Get操作为例介绍下SNMPv3的工作原理。

假定NMS想要获取被管理设备MIB节点sysContact的值,使用认证加密方式,过程下图所示:

  • NMS:向Agent发送不带安全参数的Get请求报文,向Agent获取Context EngineID、Context Name和安全参数。

  • Agent:响应NMS的请求,并向NMS反馈请求的参数。

  • NMS:再次向Agent发送Get请求报文,报文中各字段的设置如下:

    • 版本:SNMP v3版本。

    • 报头数据:指明采用认证、加密方式。

    • 安全参数:NMS通过配置的算法计算出认证参数和加密参数,并填入相应字段。

    • PDU:将获取的Context EngineID和Context Name填入相应字段,PDU类型设置为Get,绑定变量填入MIB节点名sysContact,并使用已配置的加密算法对PDU进行加密。

  • Agent:首先对消息进行认证,认证通过后对PDU进行解密。解密成功后,Agent根据请求查询MIB中的sysContact节点,得到sysContact的值并将其封装到Response报文中的PDU,并对PDU进行加密,向NMS发送响应。如果查询不成功或认证、解密失败,Agent会向NMS发送出错响应。

6. SNMP V3的Java实现

在发起Snmp请求时,需要先建立SNMP Session。如下代码示例:

 UserTarget target = new UserTarget(); target.setAddress(GenericAddress.parse(sb.toString())); target.setRetries(retries); target.setTimeout(timeout); target.setVersion(SnmpConstants.version3); target.setSecurityLevel(SecurityLevel.AUTH_PRIV); target.setSecurityName(new OctetString(user)); SnmpSession session = new SnmpSession(); session.setTarget(target); session.addUsmUser(new OctetString(user),            oidAuthProtocol,            octAuthPassphrase,            oidPrivProtocol,            octPrivPassphrase);

和Snmp V1/V2C最大的区别在于,创建SnmpV3 Session时需要加入UsmUser安全认证模式。代码实现如下:

public void addUsmUser(OctetString octSecurityName, OID oidAuthProtocol,       OctetString octAuthPassphrase, OID oidPrivProtocol,       OctetString octPrivPassphrase) {   USM usm = new USM(SecurityProtocols.getInstance(),             new OctetString(MPv3.createLocalEngineID()),             0);   SecurityModels.getInstance().addSecurityModel(usm);   snmp.getUSM()           .addUser(octSecurityName,                   new UsmUser(octSecurityName,                        oidAuthProtocol,                        octAuthPassphrase,                        oidPrivProtocol,                        octPrivPassphrase));}

7. PIGOSS的实现和扩展SNMP指标

可以支持Snmp进行数据采集的工具和产品很多,但是能很好支持Snmp V3的工具并不多。PIGOSS监控管理系统支持对市面上常用网络设备的监控,支持 SNMP 轮巡的数据采集,兼容SNMP v1,SNMP v2c和SNMP v3。

对于自动发现,可以采用SNMPScan方式对设备进行Snmp扫描,获取设备的Sysoid,从而对设备类型进行识别。

如果对于“陌生“的设备,如果支持SNMP,PIGOSS提供了SNMP扩展指标来进行数据采集和监控。只需要配置这个设备的oid,定义一个自定义的SNMP指标,就可以完成对这个设备的监控。如下图:

举报/反馈

PIGOSS运维管理系统

91获赞 48粉丝
IT运维监控系统 PIGOSS BSM
网利友联科技(北京)有限公司
关注
0
0
收藏
分享