Instalar y configurar NAGIOS para la monitorización de equipos en la red.

Nagios es un sistema de monitorización de redes ampliamente utilizado, de código abierto, que vigila los equipos (hardware) y servicios (software) que se especifiquen, alertando cuando el comportamiento de los mismos no sea el deseado.

Más información en la Wikipedia: http://es.wikipedia.org/wiki/Nagios

Mostraré como instalar y configurar Nagios para monitorizar una red de equipos, concretamente utilizando una Raspberry Pi corriendo Raspbian, una variante de Debian, pero los ejemplos pueden extrapolarse a otras distribuciones con pocos cambios.


Los pasos que seguiré son:

  1. Instalar Nagios vía apt-get
  2. Añadir equipos, grupos y servicios a la configuración.
  3. Consejos avanzados.
  4. Enlaces de interés.

Partimos del punto en que el sistema operativo está funcionando y disponemos de acceso SSH.

  1. Instalar Nagios vía apt-get:

    Accedemos vía SSH al terminal, ya sea con Putty en Windows, con el Terminal en Mac OS o Linux y actualizamos nuestro apt-get:

    sudo apt-get update
    sudo apt-get upgrade

    Luego instalamos nagios3:

    sudo apt-get install nagios3 nagios-plugins nagios-nrpe-plugin
    sudo apt-get install nagios-nrpe-server nagios-plugins

    Aparecerá una pantalla azul solicitando dos veces la contraseña de la administración Web de Nagios, será necesaria cada vez que queramos acceder al panel Web de gestión, el usuario es nagiosadmin (Captura de la pantalla).

    Ya tenemos instalado el servicio y activo en la url: http://ip_del_terminal/nagios3 .

    Ahora bien, lo interesante está en la configuración.

  2. Añadir equipos, grupos y servicios a la configuración

    Ya tenemos el panel de gestión accesible en la carpeta nagios3 del servidor web con el usuario “nagiosadmin” y la contraseña que establecimos al instalarlo, pero si accedemos podemos ver que sólo hay un equipo, el propio servidor que se “autoañade” al panel.

    Lo óptimo es añadir equipos organizados en ficheros según su tipo, switches y routers en un fichero (switch.cfg), equipos Windows en otro (windows.cfg), etc…

    El primero que añadiremos será nuestro propio router, ya que todo el mundo tiene uno siempre encendido, crearemos un fichero switch.cfg en la ruta: /etc/nagios3/objects/switch.cfg con el siguiente contenido:

    # HOSTS DEFINITIONS
    # ROUTER 1
    define host {
    	use generic-host
    	host_name router1
    	display_name Router1
    	address 192.168.1.1
    	check_period 24x7
    	check_interval 5
    	retry_interval 1
    	max_check_attempts 10
    }
    
    # SERVICE DEFINITIONS
    define service {
    	use generic-service
    	host_name router1
    	service_description PING
    	check_command check_ping!200.0,20%!600.0,60%
    	normal_check_interval 5
    	retry_check_interval 1
    }

    Para crear el fichero desde cero puedes usar el comando:

    sudo nano /etc/nagios3/objects/switch.cfg

    En el primer bloque de código hemos añadido el host (router) y en el segundo hemos creado un servicio que hace ping cada 5 minutos, si falla, lo intenta cada minuto, devolviendo alerta crítica cuando el ping tarda más de 600ms y una alerta cuando supera los 200ms.

    En la definición del Host tenemos ciertas propiedades y valores, los más importantes son:

    • use: indica que tipo de máquina se va a analizar, por defecto sería “generic-host”, esto aplica ciertas propiedades según las plantillas analizadas, veremos otras más adelante.
    • host_name: es el nombre del host, es importante porque será nuestro identificador a la hora de asociar servicios por ejemplo.
    • display_name: Nombre a mostrar en el panel de gestión.
    • address: Dirección IP de la máquina a ser analizada.
    • check_period: Es opcional e indica el periodo de actividad del host, se puede establecer a diferentes valores como por ejemplo 24×7 que indica que está siempre activo (24h 7 días), es posible definir periodos de tiempo (horarios de apertura de una tienda por ejemplo), más información acerca de los “time periods” en: http://nagios.sourceforge.net/docs/3_0/timeperiods.html.
    • check_interval: Indica el intervalo de tiempo en el que se controlará el estado del host (DOWN/UP).
    • retry_interval: Intervalo de tiempo de recomprobación cuando el intento de consulta de estado falla.
    • max_check_attempts: Indica el máximo número de intentos de conectar con el host una vez que ha pasado al estado DOWN.

    Las propiedades más importantes de la definición de los servicios son:

    • use: indica el tipo de servicio, usaremos “generic-service”.
    • host_name: Establece el host o hosts (separados por comas) a los que afectará este servicio.
    • service_description: Texto descriptivo de la funcionalidad del servicio.
    • check_command: Es el comando que se lanzará contra el host, existen muchos predefinidos y podemos crear más, los comandos predefinidos están en la ruta /usr/lib/nagios/plugins, hay mucha información en Google de cómo funciona y cómo parametrizar cada comando.
    • nombre_check_interval: El tiempo transcurrido entre cada ejecución del comando.
    • retry_check_interval: El tiempo que transcurre desde que hay una ejecución del comando fallida y el siguiente intento.

    Ahora que hemos añadido un nuevo host y nuevo servicio en el archivo switches.cfg, tenemos que decirle a Nagios que lea ese fichero al iniciar el servicio, para ello tenemos que editar el fichero nagios.cfg situado en: /etc/nagios3/nagios.cfg, y quitar la almohadilla (#) de la linea que dice:

    cfg_file=/etc/nagios3/objects/switch.cfg

    De esta forma ya no es un comentario y la ejecutará al iniciar el servicio.

    Ahora, para que los cambios tengan efecto y aparezca nuestro nuevo host y servicio en el panel tenemos que reiniciar el servicio nagios.

    Reiniciar el servicio Nagios3 para que los cambios tengan efecto:

    sudo service nagios3 restart

    Con esto ya deberíamos ver nuestro router en el panel de gestión, en la sección Hosts, y en la sección servicios, deberíamos ver el ping que se le hace al router, captura de pantalla:

    Añadir Equipos Windows y Linux

    Antes de entrar en profundidad con los servicios, en necesario catalogarlos en dos tipos, servicios “públicos” y servicios “privados”, los servicios “públicos” serían aquellos de los cuales se puede obtener información sin necesidad de acreditarse, servicios ofrecidos por el servidor como por ejemplo HTTP, FTP, POP3, IMAP.

    Luego existen otro tipo de servicios, los llamados “privados” porque son internos del equipo y no se ofrecen al exterior, como por ejemplo el uso de la memória, la carga de la CPU, el espacio de disco, los procesos, los servicios y demás, son los más interesantes y nos proporcionan un información muy valiosa.

    Para poder monitorizar servicios “privados” es necesario instalar un agente en el equipo que actúa de proxy entre el servidor nagios y el equipo a monitorizar enviando la información.
    El que voy a explicar es aparte del más sencillo, el más utilizado; NSClient++.

    Agente de nagios para Windows NSClient++ (28MB): http://sourceforge.net/projects/nscplus/

    El proceso de instalación del agente sería:



    Reemplazar la dirección 192.168.1.100 por la ip de tu servidor nagios, y el password evidentemente.

    Ya teniendo instalado NSClient++ en la maquina Windows pasamos a darlo de alta en nuestro sistema nagios.

    Hemos visto como añadir un “generic-host” a la configuración, creando un fichero switch.cfg.

    Ahora añadiremos un PC con Windows a la monitorización de Nagios, como hemos visto antes, separamos los diferentes tipos de hosts por ficheros, ahora crearemos el fichero /etc/nagios3/objects/windows.cfg en donde especificaremos la definición de un host Windows y sus servicios, para crear el fichero desde el terminal usamos:

    sudo nano /etc/nagios3/objects/windows.cfg

    Añadiremos el siguiente contenido, muy similar al anterior del router:

    # HOST DEFINITIONS
    define host {
            use windows-server
            host_name miservidor
            alias Mi Servidor Windows
            address 192.168.1.104
    }
    
    # SERVICE DEFINITIONS
    
    # Obtenemos la versión instalada de NSClient++
    define service {
            use generic-service
            host_name miservidor
            service_description Versión de NSClient++
            check_command check_nt!CLIENTVERSION
    }
    
    # Carga de CPU
    define service {
            use generic-service
            host_name miservidor
            service_description Carga de CPU
            check_command check_nt!CPULOAD!-l 5,80,90
    }
    
    

    Vemos que en este ejemplo hemos definido el Host (miservidor) del tipo “windows-server” y a él le hemos agregado dos servicios, obtendremos la carga de CPU y la Versión del agente que tienen instalado, los dos utilizando el comando check_nt que da para mucho juego como veremos más adelante.

    El valor del campo “host_name” de la definición de servicio indica a que equipos afecta dicho servicio, en nuestro caso únicamente a “miservidor”.

    También tenemos que modificar el fichero /etc/nagios3/nagios.cfg para quitar la almohadilla (#) de las siguientes lineas:

    cfg_file=/etc/nagios3/objects/windows.cfg

    y

    cfg_file=/etc/nagios3/objects/templates.cfg

    Nota: Asegúrate de que existe el fichero /etc/nagios3/objects/templates.cfg, si no lo tienes, puedes copiarlo de aquí: http://www.tropiezosenlared.com/ficheros/nagios/templates.cfg, es importante ya que ahi están las plantillas más importantes como la que hemos usado en el ejemplo: “windows-server”, yo lo he tenido que copiar.

    Volvemos a reiniciar el servicio nagios3 para que los cambios se apliquen:

    sudo service nagios3 restart

    Si entramos ahora en el panel de gestión de nagios veremos que ya tenemos nuestra maquina windows listada y sus dos servicios asociados.

    Más ejemplos de servicios:

    Hemos visto cómo obtener la versión de NSClient instalada y la carga de CPU, veamos ahora otros ejemplos, no pongo la definición completa del servicio, solo el comando, el resto de la definición es simplemente como las dos que hemos visto antes, cambiando el service description por un texto descriptivo.

    • Uptime, o tiempo desde el arranque:
      check_command check_nt!UPTIME
    • Uso de memória:
      check_command check_nt!MEMUSE!-w 80 -c 90

      Los parámetros indican los umbrales de alerta para el Warning (-w) y para el Critical (-c), es decir, al 80% de uso de memoria hará una advertencia y al 90% un crítico.

    • Espacio de disco usado:
      check_command check_nt!USEDDISKSPACE!-l c -w 80 -c 90

      Al 80% de dico C:\ usado tendremos un Warning y al 90% un Critical.

    • Estado de un servicio:
      check_command check_nt!SERVICESTATE!-d SHOWALL -l filezillaserver

      Este comando devuelve un Critical cuando el servicio “filezillaserver” está parado.

    • Estado de un proceso (aplicación):
      check_command check_nt!PROCSTATE!-d SHOWALL -l Explorer.exe

      Devolverá un Critical si el proceso Explorer.exe no está en ejecución.

    • Estado del servicio HTTP:
      check_command check_http

      Devolverá Critical si el servicio HTTP no esta funcionando.

    • Estado del servicio HTTP por el puerto 4000:
      check_command check_http!-p 4000

      Comprobará el estado del servicio HTTP por el puerto 4000.

    • Estado del servicio de correo SMTP:
      check_command check_smtp
    • Estado del papel de una impresora:
      check_command check_printer!paper!1

      Devolverá el estado del papel den la bandeja de la impresora, Critico si la impresora está sin papel.

    Existen infinidad de definiciones de servicios, yo he listado los más comunes, pero al poder añadir comandos de terceros en la carpeta plugins podemos hacer prácticamente cualquier comprobación, basta con indagar un poco.

    Contraseña en el NSClient++:

    Si hemos especificado una contraseña en la instalación del agente NSClient++ será necesario especificarla en los comandos, para ello lo más sencillo es redefinir el comando “check_nt” para que incluya las credenciales.

    Editaremos el fichero /etc/nagios3/commands.cfg con el comando:

    sudo nano /etc/nagios3/commands.cfg

    y añadiremos las siguientes lineas reemplazando “PASSWORD” por la contraseña establecida en NSClient++:

    define command{
    	command_name	check_nt
    	command_line	$USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -s PASSWORD -v $ARG1$ $ARG2$
    }

    y de nuevo reiniciamos el servicio nagios3

    sudo service nagios3 restart

    Nota: Si nos arroja un error de definición duplicada deberemos comentar las lineas de la definición del comando check_nt en el fichero /etc/nagios-plugins/config/nt.cfg.

    Ahora que ya tenemos nuestro router y nuestro PC pasamos a unos consejos para administrar alguna red más completa de una forma óptima.

    Hostgroups, grupos de equipos:

    Lo lógico en una red compleja es agrupar los equipos por tipo o ubicación.

    Pongámonos en situación, una oficina con 50 PCs, 15 impresoras, 4 routers, 7 switches, 30 cámaras IP, 3 servidores, etc..

    Para una correcta gestión, definiremos grupos de equipos a los cuales podemos aplicarles servicios.

    Un ejemplo de creación tres equipos, dos grupos y dos servicios, fíjate bien cómo están definidos los grupos, en el grupo “publicservers” no usamos la clave “members” ya que en la propia definición del host especificamos a que grupo pertenece, en cambio en el grupo “privateservers” especificamos que equipos son los miembros, en este caso sólo uno, “database”.
    Son dos formas de hacer lo mismo, incluso se pueden combinar.

    En los servicios hemos definido la clave “hostgroup_name” en lugar de “host_name” como hemos visto en ejemplos anteriores, también se pueden combinar de forma que el servicio afectaría tanto a los grupos incluidos en “hostgroup_name” como a los equipos de “host_name”.

    Multiples valores para “hostgroup_name” y “host_name” separados por comas.

    # HOST DEFINITIONS
    define host {
    	host_name webserver
    	alias Web Server (Public)
    	address 192.168.1.80
    	hostgroup publicservers
    }
    define host {
    	host_name ftpserver
    	alias FTP Server (Public)
    	address 192.168.1.21
    	hostgroup publicservers
    }
    define host {
    	host_name database
    	alias Database Server
    	address 192.168.1.33
    }
    
    # HOSTGROUPS DEFINITIONS
    define hostgroup {
    	hostgroup_name publicservers
    	alias Public Servers	
    }
    define hostgroup {
    	hostgroup_name privateservers
    	alias Private Servers
    	members database
    }
    
    # SERVICE DEFINITIONS
    define service {
    	service_description uptime
    	use generic-service
    	hostgroup_name publicservers
    	check_command check_nt!UPTIME
    }
    define service {
    	service_description memuse
    	use generic-service 
    	hostgroup_name privateservers
    	check_command check_nt!MEMUSE!-w 80 -c 90
    }
  3. Consejos avanzados:

    • Hacer que un servicio afecte a todos los equipos: En lugar de especificar el nombre de un host o de un hostgroup,pondremos un asterisco, de forma:
      define service {
      	host_name *
      	service_description Check Inet Speed
      }
    • Hacer que a un equipo le afecten todos los servicios: Mediante “serviceescalation” podemos hacer que todos los servicios definidos afecten a un host concreto:
      define serviceescalation {
      	host_name servidor1
      	service_description * 	
      }

      Es importante el asterisco ya que sin él no funcionará.

    • Exclusión de equipos: Podemos excluir algunos equipos de un servicio de forma que aunque en la clave “hostgroup_name” del servicio esté especificado un grupo al que pertenece el equipo que queremos excluir, éste no será incluido en el servicio por estar explícitamente excluido.
      define service {
      	hostgroup_name Servers,Desktops,Laptops,!MyMachines
      	host_name !FileServer,!BossPC,GirlFriendPhone
      	service_description Ping
      }

      En ese ejemplo, excluimos todos los equipos del grupo “MyMachines” y los equipos concretos “FileServer” y “BossPC”. Para excluir un equipo o un grupo le ponemos delante del nombre un símbolo de admiración (!).

    • Grupos de servicios: Es posible hacer grupos de servicios para que sea más rápida la gestión. Por ejemplo, agrupar los servicios PING, HTTP, FTP y SSH en un grupo de servicios llamado “ServerServices”.
      define servicegroup {
      	servicegroup_name ServerServices
      	alias Server Services 
      	members HTTPService, FTPService, SSHService, PingService
      }
    • Crear un grupo que contenga todos los equipos: Creamos un hostgroup y en la calve “members” especificamos un asterisco:
      define hostgroup {
      	hostgroup_name myHostGroup
      	members * 
      }

    La cosa no queda ahi, esto no es más que una guía básica para iniciar un proyecto de monitorización con nagios, es muy versatil y permite mucha configuración y mucha más optimización.

  4. Enlaces de interés:

La información es poder.

11 comments

  1. diegocrespillo

    Hola , me llamo diego queria saber si es indistintinto con sub redes es decir

    mi sub red es 192.168.2.0/24

    define host {
    host_name ftpserver
    alias FTP Server (Public)
    address 10.10.10.12
    hostgroup publicservers
    }
    define host {
    host_name database
    alias Database Server
    address 10.10.30.10

    tengo mi ubuntu trabajando en un entorno virtual machine dentro de un windows 7
    placa de red en modo bridge
    y el router que me entrega la direccion tiene enlaces gateway to gateway
    con las siguientes sub redes

    10.10.0.0/24
    10.50.0.0/24
    10.60.0.0/24

  2. Carlos

    El contenido de windows.cfg que has puesto no es correcto, he hecho copia y pega y al intentar reiniciar el servicio de nagios da error.

      • Carlos

        El error que daba era que no podía reiniciar el servicio porque tenia errores el windows.cfg

        No obstante he cogido una plantilla de ese fichero y he ido completando todo, no obstante ahora tengo el problema de que al añadir la máquina windows todo me da “CRITICAL – Socket timeout”.

        Te adjunto un pantallazo:

        https://gyazo.com/f68075c7248e54f615078b59d8534cf1

        • DidE

          Por defecto Nagios concede 10 segundos para obtener una respuesta del servidor, si en esos 10 segundos no recibe respuesta, provoca el error “Socket Timeout”, prueba a aumentar ese lapso de tiempo a 20 segundos.
          Es necesario editar el fichero commands.cfg, ubicado en /usr/local/nagios/etc/objects/commands.cfg o en /etc/nagios/commands.cfg debes añadir el parámetro “-t 20” a cada comando, por ejemplo:

          ANTES:
          define command {
          command_name check_nrpe
          command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
          }

          DESPUÉS:
          define command {
          command_name check_nrpe
          command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 20
          }

          • Carlos

            Lo primero agradecerte tus respuestas, al menos me hace no sentirme solo 🙂

            He formateado de nuevo la Raspberry y he seguido este manual del propio Nagios.
            https://support.nagios.com/kb/article.php?id=96#Debian

            Y en esta instalación que he realizado, no veo en el commands.cfg ubicado en /usr/local/nagios/etc/objects/ la línea que comentas del check_nrpe.

            La meto a mano en el commands.cfg??

            Todos los servicios que tengo monitorizados de ping, http, etc… eso si funcionan, por lo que parece que el problema es con los que no están definidos por así decirlo.

            Espero tu respuesta, y tal y como te he dicho muchas gracias por tu ayuda.

          • DidE

            Otra opción es revisar el firewall de windows, quizá está bloqueando las conexiones, o tu antivirus, si usas.
            El puerto que usa NSCPLUS es 12489.

          • Carlos

            En la máquina que quiero monitorizar instalé NSClient++ y lo descargué de aquí: https://www.nsclient.org/download/

            También pensé en que podría ser tema del firewall, o del McAfee, pero he desactivado ambos y sigue ocurriendo

            Alguna idea más?

            Se me ocurre probar a monitorizar otra máquina Linux, para corroborar que es problema únicamente con las máquinas Windows.

            Muchas gracias de nuevo!

          • DidE

            Puede comprobar si el puerto está escuchando mediante el siguiente comando desde otra maquina en la misma red:
            nc -z 192.168.1.22 12489
            esto comprueba si el puerto 12489 está abierto y escuchando en la ip 192.168.1.22
            El resultado debería ser algo así:
            Connection to 192.168.30.11 port 12489 [tcp/*] succeeded!

          • Carlos

            He ejecutado el comando que me comentas, pero no ha funcionado, quiero decir ha funcionado, pero no me devuelve nada, simplemente lo ejecuta y me devuelve el prompt. Lo he ejecutado desde la propia raspberry contra la ip del host windows.

            No obstante he ejecutado el nmap “ip de host windows” y me ha dado el siguiente reporte, no veo el puerto del nagios me hace sospechar.

            Te adjunto el resultado del comando

            https://gyazo.com/bf2fdc924790d66969079a42495a941e

            Estoy probando a lanzar el comando /usr/local/nagios/libexec/check_nt -H 192.168.5.63 -p 12489 -s Soporte123 -v UPTIME y me devuelve “NSClient – ERROR: No performance data from command: check_uptime”

            https://gyazo.com/e35f75f58d7a9746bed118568d0e293d

            Ya que estoy, te comento que esto que me devuelve el terminal, también me aparecía hace unos días cuando lo instalé por primera vez en el “Status Information” del nagios accediendo por web. (me ocurria con todos los servicios monitorizados, con el check_drivesize, check_uptime….)

Deja un comentario