SNMP 简单网络管理协议 基础一遍达
部分转载:https://blog.csdn.net/openbox2008/article/details/79958092
什么是 SNMP 协议?
简单网络管理协议 (Simple Network Management Protocol)是一种应用层协议,是 TCP/IP 协议族的一部分。它使网络设备之间能够方便地交换管理信息。能够让网络管理员管理网络的性能,发现和解决网络问题及进行网络的扩充。
目前 SNMP 已成为网络管理领域中事实上的工业标准,并被广泛支持和应用,大多数网络管理系统和平台都是基于 SNMP 的。
SNMP 管理控制框架
简而言之,SNMP 协议是用来管理设备的协议,何谓管理呢?我斗胆将其归纳为两个基本点:监控(get)和配置(set)。也就是说:人们管理一个设备的基本手段可以归纳为 get 和 set 两种操作。
如果 NMS( 网管系统 ) 需要查询被管理设备的状态,则需要通过 SNMP 的 get 操作获得设备的状态信息;同样,如果 NMS 需要修改或者配置被管理设备的参数,则需要通过 SNMP 的 set 操作来完成。
什么是 MIB?
MIB 是描述被管理设备上的参数的数据结构。如前所述,管理一个设备,就是利用 SNMP 协议,通过网络对被管理设备上的参数进行 get 和 set 操作。
那么如何组织被管理设备上的参数呢?多数情况下,可以 get 和 set 的参数实在多得惊人,假如仅仅简单地线性罗列它们,操作会十分不便。想象一下把 1000 个参数列成一张表,需要使用的时候查询这样一张表会有多么困难啊?比如您打算在地球上找一个城市,”Ithaca”,如果没有归类和分级,则需要查找一张巨大的表格。但如果告诉您城市” Ithaca”是:南美洲国家圭亚那的北部城市”Ithaca”,那么就容易些了吧?
被管理的设备相当复杂,拥有很多可以被管理的参数,需要对它们进行归类,分级。管理信息库 (MIB) 是一个具有分层特性的信息的集合,我们可以通过 SNMP 去存取它。MIB 的成员是一些被管理的对象 (Managed Object),以对象标示符 (Object Identifiers) 来区分它们。被管理的对象由一个或多个对象实例 (Object Instances) 组成,本质上,这些对象实例就是变量。
在 MIB 的层次结构中,一个对象标示符唯一标识了被管理对象。MIB 的层次结构可以被描述成无根名的树,树的级别被不同的组织所划分。
很多能够被 SNMP 管理的对象都是由标准组织定义好的。比如系统磁盘的信息,用 OID “1.3.6.1.4.1.2021.9” 表示。这串数字是国际标准化组织协商定义好的,大家都要去遵循它。当然,国际组织不可能预知未来,如果您要开发的设备有一些管理需求没有任何 RFC 定义过,那么您也可以编写自己的 MIB 文件来定义私有的 MIB 对象。
什么是 SNMP Trap?
前面介绍的 get/set 操作都是从 NMS 发送到被管理设备的。但有时候,能够从被管理设备主动发送信息到 NMS 也是非常必要的。
SNMP Trap 是 SNMP 的一部分,当被监控段出现特定事件,可能是性能问题,甚至是网络设备接口宕掉等,代理端会给管理站发告警事件。假如在特定事件出现的时刻,不是由 Agent 主动通知 NMS,那么 NMS 必须不断地对 Agent 进行轮询。这是非常浪费计算资源的方法,正如人们用中断通知 CPU 数据的到达,而不是让 CPU 进行轮询一样。Trap 通知是更加合理的选择。
用一句话来说的话,SNMP Trap 就是被管理设备主动发送消息给 NMS 的一种机制。
OID 是什么?
SNMP 对象标识符 (OID:Object ID) 是定义在特定 MIB 模式中的值,来定义一个特定的在 MIB 数据库中 SNMP 目标。
SNMP OID 是划界序列数字组成 a.b.c…x.y.z 的周期。它对信息的一个项目是一个独特的标识符,其是一个MIB的一部分。典型的OIDs能够有与它们相关的名字。OIDs在自然中是分等级的。因此 1.2.3 出现在 1.3 之前但是在 1.2 之后。OID 前面的一部分是由协会分配的,每个企业都有自己的 OID 标识.
可以理解为有规则的设备参数编 du 码。snmp 协议将设备的各种参数按树形结构进行分组,从树的根部开始,每一个层级节点会有一个编码,将这些层级编码以 “.” 作为分隔符,将其拼接起来所形成的一串编码就叫 OID,通过 OID 可以对该 OID 表示的参数进行操作, SNMP 监控的项目就是一个个的 OID。
CentOS 7 SNMP 安装
1. 查看是否安装 snmp 服务
1 | rpm -qa |grep snmp |
2. 安装 snmp 服务及依赖库,一般只需要安装 net-snmp 即可
1 | yum install -y net-snmp |
3. 配置 snmpd.conf 文件 (一般在 /etc/snmp 目录下)
1 | com2sec notConfigUser default public |
注意: view systemview included .1 意思是允许访问 system 所有的 oid 节点信息
4. 启动 snmpd 服务
1 | systemctl start snmpd |
5. 开启 upd 161 防火墙
1 | # CentOS 6.x |
6. 测试 snmpd 服务是否正常
1 | snmpwalk -v 2c -c public 192.168.10.2 system |
注:当然后面的 system 也可以不加,不加大话代表不进行过滤,会把所有能够看到的 OID 都显示出来。
1 | snmpget -v 2c -c public 192.168.10.4 SNMPv2-MIB::sysDescr.0 |
注: snmpget 与 snmpwalk 不同点在于 snmpget 代表的是 “=” 而 snmpwalk 代表的是 “like %值%”,即一个是完整的键值对,一个是模糊查询,所以平时 snmpwalk 用的比较多
7. Snmp 方式采集 Linux 数据,只能获取到系统的基本信息,其他却提示
1 | No Such Object available on this agent at this OID |
则说明:该 OID 的权限没有分配, 需要进行修改 snmpd.conf 配置文件
1 | view systemview included .1 |
修改完成后 对 snmpd 进行重启
1 | service snmpd restart |
8. 不同版本的 snmp 验证
v1 验证方式,v1 已经很少使用了
1 | snmpwalk -v 1 -c public 127.0.0.1:161 sysDescr |
v2c 验证方式,并且 community 字符串假设为 “public”,那么测试方法为
1 | snmpwalk -v 2c -c public 127.0.0.1:161 sysDescr |
v3 验证方式,用户名为 “user”,密码为 “pass”,加密方式为 “MD5”,那么测试方法为:
1 | snmpwalk -v 3 -l authNoPriv -a MD5 -u user -A pass 127.0.0.1:161 sysDescr |
OID
1. OID 公网 (需要注意 不同厂家的 OID 是部分值是不互通的)
1 | http://www.oid-info.com/ |
2. 常用的 OID
系统参数
OID | 描述 | 备注 | 请求方式 |
---|---|---|---|
.1.3.6.1.2.1.1.1.0 | 获取系统基本信息 | SysDesc | GET |
.1.3.6.1.2.1.1.3.0 | 监控时间 | sysUptime | GET |
.1.3.6.1.2.1.1.4.0 | 系统联系人 | sysContact | GET |
.1.3.6.1.2.1.1.5.0 | 获取机器名 | SysName | GET |
.1.3.6.1.2.1.1.6.0 | 机器坐在位置 | SysLocation | GET |
.1.3.6.1.2.1.1.7.0 | 机器提供的服务 | SysService | GET |
.1.3.6.1.2.1.25.4.2.1.2 | 系统运行的进程列表 | hrSWRunName | WALK |
.1.3.6.1.2.1.25.6.3.1.2 | 系统安装的软件列表 | hrSWInstalledName | WALK |
网络接口
OID | 描述 | 备注 | 请求方式 |
---|---|---|---|
.1.3.6.1.2.1.2.1.0 | 网络接口的数目 | IfNumber | GET |
.1.3.6.1.2.1.2.2.1.2 | 网络接口信息描述 | IfDescr | WALK |
.1.3.6.1.2.1.2.2.1.3 | 网络接口类型 | IfType | WALK |
.1.3.6.1.2.1.2.2.1.4 | 接口发送和接收的最大IP数据报[BYTE] | IfMTU | WALK |
.1.3.6.1.2.1.2.2.1.5 | 接口当前带宽[bps] | IfSpeed | WALK |
.1.3.6.1.2.1.2.2.1.6 | 接口的物理地址 | IfPhysAddress | WALK |
.1.3.6.1.2.1.2.2.1.8 | 接口当前操作状态[up | down] | IfOperStatus |
.1.3.6.1.2.1.2.2.1.10 | 接口收到的字节数 | IfInOctet | WALK |
.1.3.6.1.2.1.2.2.1.16 | 接口发送的字节数 | IfOutOctet | WALK |
.1.3.6.1.2.1.2.2.1.11 | 接口收到的数据包个数 | IfInUcastPkts | WALK |
.1.3.6.1.2.1.2.2.1.17 | 接口发送的数据包个数 | IfOutUcastPkts | WALK |
CPU及负载
OID | 描述 | 备注 | 请求方式 |
---|---|---|---|
.1.3.6.1.4.1.2021.11.9.0 | 用户 CPU 百分比 | ssCpuUser | GET |
.1.3.6.1.4.1.2021.11.10.0 | 系统 CPU 百分比 | ssCpuSystem | GET |
.1.3.6.1.4.1.2021.11.11.0 | 空闲 CPU 百分比 | ssCpuIdle | GET |
.1.3.6.1.4.1.2021.11.50.0 | 原始用户 CPU 使用时间 | ssCpuRawUser | GET |
.1.3.6.1.4.1.2021.11.51.0 | 原始 nice 占用时间 | ssCpuRawNice | GET |
.1.3.6.1.4.1.2021.11.52.0 | 原始系统 CPU 使用时间 | ssCpuRawSystem | GET |
.1.3.6.1.4.1.2021.11.53.0 | 原始 CPU 空闲时间 | ssCpuRawIdle | GET |
.1.3.6.1.2.1.25.3.3.1.2 | CPU 的当前负载,N 个核就有 N个负载 | hrProcessorLoad | WALK |
.1.3.6.1.4.1.2021.11.3.0 | ssSwapIn | GET | |
.1.3.6.1.4.1.2021.11.4.0 | SsSwapOut | GET | |
.1.3.6.1.4.1.2021.11.5.0 | ssIOSent | GET | |
.1.3.6.1.4.1.2021.11.6.0 | ssIOReceive | GET | |
.1.3.6.1.4.1.2021.11.7.0 | ssSysInterrupts | GET | |
.1.3.6.1.4.1.2021.11.8.0 | ssSysContext | GET | |
.1.3.6.1.4.1.2021.11.54.0 | ssCpuRawWait | GET | |
.1.3.6.1.4.1.2021.11.56.0 | ssCpuRawInterrupt | GET | |
.1.3.6.1.4.1.2021.11.57.0 | ssIORawSent | GET | |
.1.3.6.1.4.1.2021.11.58.0 | ssIORawReceived | GET | |
.1.3.6.1.4.1.2021.11.59.0 | ssRawInterrupts | GET | |
.1.3.6.1.4.1.2021.11.60.0 | ssRawContexts | GET | |
.1.3.6.1.4.1.2021.11.61.0 | ssCpuRawSoftIRQ | GET | |
.1.3.6.1.4.1.2021.11.62.0 | ssRawSwapIn | GET | |
.1.3.6.1.4.1.2021.11.63.0 | ssRawSwapOut | GET | |
.1.3.6.1.4.1.2021.10.1.3.1 | Load5 | GET | |
.1.3.6.1.4.1.2021.10.1.3.2 | Load10 | GET | |
.1.3.6.1.4.1.2021.10.1.3.3 | Load15 | GET |
内存及磁盘
OID | 描述 | 备注 | 请求方式 |
---|---|---|---|
.1.3.6.1.2.1.25.2.2.0 | 获取内存大小 | hrMemorySize | GET |
.1.3.6.1.2.1.25.2.3.1.1 | 存储设备编号 | hrStorageIndex | WALK |
.1.3.6.1.2.1.25.2.3.1.2 | 存储设备类型 | hrStorageType[OID] | WALK |
.1.3.6.1.2.1.25.2.3.1.3 | 存储设备描述 | hrStorageDescr | WALK |
.1.3.6.1.2.1.25.2.3.1.4 | 簇的大小 | hrStorageAllocationUnits | WALK |
.1.3.6.1.2.1.25.2.3.1.5 | 簇的的数目 | hrStorageSize | WALK |
.1.3.6.1.2.1.25.2.3.1.6 | 使用多少,跟总容量相除就是占用率 | hrStorageUsed | WALK |
.1.3.6.1.4.1.2021.4.3.0 | Total Swap Size(虚拟内存) | memTotalSwap | GET |
.1.3.6.1.4.1.2021.4.4.0 | Available Swap Space | memAvailSwap | GET |
.1.3.6.1.4.1.2021.4.5.0 | Total RAM in machine | memTotalReal | GET |
.1.3.6.1.4.1.2021.4.6.0 | Total RAM used | memAvailReal | GET |
.1.3.6.1.4.1.2021.4.11.0 | Total RAM Free | memTotalFree | GET |
.1.3.6.1.4.1.2021.4.13.0 | Total RAM Shared | memShared | GET |
.1.3.6.1.4.1.2021.4.14.0 | Total RAM Buffered | memBuffer | GET |
.1.3.6.1.4.1.2021.4.15.0 | Total Cached Memory | memCached | GET |
.1.3.6.1.4.1.2021.9.1.2 | Path where the disk is mounted | dskPath | WALK |
.1.3.6.1.4.1.2021.9.1.3 | Path of the device for the partition | dskDevice | WALK |
.1.3.6.1.4.1.2021.9.1.6 | Total size of the disk/partion (kBytes) | dskTotal | WALK |
.1.3.6.1.4.1.2021.9.1.7 | Available space on the disk | dskAvail | WALK |
.1.3.6.1.4.1.2021.9.1.8 | Used space on the disk | dskUsed | WALK |
.1.3.6.1.4.1.2021.9.1.9 | Percentage of space used on disk | dskPercent | WALK |
.1.3.6.1.4.1.2021.9.1.10 | Percentage of inodes used on disk | dskPercentNode | WALK |
3. ### 4. Linux 下 snmp 常用的 OID, 用做服务器监控不错
服务器负载
1 | 1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1 |
CPU信息
1 | percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0 |
内存使用
1 | Total Swap Size: .1.3.6.1.4.1.2021.4.3.0 |
硬盘使用
1 | Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1 |
系统运行时间
1 | 1.1.3.6.1.2.1.1.3.0 |
SNMP System Group
1 | sysDescr 1.3.6.1.2.1.1.1 |
SNMP Interfaces Group
1 | ifNumber 1.3.6.1.2.1.2.1 |
SNMP IP Group
1 | ipForwarding 1.3.6.1.2.1.4.1 |
SNMP ICMP Group
1 | icmpInMsgs 1.3.6.1.2.1.5.1 |
SNMP TCP Group
1 | tcpRtoAlgorithm 1.3.6.1.2.1.6.1 |
SNMP UDP Group
1 | udpInDatagrams 1.3.6.1.2.1.7.1 |
SNMP Group
1 | snmpInPkts 1.3.6.1.2.1.11.1 |
4. 应用示例
查看服务器 1 分钟平均负载
1 | # 执行语句 |
查看服务器当前连接
1 | # 执行语句 |
5. 常用的 OID Group (OID 组)
System Group
1 | sysDescr 1.3.6.1.2.1.1.1 |
Interfaces Group
1 | ifNumber 1.3.6.1.2.1.2.1 |
IP Group
1 | ipForwarding 1.3.6.1.2.1.4.1 |
ICMP Group
1 | icmpInMsgs 1.3.6.1.2.1.5.1 |
TCP Group
1 | tcpRtoAlgorithm 1.3.6.1.2.1.6.1 |
UDP Group
1 | udpInDatagrams 1.3.6.1.2.1.7.1 |
SNMP Group
1 | snmpInPkts 1.3.6.1.2.1.11.1 |