当我们遇到设备出现故障或需要进行管理时,我们总要去单独进入到该设备中去进行操作检测,这样既浪费时间又觉得工作量大,snmp协议可以帮我们解决这个问题,在众多的设备和服务器等组成的网络中,我们可以通过在一台主机上搭建nms服务器通过其他设备或主机上的agent机制利用snmp协议来完成对整个网络中的设备的状态监控,时时刻刻向nms发送trap信息,trap信息反映各设备的及时事件,它就像交通中心一样,时刻反映给我们各个设备的运行状态,方便我们去管理网络。

 

关于snmp:

目前网络中用得最广泛的网络管理协议是 SNMP  (Simple  Network  Management Protocol,简单网络管理协议)。SNMP  是被广泛接受并投入使用的工业标准,用于保证管理信息在网络中任意两点间传送,便于网络管理员在网络上的任何节点检索信息、修改信息、定位故障、完成故障诊断、进行容量规划和生成报告。SNMP 采用轮询机制,只提供最基本的功能集,特别适合在小型、快速和低价格的环境中使用。SNMP 的实现基于无连接的传输层协议UDP,因此可以实现和众多产品的无障碍连接。

 

工作机制:

SNMP 分为 NMS 和Agent 两部分:NMS  (Network Management Station,网络管理站)是运行客户端程序的工作站,目前常用的网管平台有QuidView、Sun NetManager 和 IBM NetView。Agent 是运行在网络设备上的服务器端软件。NMS 可以向Agent 发出GetRequest、GetNextRequest 和 SetRequest 报文,Agent接收到 NMS  的这些请求报文后,根据报文类型进行 Read  或 Write  操作,生成Response 报文,并将报文返回给 NMS。Agent 在设备发生异常情况或状态改变时(如设备重新启动),也会主动向 NMS 发送Trap 报文,向 NMS 汇报所发生的事件

SNMP Agent 支持 SNMP v3 版本,兼容 SNMP v1 版本、SNMP v2C版本

SNMP v3 采用用户名和密码认证方式。

SNMP v1、SNMP v2C 采用团体名(Community Name)认证,非设备认可团体名的SNMP 报文将被丢弃。

Trap 是被管理设备不经请求,主动向 NMS 发送的信息,用于报告一些紧急的重要事件

 

Linux SNMP

以下的示例采用CentOS Linux环境,但它同样适用于其它Linux发行版。

 

编译和安装

请使用root账号或者使用sudo权限安装,否则会提示权限错误。

首先我们需要下载Net-SNMP的源代码,请选择一个相对比较新的SNMP版本,例如5.7.2(当前最新版本),地址如下:

http://nchc.dl.sourceforge.net/project/net-snmp/net-snmp/5.7.2/net-snmp-5.7.2.tar.gz

 

使用wget下载代码:

root@snmp~# wget http://nchc.dl.sourceforge.net/project/net-snmp/net-snmp/5.7.2/net-snmp-5.7.2.tar.gz


接下来对下载的源代码包进行解压缩,如下:

root@snmp~# tar xzvf net-snmp.tar.gz


然后通过源码的configure来生成编译的Makefile规则,如下:

root@snmp~# cd net-snmp-5.7.2
root@snmp~# ./configure --prefix=/usr/local/snmp --with-mib-modules=ucd-snmp/diskio -enable-mfd-rewrites

 

请注意参数:

--prefix=/usr/local/snmp
选项,选择snmp的安装路径。

--with-mib-modules=ucd-snmp/diskio
选项,可以让服务器支持磁盘I/O监控。

–enable-mfd-rewrites


选项,允许用新的MFD重写mid模块,这样编译的snmp就能支持64位的计数器,能正常采集到流量。

SNMP在安装时需要选择使用的协议版本,包含三个选项:1,2(for 2c)和3。我们强烈推荐用户选择 3 版本!为了安全, 1 版本不能添加snmp监控,所以不推荐使用!其他选项直接跳过就可以啦。

 

接下来,开始编译和安装:

root@snmp~# make
root@snmp~# make install
到现在为止,我们已经拥有了可以运行的SNMP程序,它位于/usr/local/snmp/sbin/snmpd,在启动它之前,我们还要进行一些必要的设置。

 

设置安全的验证方式

将SNMP代理程序暴露给网络上的所有主机是很危险的,为了防止其它您不允许的主机访问你的SNMP代理程序,我们需要在SNMP代理程序上加入身份验证机制。

SNMP支持不同的验证机制,这取决于不同的SNMP协议版本。

请注意,SNMP协议版本和SNMP程序版本是两回事,刚才说的v2c和v3是指SNMP通用协议的版本,而Net-SNMP是实现SNMP协议进行通信的程序套件,目前它的最新版本是5.7.2。

 

★ v2c

先来看如何配置v2c版本的SNMP配置,2c版本的SNMP配置有两种配法,在此我们只介绍最简单的配置方式,如果想了解更多,请您自行查找。

如果您是按照我们刚才教由你的方式进行的手工编译的SNMP,首先我们来创建snmpd的配置文件,如果不存在,请在以下目录创建它如下所示:

root@snmp~# vim /usr/local/snmp/share/snmp/snmpd.conf


然后我们需要创建一个只读帐号,也就是read-only community,在snmpd.conf中添加以下内容:

rocommunity yunjiankong default
注意:添加用户时,请在添加完成后重启snmp服务,这样添加才会成功。同时由于云监控可能会变动监测点的IP,到时候就需要重新设置,还请注意

这里的“rocommunity”表示这是一个只读的访问权限,云监控只可以从你的服务器上获取信息,而不能对服务器进行任何设置。

紧接着的“yunjiankong”叫做community,相当于snmp的密码,很多平台喜欢使用“public”这个默认字符串。这里的“yunjiankong”只是一个样例,请务必将此字符串设置复杂,请不要使用默认的public,我们的样例yunjiankong等字串

最右的“default”代表云监控能访问您的服务器的SNMP,目前云主机监控处于不断迭×××发状态,所以我们暂时还未最终确定客户端的固定IP(目前暂有:101.199.100.150(新加入), 220.181.150.98, 180.153.229.230,220.181.150.125, 103.28.10.223。但是会经常变动,还请关注我们的官方说明)

 

如果想限定指定IP访问您的SNMP,只需要将default替换成您想要被访问的IP,多行需要填写多个:

rocommunity yunjiankong 101.199.100.150
rocommunity yunjiankong 220.181.150.98
rocommunity yunjiankong 180.153.229.230
# 更多IP请按以上格式填写


所以,以上这段配置中,只有“yunjiankong”是需要你进行修改的(如果指定IP,会在以后会可能需要修改),同时在云监控上添加服务器并选择2c版本时,只需要您提供这个字串作为密码即可。

 

★ v3

当然,我们强烈建议您使用v3版本来进行身份验证。对于一些早期版本的Linux分发版,其内置的SNMP程序可能并不支持v3,所以我们建议您按照前边介绍的方法,编译和安装最新的Net-Snmp。

v3使用的是另一种验证方式,会比v2c版本复杂一些,我们需要创建一个v3的帐号,我们同样修改以下配置文件:

root@snmp~#  vim /usr/local/snmp/share/snmp/snmpd.conf


然后添加一个只读帐号,如下:

rouser yunjiankong auth
注意:添加用户时,请确保snmp服务没有运行,否则无法添加。

在v3中,“rouser”用于表示只读帐号类型,随后的“yunjiankong”是指定的用户名,后边的“auth”指明需要验证。

 

接下来,我们还要添加“yunjiankong”这个用户,这就是v3中的特殊机制,我们打开以下配置文件:

root@snmp~#  vim /var/net-snmp/snmpd.conf


这个文件会在snmpd启动的时候被自动调用,我们需要在它里边添加创建用户的指令,如下:

createUser yunjiankong MD5 mypassword
这行配置的意思是创建一个名为“yunjiankong”的用户,密码为“mypassword”,并且用MD5进行加密传输。这里要提醒的是:

密码至少要有8个字节

这是SNMP协议的规定,如果小于8个字节,通信将无法进行。

 

值得注意的是,一旦snmpd启动后,出于安全考虑,以上这行配置会被snmpd自动删除,当然,snmpd会将这些配置以密文的形式记录在其它文件中,重新启动snmpd是不需要再次添加这些配置的,除非你希望创建新的用户。

以上配置中的用户名、密码和加密方式,在云监控添加服务器的时候需要添加。

 

启动SNMP代理程序

经过配置后,现在可以启动snmpd  (最好使用绝对路径启动),如下:

/usr/local/snmp/sbin/snmpd
如果要关闭,则可以直接kill这个进程,如下:

killall -9 snmpd


增强的安全机制

请注意,此步并不是必须要进行的步骤,建议如果您了解linux网络防火墙(iptables)才进行设置,否则可能导致您的网站无法被访问到。正常情况下如果不暴露您的服务器ip的情况下,snmp是非常安全的。

有了以上的验证机制,你就可以放心的使用SNMP代理了。但是,如果你的SNMP代理程序版本较低,可能会有一些别有用心的破坏者利用一些固有的漏洞进行破坏,比如发送较长的数据导致SNMP代理程序内存泄漏或者拒绝服务等,为此,你还可以使用防火墙(iptables)来进行增强的安全过滤。

 

在Linux中,我们用iptables来实现防火墙,一般情况下,除了流入指定端口的数据包以外,我们应该将其它流入的IP数据包抛弃。你可能已经配置了一定的防火墙规则,那么只要增加针对SNMP的规则即可。

 

SNMP代理程序默认监控在udp161端口,为你的iptables增加以下规则:

iptables -A INPUT -i eth0 -p udp -s 220.181.150.98 --dport 161 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s 180.153.229.230 --dport 161 -j ACCEPT
以上设置中假设服务器外网网卡是eth0,你可以根据实际情况来修改。

 

这样一来,只有专用监控器可以发送UDP数据包到你的服务器的161端口,与SNMP代理程序进行通信。

 

可以使用自建的监控器来监控服务器运行实时情况,也可以借助第三方监控器来监控。