一、为什么需要监控?

 随着当前企业IT环境中服务器、应用程序数量和类型的不断增加,运维部门需要通过科学和高效的手段尽可能详细、实时和准确的获取整个架构中具体到每个服务器、每个系统甚至每个应用程序工作的细节,并且会对所获取到的原始数据进行分析、绘图和统计、以便为后续的性能调优、架构调整提供参考依据。

     随着机器数量的增长,管理员不能像过去那样,一台台机器进行监控、解决问题,而需要借助各方工具进行统一监控和管理。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。

    常见的检测对象涵盖了IT运行环境的方方面面,包括机房环境、硬件、网络等,而每一个方面所涉及的监控项目则种类繁多。例如对硬件环境的检测中,所涵盖内容就包括服务器的温度/风扇转速等指标;针对系统环境的监控,包括操作系统的运行环境,如CPU负载、内存、I/O、存储空间使用状况、网络吞吐量、进程数量等。

    我们期望通过一台主机,就能够监控到所有其他主机的状态信息以及运行的服务,并且在发生异常的时候,能够自动尝试恢复或者通知管理员,第一时间获取消息,以便能够及时采取行动。


二、早期的监控机制

    早期,主要是通过SNMP协议,command(如 ping),以及运行在远程主机上的 remote script 进行监控。

  • SNMP

  • command (ping, telnet, 或者扫描工具、网络探测工具)

  • remote script (在远程主机执行脚本,并把结果返回, 比如通过ssh回传信息)

通常采用C/S架构模型,Manager 每隔一段时间(周期性)自动去收集Agent信息 或者 是Agent主动报告其相关信息。

不过这样还不够好,我们通过某个软件, 把收集的信息保存起来,并分析产生报表。 

但是还不够, 如果能够以更直观的走势图或者曲线图展示给我们, 我们就能实时看到其走势。

但是还不够,我们再次增强,增加报警器。当某个指标超过定义的阀值,会通过某种机制,发送报警信息。


SNMP协议介绍 
  简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。

    SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。简单来说,就是需要一个服务器程序(代理,agent)和一个客户机(管理器,manager)。而与直观上不同的是,SNMP的服务器端代表被管理的事物,而客户机端才是管理者。客户机从简单的命令行实用程序,如net-snmp提供的snmpwalk,到专门的管理软件、工作站都有。

SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。

三、SNMP协议的基本概念以及工作原理

wKioL1W6PALDOoeXAAFrg7eUTTI055.jpg

代理和管理站的模型

  Snmp分2种角色SNMP管理站(manager,我们的本机127.0.0.1)和SNMP代理(agent, 我们要操作的机器,比如 192.168.1.144)。管理站指的是运行了可以执行网络管理任务软件的服务器,通常被称作为网络管理工作站(NMS),NMS负责采样网络中agent的信息,并接受agent的trap。代理是实际网络设备中用来实现SNMP功能的部分。代理在UDP的161端口接收NMS的读写请求消息,管理站在UDP的162端口接收代理的事件通告消息。所以,一旦获取设备的访问权限(community,默认为public),就可以访问设备信息、改写和配置设备参数。由于采用UDP协议,不需要在代理和管理站之间保持连接。

wKioL1W8KQqwvVc2AACreA0Ud2Q396.jpg    

wKiom1W6roXgFoOMAAE03vQYUIo780.jpg

    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

    The SNMP manager and agent use an SNMP Management Information Base (MIB) and a relatively small set of commands to exchange information.

    The SNMP MIB is organized in a tree structure with individual variables, such as point status or description, being represented as leaves on the branches. A long numeric tag or object identifier (OID) is used to distinguish each variable uniquely in the MIB and in SNMP messages.

 

    SNMP uses five basic messages (GET, GET-NEXT, GET-RESPONSE, SET, and TRAP) to communicate between the SNMP manager and the SNMP agent. The GET and GET-NEXT messages allow the manager to request information for a specific variable.

    The agent, upon receiving a GET or GET-NEXT message, will issue a GET-RESPONSE message to the SNMP manager with either the information requested or an error indication as to why the request cannot be processed. A SET message allows the SNMP manager to request a change be made to the value of a specific variable in the case of an alarm remote that will operate a relay. The SNMP agent will then respond with a GET-RESPONSE message indicating the change has been made or an error indication as to why the change cannot be made. The SNMP TRAP message allows the agent to spontaneously informthe SNMP manager of an "important" event. (SNMP陷阱消息允许代理自发地告知一个“重要的”事件给SNMP管理器。)

As you can see, most of the messages (GET,GET-NEXT, and SET) are only issued by the SNMP manager. Because the TRAP message is the only message capable of being initiated by an SNMP agent, it is the message used by DPS Remote Telemetry Units (RTUs) to report alarms. This notifies the SNMP manager as soon as an alarm condition occurs, instead of waiting for the SNMP manager to ask.

Each SNMP element manages specific objects with each object having specific characteristics. Each object / characteristic has a unique object identifier (OID) consisting of numbers separated by decimal points (i.e., 1.3.6.1.4.1.2682.1). These object identifiers naturally form a tree as shown below. The MIB associates each OID with a readable label (i.e., dpsRTUAState) and various other parameters related tothe object. The MIB then serves as a data dictionary or code book that is usedto assemble and interpret SNMP messages.

wKiom1W4DXSTgODxAACQPUMcIMg830.jpg

    有很多事物都可以被监控,那如何来唯一标识某个特定的事物呢? 所以引入了MIB, 类似DNS倒置树结构的数据库系统。

    MIB是关于某个设备层次化的数据库(Management information base)。而且对于这个库中的设备都采用唯一的Object Identifier(OID)表示。OID格式包括可用名称或者数字表示,从上往下组合,自顶向下(与DNS不同)。

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

http://www.alvestrand.no/objectid/1.3.6.1.2.1.html

 

Superiorreferences

  • 1.3.6.1.2 -     IETF Management

  • 1.3.6.1 -       OID assignments from     1.3.6.1 - Internet

  • 1.3.6 -         US     Department of Defense

  • 1.3 -           ISO     Identified Organization

  • 1 -             ISO assigned     OIDs

  • Top of OID tree

Subsidiaryreferences (single level)

 

OID难以记忆和识别,所以为每个节点定义一个名字,并且与OID相关联。MIB 通俗的说就是 OID 名称的对应关系表。

1.3.6.1   -  iso.org.dod.Internet

    

    An agent may implement many MIBS, but all agents implement a particular MIB called MIB-II.

    When an SNMP manager wants to know the value of an object / characteristic, such as the state of an alarm point, the system name, or the element uptime, it will assemble a GET packet that includes the OID for each object / characteristic of interest. The element receives the request and looks up each OID in its codebook (MIB). If the OID is found (the object is managed by the element), a response packet is assembled and sent with the current value of the object /characteristic included. If the OID is not found, a special error response is sent that identifies the unmanaged object.

 

    When an element sends a TRAP packet, it can include OID and value information(bindings) to clarify the event. DPS remote units send a comprehensive set of bindings with each TRAP to maintain traditional telemetry event visibility. Well-designed SNMP managers can use the bindings to correlate and manage the events. SNMP managers will also generally display the readable labels to facilitateuser understanding and decision-making.

 

    This article in our series on the Simple Network Management Protocol (SNMP) examines the communication between managers and agents. Basic serial telemetry protocols, like TBOS, are byte oriented with a single byte exchanged to communicate. Expanded serial telemetry protocols, like TABS, are packet oriented with packets of bytes exchanged to communicate. The packets contain header, data and checksum bytes. SNMP is also packet oriented with the following SNMP v1 packets(Protocol Data Units or PDUs) used to communicate:

Get

GetNext

Set

Trap

The manager sends a Get or GetNext to read a variable or variables and the agent's response contains the requested information if managed. The manager sends a Set to change a variable or variables and the agent's response confirms the change if allowed. The agent sends a Trap when a specific event occurs.

 

The p_w_picpath below shows the packet formats. Each variable binding contains an identifier, a type and a value (if a Set or response). The agent checks each identifier against its MIB to determine whether the object is managed and changeable (if processing a Set).The manager uses its MIB to display the readable name of the variable and sometimes interpret its value.

wKioL1W4ELeReq74AAElXXqbUXs132.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

http://gzmaster.blog.51cto.com/299556/66777

http://www.cnblogs.com/MikeZhang/archive/2012/11/18/pythonExtendSnmp20121118.html


四、SNMP版本与认证

    目前,SNMP有3种不同的版本:SNMPv1、SNMPv2、SNMPv3。第1版和第2版没有太大差别,但是SNMPv2是增强版本,包含了其他协议操作。前两种snmp协议主要使用基于团体名称(community)的方式来实现访问认证,与前两者相比,SNMPv3则包含更多安全机制和远程配置手段,在认证方面可以使用基于某种对称和非对称加密协议来加密的用户名和密码来实现访问认证。而且为了解决SNMP版本间不兼容的问题,RFC3584定义三者共存的策略。

SNMPv1

    Security is based on communities. (public and private)。v1是SNMP协议的最初版本,不过依然是众多厂家实现SNMP基本方式。 

SNMPv2, 也叫做 v2c

    Security is based on community-string-based. (public and private)

SNMPv3

    安全性增强,增加认证机制。

    SNMP是以commuities作为认证的,通常内置默认communities: public and private

虽然SNMPv3 做了许多安全性的增强,但是使用最多的还是v1版。 为什么呢? 因为各厂家的设备很多都不支持SNMPv3。

    SNMP提供一个基本的认证框架,能够让管理员发送公共名来对OID读取或写入的认证,绝大多数的设备使用不安全的公共名: public 。

    因为SNMP提供大量机器及系统信息,权限允许的话,还可以进行相应的修改操作。因此,SNMP的安全性很重要。目前,SNMP有两种验证标准,第2版和第3版。服务器和客户端的验证方式必须相同。

    第2版基于SNMP群体名(comunity name)的概念,其实可理解为“口令”,也就是说comunity name 就是服务器和客户端之间的认证密码,以明文传输的方式进行;通常一个群名用于只读访问,另一个群名则允许写入。

    第3版引入了安全性更高的访问控制方法,通过用户名和密码的加密传输来实现身份验证,5.4以上的版本net-snmp支持v3方式,5.4以下的版本可用v2方式。


SNMP报文,支持以下5种

基本的SNMP协议操作只有4种:get(获取)、get_next(获取下一个)、set(设置)和trap(陷阱)。

  1. GET        获取被监控设备的信息,节点以OID方式说明

  2. GETNEXT    获取某个节点的直接子节点的信息,在MIB层次结构上步进一层,不递归

  3. GETBULK(SNMPv2, SNMPv3),类似于GETNEXT,但是会递归进行,返回节点所有子节点的信息

  4. SET        设置,把数据写入节点

  5. TRAP       SNMP陷阱消息允许代理自发的告知一个“重要的”事件给SNMP管理器,被监控端主动发送消息通知监控端。是从服务器(代理程序)到客户机(管理器)的一个主动提供的异步通知,在出现特定的事情或状态时,它会报告。SNMP协议已经定义了若干标准的trap操作,例如“I have just come up”(刚启动),还有报告网络链路故障或已修复,路由或身份认证等的trap,这取决于agent程序的实现。


MIB和OID

OID(对象标识符),是SNMP代理提供的具有唯一标识的键值。MIB(管理信息基)提供数字化OID到可读文本的映射。

什么是OID ?

    为了唯一标识某个对象,为其分配一个唯一的标识符: OID。

    被监控对象以守护进程的方式运行SNMP agent, 该守护进程能够响应来自网络的各种请求信息。该SNMP代理提供大量的对象标识符(OID - Object Identifiers)。一个OID是一个唯一的键值对。该代理存放这些值并让它们可用,一个SNMP管理器可以向代理查询键值对中的特定信息,然后agent查询自己的MIB数据库,如果有此OID,则返回相应信息。

    所有完全验证OID都有 .iso.org.dod.internet.private 开始,数字表达为: .1.3.6.4. 。几乎所有的OID都会跟上企业(.1)和由IANA(互联网编号分配中心分配的)唯一的厂商标号。例如OID 789表示Network Appliance格式的厂商编号( NetApp )。厂商编号后面的是基于厂商实现的功能,并且各不相同。请注意,在iso.前面的 . ,与DNS中的后面的点相似,正确验证的OID是有一个表示根的前缀 . 开始的。

    OID有很多通用的(比如主机名,CPU信息,磁盘信息),这些通用的可以归为一个类别。但是对于某些厂商,其有些特殊的设备。那么该厂商则则可以申请一个节点,然后在此节点下定义特殊的类别。

OID的相对格式,从企业值开始,略过所有的隐含地址。因此,我们可以用相对地址

enterprises.netapp.netappl.raid.diskSUmmary.diskSpaceCount.0 来表示上述的OID,或者用数字格式 .1.789.6.4.8.0 

写OID的常用格式是用MIB名称和在MIB中定义的唯一键值。例如,我们可以用简写的格式重写上述OID:
NETWORK-APPLIANCE-MIB::diskSpareCount.0
MIB
OID的书写格式规则为:  MIB Name::唯一键值.instance.
某些唯一键值,可用多个实例表示,这样所有的OID都以实例值结尾。这就是为什么你得注意到大多数OID都是以一个 .0 结尾的。

什么是MIB呢?    

    MIB是关于某个设备层次化的数据库(Management information base)。而且对于这个库中的设备都采用唯一的Object Identifier(OID)表示。OID格式包括可用名称或者数字表示。它是描述通过SNMP协议可访问的数据的结构化文本文件。MIB包括了对特定数据变量的说明,数据变量被称为OID。

    OID 是用点号(.)作为分隔符,每个节点被赋予了一个数字而不是名字。为了易于引用,还可以给节点赋予文字名称,但这种命名其实只是为了高层应用方面而已,而不是层次结构的一项功能。(有点类似于DNS的作用)。

    SNMP获取信息最终是通过OID来获取的,OID类似于IP。IP地址用于区别主机,而OID区别资源。IP难以记忆,所以产生的DNS。同样, OID也难以记忆,于是有了MIB, MIB 维护着 OID 与 名字之间的对应关系。

    当agent必须查询MIB库,才能识别NMS的请求。返回正确的结果。所以,你的主机提供了哪些MIB库,你才能对这些已定义的对象进行监控。


例如:设置(获取)系统正确运行时间的OID是:

1.3.6.1.2.1.1.3

这个OID也有一个方便读取的名称:

iso.org.dod.internet.mgmt.mib-2.system.sysUpTime


(请参考下面的net-snmp 实现)
※ 实际上,目前只能在OID iso.org.dod.internet.mgmt(即数字1.3.6.1.2)之下才能找到有用的数据。

除了这些基本的MIB之外,不同的硬件厂商还会提供它们特有的MIB信息,如提供Agent,利用它们自己的API,往MIB中添加信息,以便于管理器获取相关的信息。MIB只是提供了一个管理数据的约定,SNMP协议名字空间和设备实际状态之间的映射关系必须由代理端代码支持才有用。当然,遵循同样的规定,你也可以编写直接的Agent。


MIB有什么作用呢?

    管理信息库MIB指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。MIB给出了一个网络中所有可能的被管理对象的集合的数据结构。是一种倒置树层次结构,这种结构的大部分都留给将来扩充,而特定厂商添加的部分则被本地化以避免冲突。SNMP的管理信息库采用和域名系统DNS相似的树型结构,它的根在最上面,根没有名字。

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

wKioL1PgdN3iKslUAAJupOImPiQ317.jpg


五、SNMP安装和配置

    Linux 下SNMP协议协议,以net-snmp软件来实现,它包含一个SNMP代理程序、一些命令行工具和一个库,这个库可用于开发支持SNMP 的应用软件。net-snmp的代理程序负责收集本地主机的信息,并通过网络把这些信息提供给SNMP管理器,这个代理程序可以扩展,例如执行Linux命令后,把命令的输出作为SNMP响应返回。这样,利用该功能,就能用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


SNMP采用UDP协议在管理端和agent之间传输信息。 SNMP采用UDP 161端口接收和发送请求,162端口接收trap,执行SNMP的设备缺省都必须采用这些端口。SNMP消息全部通过UDP端口161接收,只有Trap信息采用UDP端口162。

agent端:监听在161端口

/etc/rc.d/init.d/snmpd    # 服务启动脚本
/usr/sbin/snmpd        # agent端的SNMP服务程序
/etc/snmp/snmpd.conf     # 配置文件

manager端:如果需要接收 trap,那么必须监听在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库,非常重要

启动agent 上的 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安装完成后,可以进行配置,community, view, and so on 。

默认的配置文件 /etc/snmp/snmpd.conf

里面有详细的例子和说明。简单的说,就是先配置验证信息, 分组, 设置视图,配置访问权限

[root@db snmp]# grep -E -v '^$|#' /etc/snmp/snmpd.conf 
com2sec notConfigUser  default       public

group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser

view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1
access  notConfigGroup ""  any    noauth  exact  systemview none none

syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
dontLogTCPWrappersConnects yes


该配置文件中,主要用到了4条指令:com2sec, group, view, access

1、com2sec (community to security)

# 命令格式 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

功能:设置某个group对于特定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

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

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

wKioL1W6_NSD-4MSAAJJizndHlo714.jpg

wKiom1Pggo_BBN1jAAKtd2Zu6uY872.jpg


默认是以community为public来验证NMS发起的信息获取是不是以community为public发起的,如果是,则把要收集的信息获取后发送给NMS,如果不是,则拒绝响应。这里的community表示“社区、团体”,在此处就把它看成一个当作验证的密码。“source”默认为default,为了安全应该把“community”和"source"的两个值都做修改


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

http://www.linuxfly.org/p_w_upload/1283854602_3807e10c.pdf

对于win server 2003或者win server 2008

http://network.51cto.com/art/201007/209536_all.htm

http://www.cnblogs.com/xdp-gacl/p/3978825.html

关键点:在路径(软件安装路径)\snmp\下,添加文件snmpd.conf(我的做法是将上文中linux下的snmpd.conf文件直接copy过来)。

扩展snmp

http://www.cnblogs.com/mikezhang/archive/2013/11/18/pythonextendsnmp20121118.html

 经常需要在Windows服务器上配置SNMP服务,一项项手动填写信息太麻烦。所以就用命令行执行配置文件来实现。

 1) 创建snmp.inf
[NetOptionalComponents] 
SNMP = 1
[SNMP] 
Contact_Name = "ITSupport" 
Location = "ServerRoom" 
Service = Physical, Applications, End-to-End 
Community_Name = Type_your_string_here 
Traps = Type_the_destination_IP 
Send_Authentication = Yes 
Accept_CommunityName = Type_your_string_here:Read_Only 
Any_Host = no 
Limit_Host = Type_the_destination_IP

2) 在服务器上运行以下命令
C:/Windows/System32/Sysocmgr.exe /i:%windir%/inf/sysoc.inf /u:path_to_the_file/snmp.inf


六、管理器连接

  当我们安装了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来进行监控脚本的编写。

SNMP 常用命令:

USAGE: snmpwalk [OPTIONS] AGENT [OID]

### snmpwalk 从某个特定的OID开始遍历MIB, bulk 报文的功能
[root@localhost ~]# snmpwalk -v2c -c public localhost .1
-v    # version, 指定SNMP版本
-c    # community, 团体名

### snmpwalk 获取网卡信息
[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

###  snmpget 从一个代理得到一个SNMP变量的值
### 获取eth1网卡流入的流量
[root@localhost ~]# snmpget -v2c -c public localhost IF-MIB::ifInOctets.2
IF-MIB::ifInOctets.2 = Counter32: 27983228

### snmpdelta 一直监视SNMP变量中的变化
### 监视 流量变化
[root@localhost ~]# snmpdelta -v2c -c public -Cs -CT localhost IF-MIB::ifInOctets.2

[root@localhost ~]# snmpnetstat -v 2c -c public -Can -Cp tcp 192.168.116.205 
#查看远程主机的tcp的状态表

## 获取 tcp 相关的所有信息
[root@localhost ~]# snmpwalk -v 2c -c public localhost tcp        
#即可查看跟tcp相关的所有信息

### snmpdf 通过snmp监控远程主机的磁盘空间
[root@localhost ~]# snmpdf -v2c -c public localhost


举例:
### snmptranslate 搜索并说明MIB结构中的OID

[root@localhost ~]# snmptranslate -On -IR system   (-On表示以数字格式输出,-IR表示随机访问MIB)
.1.3.6.1.2.1.1
[root@localhost ~]# snmptranslate -Onf -IR system  (-f表示列出名称型的OID)
.iso.org.dod.internet.mgmt.mib-2.system

### snmpset 设置代理上的一个SNMP变量 
linux:~ # snmpset -c private -v 1 test-hubsystem.sysContact.0 s dpz@noc.rutgers.edu ip.ipforwarding.0= 2

### snmptrap 生成一次trap告警
linux:~ # snmptrap -v 1 -c public managerenterprises.spider test-hub 3 0 '' interfaces.iftable.ifentry.ifindex.1 i 1

好了,更多命令的详细使用方法可以参考这篇文章:

http://lymrg.blog.51cto.com/1551327/377556

以及man, man才是最好的老师。


SNMP OID列表 监控需要用到的OID

http://www.cnblogs.com/aspx-net/p/3554044.html

wKioL1W8E23DtH5GAAGa7c1YMAs079.jpg

wKiom1W8EXujcRsxAAIzCOm7hfM677.jpg

wKioL1W8E22ypIo0AAJQCbYZww0990.jpg

wKiom1W8EXuT1APXAAI2Ec1o8Fk953.jpg

wKioL1W8E26SLXL3AAJjjonb4-A895.jpg


http://www.linuxfly.org/post/552/