首页 > 代码库 > SNMP:简单网络管理协议
SNMP:简单网络管理协议
为什么需要监控?
随着当前企业IT环境中服务器、应用程序数量和类型的不断增加,运维部门需要通过科学和高效的手段尽可能详细、实时和准确的获取整个架构中具体到每个服务器、每个系统甚至每个应用程序工作的细节,并且会对所获取到的原始数据进行分析、绘图和统计、以便为后续的性能调优、架构调整提供参考依据。
常见的检测对象涵盖了IT运行环境的方方面面,包括机房环境、硬件、网络等,而每一个方面所涉及的监控项目则种类繁多。例如对硬件环境的检测中,所涵盖内容就包括服务器的温度/风扇转速等指标;针对系统环境的监控,包括操作系统的运行环境,如CPU负载、内存、I/O、存储空间使用状况、网络吞吐量、进程数量等。
SNMP协议的基本概念以及工作原理
SNMP is based on the manager/agent model consisting of an SNMP manager, an SNMP agent, a database of management information, managed SNMP devices and the network protocol. The SNMP manager provides the interface between the human network manager and the management system. The SNMP agent provides the interface between the manager and the physical device(s) being managed.
简单网络管理协议SNMP是一种广泛用于监控网络设备(计算机、路由器)甚至其他设备的网络协议,也是专门设计用于在IP网络管理网络节点(包括服务器、工作站、路由器、交换机及HUBS等)的一种标准,属于应用层协议。SNMP使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过SNMP接收事件报告,网络管理系统将获知网络出现的各种问题。
SNMP主要由三个组成部分:被管理的设备(Managed Device),代理(agent)和网络管理系统(network management system,NMS)
被管理的设备是一个网络节点,包含SNMP代理并处在管理网络中,用于收集并存储网络信息,通过SNMP,NMS能够得到这些信息。被管理的设备可能是路由器、访问服务器、交换机和网桥等。
SNMP代理是被管理设备上的一个服务进程。SNMP代理拥有本地的相关管理信息,并将他们转换成与SNMP兼容的格式。
NMS就是监控中心。
关于SNMP理论方面的东西,请自行google,这里也给出我认为比较容易理解文章的链接:
http://www.dpstele.com/layers/l2/snmp_l2_tut_part1.php
http://www.manageengine.com/network-monitoring/what-is-snmp.html
SNMP版本
目前,SNMP有3种不同的版本:SNMPv1、SNMPv2、SNMPv3。第1版和第2版没有太大差别,但是SNMPv2是增强版本,包含了其他协议操作。前两种snmp协议主要使用基于团体名称(community)的方式来实现访问认证,与前两者相比,SNMPv3则包含更多安全机制和远程配置手段,在认证方面可以使用基于某种对称和非对称加密协议来加密的用户名和密码来实现访问认证。而且为了解决SNMP版本间不兼容的问题,RFC3584定义三者共存的策略。
SNMPv1
Security is based on communities.(public and private)
SNMPv2, v2c
Security is based on community-string-based.(public and private)
SNMPv3
安全性增强。
SNMP是以commuities作为认证的,通常内置默认communities: public and private。
因为SNMP提供大量机器及系统信息,权限允许的话,还可以进行相应的修改操作。因此,SNMP的安全性很重要。目前,SNMP有两种验证标准,第2版和第3版。服务器和客户端的验证方式必须相同。
第2版基于SNMP群体名(comunity name)的概念,其实可理解为“口令”,以明文传输的方式进行;通常一个群名用于只读访问,另一个群名则允许写入。
第3版引入了安全性更高的访问控制方法,通过用户名和密码的加密传输来实现身份验证,5.4以上的版本net-snmp支持v3方式,5.4以下的版本可用v2方式。
SNMP报文,支持以下5种
GET 获取被监控设备的信息
GETNEXT 获取某个节点的直接子节点的信息,不递归
GETBULK(SNMPv2, SNMPv3),同GETNEXT,但是递归进行
SET 设置
TRAP SNMP陷阱消息允许代理自发的告知一个“重要的”事件给SNMP管理器
MIB和OID
MIB是关于某个设备层次化的数据库(Management information base)。而且对于这个库中的设备都采用唯一的Object Identifier(OID)表示。OID格式包括可用名称或者数字表示。
如果对于一个新创造的设备,要使用SNMP监控,那么则必须要到SNMP管理机构去申请一个唯一标识符(OID)。
SNMP安装
在RHEL/CentOS系列的系统上,提供了一个叫做net-snmp的rpm包,net-snmp是在IPv4和IPv6上实现SNMP的v1,v2,v3版本协议的一组程序。
net-snmp(agent)
net-snmp-utils(manager commands)
但是,如果manager需要接收agent的TRAP报文时,则也需要安装net-snmp包。
[root@localhost ~]# yum -y install net-snmp net-snmp-utils
agent端:监听在161端口
/etc/rc.d/init.d/snmpd # 服务启动脚本 /usr/sbin/snmpd # agent端的SNMP服务程序 /etc/snmp/snmpd.conf # 配置文件
manager端:监听在162端口
/etc/rc.d/init.d/snmptrapd # 服务启动脚本 /usr/sbin/snmptrapd # manager端用于接收agent的trap请求 /etc/snmp/snmptrapd.conf # 配置文件 /usr/bin/snmp* # manager 可用的命令 # 要使用snmp,必须为其提供mib库,常见的就是MIB-2 /usr/share/snmp/mibs # 可用的mib库,非常重要
启动snmpd服务:
[root@localhost ~]# service snmpd start Starting snmpd: [ OK ] [root@localhost ~]# netstat -tulpn | grep snmp tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN 19913/snmpd udp 0 0 0.0.0.0:161 0.0.0.0:* 19913/snmpd
如果系统中安装了net-snmp-utils包,则snmp中MIB和OID可以通过snmptranslate命令来显示整个MIB树。
[root@localhost ~]# snmptranslate -Tp .1 | head -n50 +--iso(1) | +--org(3) | +--dod(6) | +--internet(1) | +--directory(1) | +--mgmt(2) | | | +--mib-2(1) | | | +--system(1)
SNMP配置
net-snmp安装完成后,默认的配置文件/etc/snmp/snmpd.conf
该配置文件中,主要用到了4条指令:com2sec, group, view, access
1、com2sec
# 命令格式1: com2sec [-Cn context] sec.name source community # 参数说明: -Cn context # 可选,在v3版本中使用 sec.name # 内部映射的名字,字符串 community # 实体字符串,外部使用的名字 source # 可以访问的IP地址范围,默认值为 “default”,即任何ip都可以 source有两种表示方式 # IP/MASK 10.0.1.0/255.255.255.0 # IP/BITS 10.0.1.0/24 # 命令格式2: com2sec6 [-Cn context] sec.name source community # 针对IPv6, 其他和com2sec相同 # 命令格式3: com2secunix [-Cn context] sec.name sockpath community # 仅限本地socket 可以访问
功能:map an SNMPv1 or SNMPv2 community string to a security name.
即将团体名(community)字符串映射为安全的名字,v1和v2版本都是明文密码,也就无所谓安全性了。v3版增强了安全性。
2、group
# 命令格式 group groupName securityModel sec.name # 参数说明 groupName # 组名 securityModel # v1, v2c, usm, tsm, ksm其一,(usm,tsm,ksm为v3版本使用)
功能:将sec.name映射到一个group组中,组中具有相同的存取权限。组中至少有两个sec.name,如果只有一个sec.name也会被解释为两个,即有两个相同的。为了方便管理。
3、view
# 命令格式 view viewName type oid [mask] # 参数说明 viewName # view名字 type # 可选两个值:include和exclude oid # 可以访问的oid [mask] # 对OID的mask
功能:定义一个view,表示整个OID树的子树,同一个子树可以定义多个view
举个例子说明: view all include 1.3.6.1.2.1.4 0xf0 # 0xf0: 11110000, 即访问的OID的前4位必须是1.3.6.1,否则不能访问,即可以访问1.3.6.1下的所有子树OID。
若创建视图时指定了十六进制的掩码值,则按照从左至右的顺序,视图掩码值得二进制数值表示的每个bit与MIB对象子树OID中的每个子OID 一一对应。在掩码的二进制表示中,1表示精确匹配,即要访问的节点的OID与MIB对象子树OID对应位置的子OID必须相等;0表示通配,即要访问的节点OID与MID对象子树OID对应位置的子OID允许不相等。
使用掩码定义视图时,有以下几点需要注意:
若视图掩码值的二进制数值的位数多于MIB对象子树OID中的子OID个数,则多出部分不做考虑
若视图掩码值的二进制数值的位数少于MIB对象子树OID中的子OID个数,则默认用二进制的1补全
若创建视图时未指定掩码值,则与掩码值为全F(二进制数值全为1)时的效果一样,但在读取掩码值时显示为空。
4、access
# 命令格式 access groupName context model level prefix read write notify # 参数说明 groupName # 控制存取权限的组名 context # 对 v1和v2版本, context 必须设置为 "" model # v1, v2c, any, usm, tsm, ksm # 最后3种是v3版本的授权模式,usm(User-Based Security Model)是默认的授权 # 模式,tsm用于SSH or DTLS, ksm用于支持Kerberos level # 可以取3种值:noauth, auth, priv # noauth 允许无权限访问,v1和v2可以使用 # auth 必须有权限才能访问 # priv 强制加密访问 prefix # exact OR prefix read/write/notify # 分别对应某一个view的权限是否可以GET*, SET*, TRAP/INFORM,如果该view # 不能read, 则置为none
功能:设置某个view的访问控制权限
其实配置snmpd.conf不算太难:
#### # First, map the community name "public" into a "security name" # 首先,定义一个团体名称(community),这里是public; 以及可以访问这个public的用户名(sec.name),这里是notConfigUser; # public 就相当于 notConfigUser 用户的密码 # sec.name source community com2sec notConfigUser default public #### # Second, map the security name into a group name: # 然后,定义一个组(groupName), 这里是notConfigGroup, 及组的安全级别,组的成员有notConfigUser # groupName securityModel securityName group notConfigGroup v1 notConfigUser group notConfigGroup v2c notConfigUser #### # Third, create a view for us to let the group have rights to: # 定义一个可操作的范围(view), OID树从ROOT(.)开始 # Make at least snmpwalk -v 1 localhost -c public system fast again. # name incl/excl subtree mask(optional) #view systemview included .1.3.6.1.2.1.1 #view systemview included .1.3.6.1.2.1.25.1.1 view all included .1 #### # Finally, grant the group read-only access to the systemview view. # 定义notConfigGroup在all这个view范围内可以执行的操作 # group context sec.model sec.level prefix read write notif access notConfigGroup "" any noauth exact all none none # -----------------------------------------------------------------------------
其实在实际配置过程中,在默认配置文件的基础上更改以下几个关键点即可:
修改完配置文件之后,重启snmpd服务生效。
[root@localhost ~]# service snmpd restart Stopping snmpd: [ OK ] Starting snmpd: [ OK ] # 开机启动snmpd服务 [root@localhost ~]# chkconfig --add snmpd [root@localhost ~]# chkconfig snmpd on
同时要注意iptables防火墙是否允许:
将161端口和162端口设置通过防火墙: vi /etc/sysconfig/iptables 添加如下内容: -A INPUT -m state --state NEW -m udp -p udp --dport 161 - j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 162 -j ACCEPT # 然后重启iptables服务 # service iptables restart
2、windows下安装net-snmp
网址:http://sourceforge.net/projects/net-snmp/files/
下载路径:http://hivelocity.dl.sourceforge.net/project/net-snmp/net-snmp%20binaries/5.5.1-binaries/net-snmp-5.5.1-1.x86.exe
网上有比较详细的教程,我这里就不在赘述了,
具体参考这里:http://www.cnblogs.com/VRS_technology/archive/2010/08/12/1798191.html
对于win server 2003或者win server 2008
http://network.51cto.com/art/201007/209536_all.htm
关键点:在路径(软件安装路径)\snmp\下,添加文件snmpd.conf(我的做法是将上文中linux下的snmpd.conf文件直接copy过来)。
扩展snmp
http://www.cnblogs.com/mikezhang/archive/2013/11/18/pythonextendsnmp20121118.html
监控端可执行的snmp*命令
当我们安装了net-snmp-utils之后,会在/usr/bin/目录下生成很多可执行程序,通过这些命令,我们就可以和远端的agent通信。
snmpget 从agent获取SNMP变量的值
snmpgetnext 获取下一个直接子节点的值
snmpset 设置
snmpwalk 从某个特定的OID开始遍历MIB
snmptrap 生成一个trap警告
snmpdf 监视磁盘信息
snmptable SNMP变量表
snmptranslate MIB结构中的OID
snmpdelta 一直监视SNMP变量的变化
这些命令非常有用,可以把它们写到shell脚本中,当然,还可以用perl, php, python来进行监控脚本的编写。
USAGE: snmpwalk [OPTIONS] AGENT [OID] [root@localhost ~]# snmpwalk -v2c -c public localhost .1 -v # version, 指定SNMP版本 -c # community, 团体名 ### 获取网卡信息 [root@localhost ~]# snmpwalk -v2c -c public localhost RFC1213-MIB::ifDescr IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth1 IF-MIB::ifDescr.3 = STRING: eth0 ### 获取eth1网卡流入的流量 [root@localhost ~]# snmpget -v2c -c public localhost IF-MIB::ifInOctets.2 IF-MIB::ifInOctets.2 = Counter32: 27983228 ### snmpdf 通过snmp监控远程主机的磁盘空间 [root@localhost ~]# snmpdf -v2c -c public localhost Description size (kB) Used Available Used% Physical memory 89188 86804 2384 97% Virtual memory 1137756 103532 1034224 9% Memory buffers 89188 2932 86256 3% Cached memory 29296 29296 0 100% Swap space 1048568 16728 1031840 1% / 3023760 1230932 1792828 40% /dev/shm 44592 0 44592 0% /boot 198337 25977 172360 13% /data 6061640 143096 5918544 2%
好了,更多命令的详细使用方法可以参考这篇文章:
http://lymrg.blog.51cto.com/1551327/377556
以及man, man才是最好的老师。
本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1536022