domingo, 22 de mayo de 2011

Ping ARP en Nagios

Hace poco configuré Nagios en el trabajo. La idea es tener un sistema que envíe alertas cuando algún servidor se cae o deja de ser accesible. Pero también me interesa saber que maquinas están encendidas en cualquier momento para, por ejemplo, no olvidar que deben apagarse al final del día (ya un par de veces alguna se ha quedado encendida toda la noche ¬¬)

Bien, Nagios es un sistema que permite hacer todo eso y más. Sin embargo su manera (por defecto) de revisar si un host esta vivo o no, es haciéndole ping una determinada cantidad de veces para luego ver cuantas responde. El problema es que algunas máquinas que quiero monitorear no responden al ping y Nagios las detecta como apagadas cuando en realidad no lo están :(

Por ello me puse a buscar plugins para resolver mi problema y al no encontrar uno que me gustara lo suficiente tuve que programarlo yo mismo xD

El código que pondré a continuación es un sencillo script bash que utiliza la técnica de escaneo por ARP, es decir, realiza una solicitud ARP al host en cuestión y si responde con su MAC entonces está vivo en caso contrario no lo está. El problema con esta técnica es evidente, solo funcionará con hosts del mismo segmento. Pero, para mi caso, eso es suficiente.

#!/bin/bash
# Name: check_pingarp.sh v.0.1
# Programado por: Cesar Neira <csar.1603@gmail.com>
# Fecha: 22/05/2011
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#

# Nagios status
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# Verify parameters
if test $# != 1
then
 echo "Use: $0 <IP_ADDRESS>"
 exit $STATE_UNKNOWN
fi

ip=$1
ping -c 1 -w 1 $ip > /dev/null; # send ARP request
sleep 5;                        # wait for 5 seconds
arp=$(ip neigh show);           # get the ARP table
IFS=$'\x0a';
for line in $arp
do
 ipaddr=$(echo $line | cut -d " " -f 1) 
 if test "$ipaddr" == "$ip"
 then
  dev=$(echo $line | cut -d " " -f 3)
  tmp=$(echo $line | cut -d " " -f 4)
  if test "$tmp" == "lladdr"
  then
   lladdr=$(echo $line | cut -d " " -f 5)
   state=$(echo $line | cut -d " " -f 6)
   echo "$ip is UP ($dev / $lladdr / $state)"
   exit $STATE_OK
  else
   state=$(echo $line | cut -d " " -f 5)
   echo "$ip is DOWN ($dev / / $state)"
   exit $STATE_CRITICAL
  fi
 fi
done
echo "The address $ip is not in the local network."
exit $STATE_UNKNOWN

Instalación

Guardar el código en un fichero con el nombre "check_pingarp.sh" dentro de "/usr/local/nagios/libexec"

Asignar permisos de ejecucion al script

# chmod +x /usr/local/nagios/libexec/check_pingarp.sh

Definir un nuevo commando en Nagios

# vim /usr/local/nagios/etc/objects/commands.cfg
define command {
        command_name    check_pingarp
        command_line    $USER1$/check_pingarp.sh $HOSTADDRESS$
}

Luego, en la definición de un host, colocamos el nuevo comando como "check_command".

define host {
        use                     linux-server
        host_name               servidor-web
        alias                   Servidor web
        address                 192.168.1.101
        check_command           check_pingarp
}

Eso es todo. Así se verá la respuesta del script en la interfaz web de Nagios.

Fig. 1 - Reporte del script.

Un saludo.

2 comentarios:

  1. cuando empezaste a instalar que medidas tomaste, para que vaya conforme !!! tengo muchos problemas en mi red !!

    ResponderEliminar
  2. Hola Javier, te sugiero que revises esta guía:

    http://sanmarcux.org/howto/152-instalar-nagios-en-ubuntu.html

    A mi me funcionó.

    Un saludo.

    ResponderEliminar