首页 > 代码库 > 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.

wKiom1PgVb2Q-fYkAAB0W7ThCuo052.jpg

    简单网络管理协议SNMP是一种广泛用于监控网络设备(计算机、路由器)甚至其他设备的网络协议,也是专门设计用于在IP网络管理网络节点(包括服务器、工作站、路由器、交换机及HUBS等)的一种标准,属于应用层协议。SNMP使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过SNMP接收事件报告,网络管理系统将获知网络出现的各种问题。

    SNMP主要由三个组成部分:被管理的设备(Managed Device),代理(agent)和网络管理系统(network management system,NMS)

    被管理的设备是一个网络节点,包含SNMP代理并处在管理网络中,用于收集并存储网络信息,通过SNMP,NMS能够得到这些信息。被管理的设备可能是路由器、访问服务器、交换机和网桥等。

    SNMP代理是被管理设备上的一个服务进程。SNMP代理拥有本地的相关管理信息,并将他们转换成与SNMP兼容的格式。

    NMS就是监控中心。

wKiom1PgcKDTgEkXAAFuzYpDGS0551.jpg

关于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种

  1. GET        获取被监控设备的信息

  2. GETNEXT    获取某个节点的直接子节点的信息,不递归

  3. GETBULK(SNMPv2, SNMPv3),同GETNEXT,但是递归进行

  4. SET        设置

  5. TRAP       SNMP陷阱消息允许代理自发的告知一个“重要的”事件给SNMP管理器

MIB和OID

    MIB是关于某个设备层次化的数据库(Management information base)。而且对于这个库中的设备都采用唯一的Object Identifier(OID)表示。OID格式包括可用名称或者数字表示。

    如果对于一个新创造的设备,要使用SNMP监控,那么则必须要到SNMP管理机构去申请一个唯一标识符(OID)。

wKioL1PgdN3iKslUAAJupOImPiQ317.jpg


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

# -----------------------------------------------------------------------------

其实在实际配置过程中,在默认配置文件的基础上更改以下几个关键点即可:

wKiom1Pggo_BBN1jAAKtd2Zu6uY872.jpg


修改完配置文件之后,重启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

2windows下安装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