概念
SNMP(简单网络管理协议)是目前在计算机网络中用的最广泛的网络管理协议,该协议是基于TCP/IP的网管标准,它包括协议本身、数据库的定义和相关概念。可管理对象包括主句、打印机、交换机等。
SNMP此协议管理被管理设备和服务之间的通信,它被设计成一个轮询协议,使用一组简单的命令,设置和检索管理信息库(MIB)中的对象值。管理器发送的SNMP信息保存在UDP(无连接协议)数据报中,并且通过IP路由,因而,使得该代理和管理器驻留在不同的子网上,彼此之间也能通信。
SNMP安装和配置(win 10 为例)
1、安装组件
1)在本地主机上启动SNMP服务并配置共同体:开始(右击) —》控制面板—》程序—》启动或关闭windows 功能
2)查看SNMP组件是否安装成功:开始(右击)—》控制面板—》系统与安全—》管理工具—》服务,服务列表中会出现“SNMP Service”服务
2、配置SNMP服务
1)设置SNMP Service属性 打开“服务”,选择“SNMP Service”,查看“属性”页面,选择“安全”标签页,添加“public”只读团体,并且选择“接收来自任何主机的SNMP数据包”。
2)重新启动SNMP服务
3、查看端口是否开启
选择“开始”——“运行”——输入“netstat -a -n”,按下回车
出现结果,UDP 161 snmp UDP 162 snmptrap 两个snmp端口等,注意SNMP使用的是UDP协议
SNMP报文
Snmp定义了5种数据协议单元(PDU,也就是5种报文): 1)get - request操作:从代理进程处提取一个或多个参数值。
2)get - next - request 操作:从代理进程处提取一个或多个参数的下一个参数值。 3)Set-request 操作:设置代理进程的一个或多个参数值。
4)Get - response 操作:由代理进程发出的一个或多个参数值。
5)Trap操作:代理进程主动发出的报文,通知管理进程有事情发生。
前面三种是偶管理进程想代理进程发出的,后两个是代理进程发给管理进程的。
SNMP报文共有三个部分组成,即公共SNMP首部,get/set首部、trap首部,变量绑定
(1) SNMP 报文的长度取决域变量的类型和值。 (2) 版本字段为 0 ,表示为 SNMP V1 。 (3) PDU 为协议数据单元,即分组。
PDU 类型 0 1 2 3 4 名称 Get-request Get-next-request Get-response Set-request Trap (4) 共同体为一个字符串,这是管理进程和代理进程之间的口令,是明文格式,默认为 public 。
(5) 对于 get 、 get-next 和 set 操作,请求标识由管理进程设置,然后由代理进程在 get-response 中返回。这个字段的作用是使客户进程(目前是管理进程)能够将服务器进程(即代理进程)发出的响应和客户进程发出的查询进行匹配。这个字段允许管理进程对一个或多个代理进程发出多个请求,并且从返回的应答中分类。
(6) 差错状态字段是一个整数,由代理进程设置,指明有错误发生。 差错状态 名 称 0 1 2 NoError TooBig 描述 没有错误 代理进程无法把响应放在一个 SNMP 消息中发送 NoSuchName 操作一个不存在的变量 3 4 5 BadValue ReadOnly genErr Set 操作的值或语法有错误 管理进程试图改变一个只读变量 其他错误 (7) 在 get 、 get-next 和 set 的请求数据报中,包含变量名称和变量值的表,对于 get 和 get-next 操作,变量值部分被忽略。
SNMP团体名
SNMP提供了一个基本级别的安全性,验证SNMP管理器和SNMP代理之间的发送消息,为每个被发送的SNMP消息添加一个组标识符,就可以进行这种验证。这个标识符就是所谓的SNMP团体名称,所有的SNMP消息必须包含一个团体名称,标准的团体名称是public。
对象标识符(OID)
每台SNMP主机(计算机或网络设备)都有一个或多个MIB,含有该主机上被管理对象的信息。MIB中的每个对象都有一个唯一的标签标识,即所谓的对象标识符(Object Identifier,OID)。
SNMP陷阱
当主机上发生预定的事件时,SNMP代理可以产生一则被称作陷阱(trap)的消息。当代理收到一条含有他没有定义的团体名称的消息时,它将向SNMP管理器发送一条验证陷阱(authentication trap)消息,通知管理器,该主机出现消息验证故障。
SNMP编程
1、SNMP数据类型
数据类型共分为三大类,即: (1)通用类型(Universal)
该类型通常被称为非聚合类型,在SNMP协议中有4种通用数据类型: 1)INTEGER: 整型,是-2,147,483,648~2,147,483,647的有符号整数; 2)OCTET STRING: 字符串;
3)OBJECT IDENTIFIER: 对象标识符; 4)NULL: 空值。
(2)通用结构类型(Universal-constructed)
结构类型指列表和表格,常被称作聚合类型。在SNMP协议中主要使用两种结构类型: 1)SEQUENCE 用于列表。这一数据类型与大多数程序设计语言中的“structure”类似。一个SEQUENCE包括0个或更多元素,每一个元素又是另一个ASN.1数据类型。
2)SEQUENCE OF type 用于表格。这一数据类型与大多数程序设计语言中的“array”类似。一个表格包括0个或更多元素,每一个元素又是另一个ASN.1数据类型。
(3)应用类型(application)
应用数据类型采用隐式定义,是引用SNMP的简单数据类型来定义的。主要有6种: 1)IpAddress: 以网络序表示的IP地址。因为它是一个32位的值,所以定义为4个字节; 2)network address:网络地址,表示从一个特定协议族中选定的网络地址, SNMPv1仅支持32位IP地址;所以与IpAddress等效;
3)counter:计数器是一个非负的整数,它递增至最大值,而后归零。SNMPv1中定义的计数器是32位的,即最大值为4,294,967,295;
4)Gauge :也是一个非负整数,它可以递增或递减,但达到最大值时保持在最大值,最大值为2^32-1;
5)time ticks:是一个时间单位,表示以0.01秒为单位计算的时间; 6)opaque:表示用于传递任意信息串的任意编码格式,它与SMI使用的严格数据输入格式不同。
2、开源工具
开源包:snmpget使用SNMP4J框架,snmpwalk使用Java Package开源包,下载地址分别为: http://www.snmp4j.org/html/download.html http://gicl.cs.drexel.edu/people/sevy/snmp/
3、信息获取方式
在获取到被管理设备的团体名(community)和IP后,输入相应的对象标识符(OID)获取到被管理设备相关的信息,通过snmpwalk函数进行对被管理设备进行获取或设置信息,snmpwalk具体格式如下:
snmpwalk -v 1或2c(代表SNMP版本) -c community IP地址 OID(对象标示符)
Java相关代码详见:http://blog.csdn.net/davebobo/article/details/51308601
SNMP刺探信息工具
1、Snmpwalk
snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。
Windows下安装net-snmp
进入net-snmp官网www.net-snmp.org/download.html 下载net-snmp-5.6.1.1-1.x86.exe工具进行安装
Snmpwalk的使用方法
snmpwalk使用方法很简单,如下:
snmpwalk -v 1或2c(代表SNMP版本) -c SNMP密码 IP地址 OID(对象标示符) –v:指定snmp的版本, 1或者2,该参数必须有。 –c:指定连接设备SNMP读密码,该参数必须有。 IP:指定要walk的设备的IP地址,该参数必须有。 OID:代表要获取设备的指标oid,该参数不是必须的。 例:获取windows系统进程数
snmpwalk -v 1 -c public 192.168.1.200 .1.3.6.1.2.1.25.1.6
这条命令的意思是:使用v1版本,共同体为public,来对192.168.1.200的.1.3.6.1.2.1.25.1.6分支进行walk。
SNMP与打印机相关的基础的OID及其数据结构
.1.3.6.1.2.1.25.3.5.1.1.1 hrPrinterStatus 得到打印机的当前状态。 SYNTAX INTEGER {
other(1), unknown(2), idle(3), printing(4), warmup(5) }
说明:当打印机状态处于idle(1), printing(2), or warmup(3)状态时,打印机设备应该运行或者警告,当处于unknown状态时,设备状态则处于未知。
1.3.6.1.2.1.25.3.5.1.2 hrPrinterDetectedErrorState 检测打印机错误状态。 说明:错误状态由8位字节的位进行描述,具体定义为下: Condition Bit # hrDeviceStatus lowPaper 0 warning(3) noPaper 1 down(5) lowToner 2 warning(3) noToner 3 down(5) doorOpen 4 down(5) jammed 5 down(5) offline 6 down(5) serviceRequested 7 warning(3)
.1.3.6.1.2.1.43.12.1.1.3 prtMarkerColorantRole 得到打印机色剂的类型。 SYNTAX INTEGER { -- Colorant Role other(1), process(3), spot(4) }
.1.3.6.1.2.1.43.12.1.1.4 prtMarkerColorantValue 得到打印机色剂的值。 SYNTAX OCTET STRING (SIZE(0..63))
.1.3.6.1.2.1.43.12.1.1.5 prtMarkerColorantTonality 得到打印机色剂的色调。 SYNTAX Integer32
.1.3.6.1.2.1.43.13.4.1.9 prtMediaPathType得到媒介路径的种类。 SYNTAX INTEGER {
other(1), unknown(2),
longEdgeBindingDuplex(3), shortEdgeBindingDuplex(4), simplex(5) }
.1.3.6.1.2.1.43.13.4.1.10 prtMediaPathDescription 得到媒介路径的描述。 SYNTAX OCTET STRING (SIZE(0..255))
.1.3.6.1.2.1.43.13.4.1.11 prtMediaPathStatus 得到媒介路径的状态。 SYNTAX SubUnitStatus
.1.3.6.1.2.1.43.5.1.1.1 prtGeneralConfigChanges 常规配置更改。 SYNTAX Counter32
.1.3.6.1.2.1.43.5.1.1.2 prtGeneralCurrentLocalization 打印机当前本地化 SYNTAX Integer32 (1..65535)
.1.3.6.1.2.1.43.5.1.1.3 prtGeneralReset 打印机重置 SYNTAX INTEGER {
notResetting(3),
powerCycleReset(4), -- Cold Start resetToNVRAM(5), -- Warm Start
resetToFactoryDefaults(6) -- Reset contents of
-- NVRAM to factory defaults }
.1.3.6.1.2.1.43.5.1.1.4 prtGeneralCurrentOperator 打印机当前操作 SYNTAX OCTET STRING (SIZE(0..255))
.1.3.6.1.2.1.43.5.1.1.6 prtInputDefaultIndex 输入默认指数 SYNTAX interger32
.1.3.6.1.2.1.43.5.1.1.7 prtOutputDefaultIndex 输出默认指数 SYNTAX interger32
.1.3.6.1.2.1.43.6.1.1.2 prtCoverDescription 打印机外壳描述 SYNTAX OCTET STRING (SIZE(0..255))
.1.3.6.1.2.1.43.6.1.1.3 prtCoverStatus 打印机外壳状态 SYNTAX INTEGER {
other(1), doorOpen(3), doorClosed(4), interlockOpen(5), interlockClosed(6) }
.1.3.6.1.2.1.43.5.1.1.7.1 prtOutputIndex 输出索引 SYNTAX interger32
.1.3.6.1.2.1.43.5.1.1.7.2 prtOutputType 输出类型 SYNTAX INTEGER {
other(1), unknown(2), removableBin(3), unRemovableBin(4), continuousRollDevice(5), mailBox(6),
continuousFanFold(7) }
.1.3.6.1.2.1.43.5.1.1.7.3 prtOutputCapacityUnit 输出容量单位 SYNTAX CapacityUnit
.1.3.6.1.2.1.43.5.1.1.7.4 prtOutputMaxCapacity 输出最大容量 SYNTAX Integer32
.1.3.6.1.2.1.43.5.1.1.7.5 prtOutputRemainingCapacity 输出剩余容量 SYNTAX Integer32
.1.3.6.1.2.1.43.5.1.1.7.6 prtOutputStatus 输出状态 SYNTAX SubUnitStatus
.1.3.6.1.2.1.43.5.1.1.7.7 prtOutputName 输出打印机名称 SYNTAX OCTET STRING (SIZE(0..63))
.1.3.6.1.2.1.43.5.1.1.7.8 prtOutputVendorName 输出供应商名称 SYNTAX OCTET STRING (SIZE(0..63))
.1.3.6.1.2.1.43.5.1.1.7.9 prtOutputModel 输出打印机模型 SYNTAX OCTET STRING (SIZE(0..63))
.1.3.6.1.2.1.43.5.1.1.7.10 prtOutputVersion 输出打印机版本 SYNTAX OCTET STRING (SIZE(0..63))
.1.3.6.1.2.1.43.5.1.1.7.11 prtOutputSerialNumber 输出打印机序列号 SYNTAX OCTET STRING (SIZE(0..63))
.1.3.6.1.2.1.43.5.1.1.7.12 prtOutputDescription 输出打印机描述 SYNTAX OCTET STRING (SIZE(0..255))
.1.3.6.1.2.1.43.5.1.1.7.13 prtOutputSecurity 输出打印机安全性 SYNTAX PresentOnOff
.1.3.6.1.2.1.43.5.1.1.7.14 prtOutputDimUnit 输出打印机尺寸单位 SYNTAX MediaUnit
.1.3.6.1.2.1.43.5.1.1.7.15 prtOutputMaxDimFeedDir 输出打印机最大尺寸单位 SYNTAX Integer32
.1.3.6.1.2.1.43.5.1.1.7.16 prtOutputMaxDimXFeedDir 输出打印机X轴最大尺寸单位 SYNTAX Integer32
.1.3.6.1.2.1.43.5.1.1.7.17 prtOutputMinDimFeedDir 输出打印机最小尺寸单位 SYNTAX Integer32
.1.3.6.1.2.1.43.5.1.1.7.18 prtOutputMinDimXFeedDir 输出打印机X轴最小尺寸单位 SYNTAX Integer32
.1.3.6.1.2.1.43.5.1.1.7.19 prtOutputStackingOrder 输出堆叠顺序 SYNTAX INTEGER {
unknown(2), firstToLast(3), lastToFirst(4) }
.1.3.6.1.2.1.43.5.1.1.7.20 prtOutputPageDeliveryOrientation 输出打印递送方向 SYNTAX INTEGER {
faceUp(3), faceDown(4) }
因篇幅问题不能全部显示,请点此查看更多更全内容