细说SNMP v3协议和网络设备监控实现

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指标,就可以完成对这个设备的监控。如下图: 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值