《实战录》导语
云端卫士《实战录》栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,2017年我们将一如既往地为朋友们奉献更多优质内容。本期分享人为云端卫士大数据工程师谢志博,主要介绍简单网络管理协议(SNMP)。
SNMP(Simple Network Management Protocol),中文名是简单网络管理协议,该规范是由IETF在1990年五月发布的RFC 1157中定义。
SNMP为网管界定了管理者(Manager)和代理者(Agent,被管理设备)之间的关系。管理者可对管理设备提出效能、配置、和状态等信息的询问,透过要求与回复(request/replay)的简单机制来查询代理者的当前信息,两者之间主要是通过PDU协议数据单元来载送。SNMP使用UDP作为IP的传输层协议。
SNMP对于任何程序设计人员来说是特别易于理解的。简单来说,一个网络设备以守护进程的方式运行SNMP代理,该守护进程能够响应来自网络的各种请求信息。
但是它通常被认为较难理解,并且过于复杂,原因就是其可用的API似乎在本来非常简单的东西外面封装了大量的东西,而关于SNMP的书籍又往往只是把它更加复杂化。
在实现过程中,管理者会发送一个PDU给一个代理者(可以是路由器、交换机、防火墙……等可支持网管的设备),代理者收到管理者所发出内含询 问信息的PDU报文后,再透过PDU回传给相关的管理者。
在该过程中,代理者基本上只能处于被动的状态,反复进行一问一答的模式,而唯一可由代理者自动发 出的只有Trap的不定期回报特殊状况信息。
SNMP协议有两个基本命令模式:read和 read/write。read是可以通过SNMP协议观察设备配置细节,而使用read/write模式可以让管理者有权限修改设备配置。以当前市场流行的大多数被网管的设备为例,如果设备的默认口令没有改变,那么攻击者就可以利用默认的口令得到其配置文件,文件一旦被破解,攻击者就能够对设备进行远程非法的配置,实行攻击。
目前,绝大多数的网络设备和操作系统都可以支持SNMP,如D-Link、Cisco、3Com等等。
SNMP的发展历史
目前SNMP共有三个版本,v1、v2c和v3。SNMPv1是为基于公共管理的初始标准。SNMPv2是SNMPv1框架下衍生出来的,但是没有定义信息,其后修订为SNMPv2c。SNMPv2添加了几个新的数据类型(Counter32、Counter64、Gauge32、UInteger32、NsapAdress 以及BIT STRING),以及对OID表和OID值的设置的增强。
SNMPv3是一个带有新的信息格式、ACL、安全功能和远处SNMP参数配置的、扩展了SNMPv2框架的版本。
现在,SNMPv1和SNMPv2被广泛应用,但是由于这些协议的不安全特性,通常只使用只读访问。通常,除非你确实需要附加安全特性,否则你不需要过多地关注SNMPv3。SNMPv3是具有安全性的通信协议。
SNMP的核心知识
要了解SNMP核心,不得不了解OID、MIB这两大核心。
OID即Object Identifiers,中文名为对象标识符,一个OID是一个唯一的键值对,一个SNMP代理提供大量的对象标识符。供SNMP管理端通过向代理查询OID中的键对应的特定信息,来了解设备的当前运行状况。
例如,我想查询设备的系统名称,便可以通过1.3.6.1.2.1.1.1.0这个键,在MIB Browser中查询,如下图:
其实,OID就如同程序中的全局变量。SNMP的OID是可读或可写的。OID的键是用一种按照层次化格式组织的、树状结构中的唯一地址来表示的,它与DNS层次相似。
OID的层次结构如下:
尽管向一个SNMP设备写入信息的情况非常少,但它是各种管理端用来控制设备的方法(例如针对交换机的可管理GUI)。
SNMP中有一个基本的认证框架(也即是SNMP的版本,v1/v2c/v3),能够让管理员发送Community来对OID读取或写入的认证。设备默认使用不安全的公共名 "public"。
MIB,即 Management Infomation Base,中文称为管理信息库,就是所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合。大量的的OID以树型结构组织在一起,就构成了一台设备的MIB。
下图即为一台交换机的MIB:
MIB查询示例:
1.查看交换机的有那些接口
2.查看路由器各接口的总入流量
SNMP的报文类型
SNMP中定义了五种消息类型:Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap。
SNMP五种消息类型
(1)Get-Request 、Get-Next-Request与Get-Response
SNMP 管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。Get-Next- Request用于和Get-Request组合起来查询特定的表对象中的列元素。
(2)Set-Request
SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。
(3)Trap
SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生,如接口UP/DOWN,IP地址更改等。
上面五种消息中Get-Request、Get-Next-Request和Set-Request是由管理站发送到代理侧的161端口的;后面两种Get-Response和Trap 是由代理进程发给管理进程的,其中Trap消息被发送到管理进程的162端口,所有数据都是走UDP封装。SNMP工作流程如下图:
使用snmp4j采集路由器接口与流量信息
在Java中,使用snmp4j.jar这个工具类,去查询设备运行状态信息。首先需要与SNMP代理建立连接,即构造一个 CommunityTarget对象,需要传入代理的IP、运行SNMP的端口、SNMP协议的版本、超时、重试信息,然后将需要查询的OID的键,依次添加到PUD中(将多个查询需求封装成一个请求),再将PUD、CommunityTarget对象作为参数传入snmp.getNext()方法,处理SNMP代理返回的ResponseEvent即可得到传入的每一个OID的键对应的值。
这次这给大家简单的介绍到这,相信看到这里你已经对SNMP有了简单的了解。但SNMP协议的强大还要在实战中才能真切的体会!
关于云端卫士
“云端卫士”是中盈优创资讯科技有限公司旗下的系列安全产品的主品牌,为客户提供全系列、一体化、可运营的安全产品,包括网络攻击追踪溯源系统、网络攻击检测分析系统、网络流量态势感知系统、安全威胁态势感知系统、安全运营支撑系统、分布式抗拒绝服务攻击系统等。更多信息请拨打400-818-5108咨询,或访问www.cloudguarder.com