martes, 15 de octubre de 2013

Usando Nagios para monitorear mediante SNMP

  Siguiendo con el tema anterior, una vez tenemos instalado el Nagios nos damos cuenta que por si solo no hace nada, debemos configurarlo y esta guía esta precisamente para ello. Antes de comenzar a agregar servicios para monitoreo, vamos a instalar un plugin llamado PNP4NAGIOS, este plugin nos permite tener a la mano gráficos de la data que produce Nagios, cabe acotar que este plugin no genera datos salvo que el check command (mas adelante hablaremos de esto) almacene información persistente de los datos que obtiene. 

 Realizaremos esto por etapas, la primera etapa es instalar el plugin PNP4NAGIOS y configurarlo, después descargaremos otro plugin llamado check_iftraffic64, el cual nos permite visualizar el consumo de ancho de banda de cada interfaz y trabaja muy bien con PNP4NAGIOS para generar gráficos en tiempo real de trafico de red. Luego les explicare de forma general como funciona Nagios y PNP4NAGIOS y procederemos al ejemplo (en este caso, vamos a monitorear un router TP-LINK flasheado con DD-WRT).

Instalando PNP4NAGIOS

Nota: Nuevamente asumiré que están en la consola de comandos de CentOS

1.- Descarga de PNP4NAGIOS

1.a- Nos vamos al directorio donde almacenamos los SRC de Nagios:

cd /usr/local/src/nagios/

1.b- Ejecutamos el siguiente comando:
     
wget http://sourceforge.net/projects/pnp4nagios/files/latest/download

2.- Instalando las dependencias de PNP4NAGIOS y check_iftraffic64

2.a- Ejecutamos el siguiente comando para instalar todas las dependencias de PNP4NAGIOS:

yum install perl rrdtool rrdtool-perl php-gd

2.b- Ejecutamos los siguientes comandos en orden:

perl -MCPAN -e shell 
tras lo cual la linea de comandos cambiara a: cpan[1]>
Dentro de esta nueva linea de comandos ejecutamos:
install Net::SNMP

esperamos a que termine de procesar y se devuelva a cpan[1]>
Ejecutamos ahora
install Net::DNS

Nota: si tienen algún problema (se queda pegada la consola después de ejecutar alguno de los "install"), vayan a /usr/share/perl/CPAN5 y dentro de esta carpeta editen el archivo Config.pm, busquen la linea que dice 'cache_metadata' => q[1] y cambien ese 1, por un 0. 

3.- Instalando PNP4NAGIOS y check_iftraffic64

3.a Descomprimimos el archivo de PNP4NAGIOS, seguimos en la carpeta donde lo descargamos así que nos toca ejecutar:

tar zxvf pnp4nagios-0.6.21.tar.gz
ahora nos pasamos al directorio donde se descomprimió
cd pnp4nagios-0.6.21

3.b Ejecutamos los siguientes comandos en orden para instalar PNP4NAGIOS:

./configure
make
make fullinstall
service httpd restart

3.c Verificamos que todo haya ido bien, para ello utilizando un navegador vamos a la pagina web http://IP-Servidor/pnp4nagios Si todo ha ido bien no veremos ningún error en esta pagina (todos los indicadores están en verde), de no ser este el caso, volver a revisar los pasos anteriores, de ser el caso entonces ejecutar:

mv /usr/local/pnp4nagios/share/install.php /usr/local/pnp4nagios/share/install.php.back

Como referencia aquí les dejo la pagina web como deberían de apreciarla:


3.d Instalamos ahora el plugin check_iftraffic64:

Nos vamos al directorio donde se almacenan los plugins
cd /usr/local/nagios/libexec/

Descargamos el check_iftraffic64.pl
wget http://exchange.nagios.org/components/com_mtree/attachment.php?link_id=4019&cf_id=24

Cambiamos el dueño del plugin
chown nagios:nagios check_iftraffic64.pl

Cambiamos los permisos de ejecucion del plugin
chmod +x check_iftraffic64.pl


   Con lo anterior terminamos con la instalación ahora vamos a explicar un poco como funciona Nagios, como lo tenemos que configurar y comenzaremos a utilizar esto para monitorear un router TP-LINK, lo aquí explicado sirve para cualquier dispositivo que trabaje con SNMP. 

¿Qué es SNMP?

   SNMP es un protocolo que se utiliza para monitorear dispositivos por medio de la red, este protocolo permite que un servicio como Nagios, recopile información de distintos aparatos (routers, switches, firewalls, teléfonos, computadoras, radios, etc.) en tiempo real y la catalogue/muestre al personal encargado del mantenimiento de dichos aparatos, también es posible que el Nagios tome acciones preventivas basándose en parámetros previamente configurados, por ejemplo, enviar un mensaje de texto al Ingeniero encargado de la red avisandole que según los datos recopilados el router esta a punto de colapsar (por poner un ejemplo), o le muestre gráficos de estadísticas de funcionamiento. 

  Entre las cosas que podemos monitorear mediante SNMP se encuentran:
  • Estado de interfaces
  • Consumo de ancho de banda
  • Frecuencias de operación de un radio
  • Consumo de amperaje y estado de batería de un UPS
  • Numero de llamadas concurrentes en un teléfono
  • Aplicaciones en ejecución en un servidor
  • Perdida de paquetes
  • etc
  Como se aprecia SNMP es un protocolo bastante completo, lo primero que se debe realizar es revisar la documentación correspondiente al dispositivo que queremos monitorear y revisar que permita ser monitoreado mediante SNMP, si tiene una interfaz de red es muy probable que si lo permita. 

El community String y los OIDs
    
   SNMP ya va por 3 versiones, en este caso solo hablaremos de la version 2, esta versión incluye algo que se denomina Community String, es como una contraseña, se le configura al equipo que se desea monitorear y luego, si se desea obtener información de este, el dispositivo que la solicita (ejemplo un servidor corriendo Nagios), debe utilizar esa misma "contraseña" para obtener la data, de lo contrario se le niega. 

   Los OIDs, son Identificadores de Objetos, OID significa, Object Identifier, un objeto en SNMP puede ser un servicio, una interfaz, el estado de una batería, etc. Luego de activar SNMP en el equipo que queremos monitorear y colocarle un community string, tocara hacer un "snmp walk" que no es otra cosa mas que hacer un listado de todos los OIDs que ese dispositivo en particular posee. Leer una lista de OIDs de un dispositivo recién empezando puede ser extremadamente confuso, lo importante es ir con calma y utilizando la lógica, los nombres si bien son abstractos, suelen tener un sentido lógico como veremos mas adelante. 

Archivos de configuración de Nagios

   Pasare a describir brevemente la ubicación y cambios a cada archivo, no seré explicito con lo que hace cada uno porque cada archivo podría tomarnos horas de explicación  lo mejor es que se lean la documentación que posee cada uno la cual es bastante completa, por ahora solo hagan los cambios que les indico y luego si seré explicito con el como agregar servicios, todos estos cambios son preparativos para los servicios que agregaremos. 

cgi.cfg
   Ubicado en /usr/local/nagios/etc/ permite entre otras cosas colocar los permisos de administración de Nagios (quien puede acceder a la interfaz web, que puede ver, que puede hacer, etc), sugiero leer lo que dice, si bien esta en ingles es muy conciso, por ahora si no quieren leer eso, pues substituyan en el archivo en cada lugar donde vean nagiosadm o nagiosadmin por * (asterisco). 

nagios.cfg
    También ubicado en el mismo lugar que en el archivo anterior, aqui se especifica la configuración general de Nagios, así como la ubicación de los archivos cfg de objetos que definen los hosts y servicios a monitorear. 

En este archivo necesitamos agregar unas cosas, en primera instancia colocamos luego del primer "log_file=" (cerca del principio del archivo):

cfg_file=/usr/local/nagios/etc/objects/Nuestros-Equipos.cfg

Luego dentro del archivo ubicamos la linea:

process_performance_data=0 y cambiamos el 0 por 1

Adicionalmente copiamos y pegamos todo lo siguiente al FINAL del archivo (tal cual esta).

service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

htpasswd.users
      También en el directorio anterior, aquí se almacenan los usuarios y sus contraseñas, para poder acceder a Nagios el usuario DEBE estar listado en este archivo, no se puede cambiar manualmente, se hace utilizando el comando htpasswd.

commands.cfg
      Este se encuentra en /usr/local/nagios/etc/objects/ aquí se definen los comandos que necesitan los distintos servicios para poder funcionar, en este archivo justo al final copiamos y pegamos todo lo siguiente (es para añadir los comandos que utilizaremos cuando comencemos a definir servicios a monitorear):

define command{
       command_name    process-service-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
}

define command{
       command_name    process-host-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
}

define command{
        command_name    check_icmp
        command_line    $USER1$/check_icmp -H $HOSTADDRESS$ $ARG1$ -p 5
}

define command{
        command_name    check_iftraffic
        command_line    $USER1$/check_iftraffic64.pl -H $HOSTADDRESS$ $ARG1$
}

templates.cfg
    También se ubica en el directorio objects, aquí tendremos que agregar unas lineas al final:

define host{
        name    host-pnp
        register        0
        action_url      /pnp4nagios/graph?host=$HOSTNAME$
}

define service
        name    srv-pnp
        register        0
        action_url      /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
}

Utilizando Nagios

  El siguiente diagrama muestra el funcionamiento de Nagios (ademas de como se integra con PNP4NAGIOS):


    Primeramente aprenderemos a "escanear" el dispositivo que queremos monitorear, para ver que OIDs posee y de esta forma seleccionarlos, no voy a ponerme a hablar sobre como activar el servicio SNMP en el dispositivo que tienen ni como colocarle un community string, eso depende de cada aparato, les sugiero que lean el manual. 

   Para este ejemplo utilizaremos el router que mencione al principio del post, el community string de este es "public" (como nota, normalmente por defecto este es el community string de todos los aparatos que utilizan SNMP), la version de SNMP es la 2 y la IP del servidor es 192.168.1.20. 

   Para escanear existen muchas herramientas, algunas de ellas con interfaces gráficas, aquí utilizaremos snmpwalk, un comando que es parte del paquete net-snmp-utils, que si han seguido ambos post, ya deben de tener instalado en su servidor CentOS.

   El comando snmpwalk se utiliza de esta forma:
snmpwalk -v "version de SNMP" IPHost -c "Community String"

   Para este caso en particular seria: snmpwalk -v 2c 192.168.1.20 -c public 

   Cuando le den a "enter" verán una gran cantidad de lineas que a priori, no entenderán, sin embargo son bastante explicativas una vez nos ponemos a analizarlas, he aquí unas cuentas lineas de muestra:

NMPv2-MIB::sysDescr.0 = STRING: Linux DD-WRT 3.5.7 #6148 Mon Mar 25 08:58:25 CET 2013 mips
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (32570097) 3 days, 18:28:20.97
SNMPv2-MIB::sysContact.0 = STRING: root
SNMPv2-MIB::sysName.0 = STRING: dd-wrt
SNMPv2-MIB::sysLocation.0 = STRING: Venezuela
NMPv2-MIB::sysDescr.0 = STRING: Linux DD-WRT 3.5.7 #6148 Mon Mar 25 08:58:25 CET 2013 mips
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (32570097) 3 days, 18:28:20.97
SNMPv2-MIB::sysName.0 = STRING: dd-wrt
SNMPv2-MIB::sysLocation.0 = STRING: Venezuela
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: br0
IF-MIB::ifDescr.3 = STRING: eth1
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifAdminStatus.3 = INTEGER: up(1)
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.3 = INTEGER: down(2)

  Lo que les marco en rojo son los OIDs, lo que marco en azul es que devuelve cada uno de esos OIDs, por ejemplo, tomemos el OID sysLocation.0, podemos observar que devuelve un dato de tipo string que contiene la palabra "Venezuela", haciendo alusión a la ubicación actual del sistema. 

  Tomemos otro, por ejemplo ifDescr.3, esto hace alusión a una interfaz de red en el router que se llama eth1, luego todos los OIDs que comiencen por "if" hacen alusión a una interfaz, el numero después del "punto" indica a cual interfaz, para hacerlo mas claro agrupemos:

IF-MIB::ifDescr.3 = STRING: eth1
IF-MIB::ifAdminStatus.3 = INTEGER: up(1)
IF-MIB::ifOperStatus.3 = INTEGER: down(2)

   Tenemos en total 3 OIDs, que referencian a una sola interfaz (eth1), el primero nos indica el nombre de la interfaz, el segundo nos indica el estado administrativo de la interfaz (en este caso "up" o arriba), el tercero nos indica el estado operativo físicamente hablando de la interfaz, en este caso down o caida. 

   Notese que los nombres de los OIDs en conjunto con el resultado que devuelven suelen ser autoexplicativos. 

   Es nuestra labor leernos esta lista de OIDs para cada dispositivo y luego "cazar" cual nos sirve, lo bueno es que esto esta estandarizado, asi que los nombre de los OIDs no suelen cambiar entre dispositivos del mismo tipo, lo que si suele cambiar es el nombre a lo que referencian, ejemplo, en otro router eth1 no devuelve eth1 sino eth3.

Configurando nuestro primer monitoreo

   Para empezar a les enseñare como utilizar 3 plugins, los plugins de Nagios todos se almacenan en /usr/local/nagios/libexec/

check_snmp: este plugin permite verificar un OID, la sintaxis es:

check_snmp! -C "Community String" -o "OID a verificar")

Por ejemplo
check_snmp! -C public -o ifDescr.3

check_icmp: permite verificar las latencias y perdida de paquetes de un enlace (desde el server de nagios hasta el equipo monitoreado) su sintaxis es:

check_icmp! -w "Lms","PPDP"% -c "Lms","PPDP"%

  Donde Lms es latencia en milisegundos y PPDP es porcentaje de perdida de paquetes, estos dos parámetros se definen en función de cuando se debe considerar como en "advertencia" el estado del enlace y cuando se debe considerar como critico, ejemplo, queremos que nos de advertencia cuando las latencias sean igual o superior a 100 ms y/o la perdida de paquetes sea igual o superior al 40%, ademas que nos indique estado critico si Lms es mayor o igual a 200 ms y/o PPDP es mayor o igual a 60% entonces:
check_icmp! -w 100.0,40% -c 200.0,60%

check_iftraffic64: permite verificar el ancho de banda consumido actualmente por una interfaz en subida y/o bajada, así como cuantos bytes ha descargado en un lapso determinado de tiempo. Su sintaxis es:
check_iftraffic64! -i "interfaz" -b "BW" -u m --32bit

Por ejemplo, la interfaz eth1 anterior siendo FastEthernet
check_iftraffic64! -i 3 -b 100 -u m --32bit

   Donde "interfaz" es la interfaz del dispositivo que queremos monitorear, basándonos en el escaneo mediante SNMP, recuerden que lo que esta después del punto es el indice de la interfaz en los OID que comiencen por "if", así que lo que va aquí es ese numero (o indice), "BW" es el ancho de banda de linea de la interfaz (ejemplo si es Fast Ethernet, aquí iría un 100). 

   Utilizaremos la siguiente plantilla para crear las descripciones de host y servicio de del router, para que luego Nagios nos muestre la información concerniente a la interfaz web. Creamos un archivo con cualquier editor que deseen en /usr/local/nagios/etc/objects y como nombre de archivo le colocamos "Nuestros-Equipos.cfg", como el archivo es un tanto largo se los dejo para que descarguen, las lineas se encuentran comentadas así que no deberían tener problemas en seguirlo basándonos en lo que explique anteriormente de los plugins. 


  Algunas Imágenes del resultado final:

Interfaz de Nagios



Interfaz de PNP4NAGIOS



   Nada mas que agregar respecto a esto, NAGIOS es una herramienta muy poderosa y yo aquí solo he explicado lo mas básico y fundamental para que puedan ponerlo a funcionar, les sugiero leer mucho concerniente a este, esconde muchas sorpresas. 

No hay comentarios:

Publicar un comentario