Saltar al contenido principal

Nagios

MonitoreoCore 4.4.xBlue Team

Sistema de monitoreo open-source de infraestructura IT. Supervisa servidores, redes y servicios en tiempo real con alertas automatizadas.

¿Qué es Nagios y para qué sirve?

Introducción, arquitectura y casos de uso

Nagios es una de las plataformas de monitoreo de infraestructura IT más veteranas y confiables del mundo. Fue creada en 1999 por Ethan Galstad y desde entonces se ha convertido en el estándar de facto para monitoreo en entornos empresariales Linux/Unix.

¿Qué monitorea Nagios? Nagios puede monitorear prácticamente cualquier componente de infraestructura: disponibilidad de servidores (ping, SSH, RDP), servicios de red (HTTP, HTTPS, FTP, SMTP, DNS, SNMP), recursos del sistema (CPU, RAM, disco, carga), aplicaciones y bases de datos (MySQL, PostgreSQL, Apache, Nginx), hardware vía SNMP (temperatura, voltaje, estado de discos) y servicios cloud y APIs externas.

Arquitectura de plugins: Nagios funciona con una arquitectura de "plugins". El núcleo ejecuta chequeos usando pequeños programas que devuelven estados: OK (0), WARNING (1), CRITICAL (2), UNKNOWN (3). Esta arquitectura es lo que hace a Nagios infinitamente extensible.

Componentes principales: • Nagios Core: Motor principal de chequeos y notificaciones • Plugins: Scripts que realizan los chequeos (check_http, check_ping, etc.) • NRPE: Nagios Remote Plugin Executor — ejecuta plugins en hosts remotos • NDOUtils: Almacena datos en MySQL para reportes históricos • Nagios Web Interface: Dashboard con Apache/PHP

bash
# Arquitectura de Nagios:
#
# ┌─────────────────────────────────────────────────┐
# │              NAGIOS CORE                        │
# │  Scheduler ──► Plugins ──► Estado ──► Alerta   │
# └─────────────────────────────────────────────────┘
#         │                         │
#   ┌─────▼──────┐         ┌────────▼────────┐
#   │  Chequeos  │         │  Notificaciones  │
#   │  Locales   │         │  Email/Slack/SMS │
#   └────────────┘         └─────────────────┘
#         │
#   ┌─────▼──────┐
#   │    NRPE    │  ◄── Plugin daemon en hosts remotos
#   │  (remoto)  │
#   └────────────┘

# Flujo de un chequeo:
# 1. Scheduler decide cuándo chequear
# 2. Ejecuta el plugin correspondiente
# 3. Plugin devuelve 0(OK), 1(WARN), 2(CRIT), 3(UNKNOWN)
# 4. Nagios actualiza estado en BD
# 5. Si cambió a estado problemático → envía notificación
# 6. Si se recupera → notificación de recuperación

# Ver plugins instalados:
ls /usr/local/nagios/libexec/
# check_http  check_ping  check_ssh  check_disk  check_load...

💡Nagios Core es 100% gratuito y open-source. Nagios XI es la versión comercial con dashboards avanzados y configuración web.

Instalación completa de Nagios Core

Ubuntu/Debian desde código fuente

La instalación de Nagios Core se hace compilando desde el código fuente para obtener la versión más reciente. Requiere Ubuntu 20.04/22.04 LTS, Apache2 con módulo CGI, PHP 7.4+, y compilador GCC.

El proceso tiene 4 fases:

  1. Instalar dependencias del sistema
  2. Crear usuario y grupo nagios con permisos correctos
  3. Compilar e instalar Nagios Core y sus archivos de configuración
  4. Instalar los plugins de Nagios para los diferentes tipos de chequeos

Sobre el usuario nagios: Nagios corre como usuario sin privilegios "nagios" para mayor seguridad. El grupo "nagcmd" permite que Apache (www-data) envíe comandos externos a Nagios.

Nagios Plugins: El proyecto Nagios Plugins es separado del core y contiene más de 50 plugins estándar para monitorear los servicios más comunes. La comunidad ha desarrollado miles de plugins adicionales.

bash
# ── DEPENDENCIAS ──────────────────────────────────────
sudo apt update && sudo apt upgrade -y
sudo apt install -y autoconf gcc libc6 make wget unzip apache2 \
  php libapache2-mod-php libgd-dev openssl libssl-dev \
  build-essential checkinstall libperl-dev libnet-snmp-perl

# ── USUARIO Y GRUPO ────────────────────────────────────
sudo useradd nagios
sudo groupadd nagcmd
sudo usermod -aG nagcmd nagios
sudo usermod -aG nagcmd www-data

# ── DESCARGAR Y COMPILAR NAGIOS CORE ──────────────────
cd /tmp
wget -O nagios.tar.gz \
  https://github.com/NagiosEnterprises/nagioscore/archive/nagios-4.4.14.tar.gz
tar xzf nagios.tar.gz && cd nagioscore-nagios-4.4.14/

sudo ./configure --with-command-group=nagcmd
sudo make all
sudo make install           # Binarios
sudo make install-init      # Scripts systemd
sudo make install-config    # Configs por defecto
sudo make install-commandmode
sudo make install-webconf   # Config Apache

# ── USUARIO WEB ────────────────────────────────────────
sudo htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

# ── APACHE ─────────────────────────────────────────────
sudo a2enmod rewrite cgi
sudo systemctl restart apache2

# ── INSTALAR PLUGINS ───────────────────────────────────
cd /tmp
wget -O plugins.tar.gz \
  https://github.com/nagios-plugins/nagios-plugins/archive/release-2.4.6.tar.gz
tar xzf plugins.tar.gz && cd nagios-plugins-release-2.4.6/
sudo ./tools/setup
sudo ./configure --with-nagios-user=nagios --with-nagios-group=nagios
sudo make && sudo make install

# ── INICIAR NAGIOS ─────────────────────────────────────
sudo systemctl enable nagios
sudo systemctl start nagios

# Verificar configuración (debe decir 0 Errors):
sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

# Acceder: http://TU_IP/nagios  |  Usuario: nagiosadmin

💡Si ves "Error: Could not stat() command file", ejecuta: sudo chmod g+rwx /usr/local/nagios/var/rw && sudo chown nagios:nagcmd /usr/local/nagios/var/rw

Configurar hosts y servicios remotos con NRPE

Monitoreo profundo de servidores Linux

Nagios usa archivos .cfg para definir qué monitorear. Los archivos se organizan en /usr/local/nagios/etc/objects/ y se incluyen desde nagios.cfg.

NRPE (Nagios Remote Plugin Executor): Para monitorear recursos internos de servidores remotos (CPU, RAM, disco) sin exponer SSH, se usa NRPE. Es un daemon en el servidor remoto que ejecuta plugins localmente y devuelve el resultado a Nagios.

Flujo con NRPE:

  1. Nagios llama: check_nrpe -H 192.168.1.100 -c check_disk
  2. El daemon NRPE en el servidor ejecuta check_disk localmente
  3. Devuelve el resultado a Nagios vía TCP/5666
  4. Nagios actualiza el estado y envía alertas si es necesario

Estructura recomendada: Organiza un archivo .cfg por servidor o grupo de servidores. Nunca edites los archivos de configuración sin hacer backup primero. Usa templates (plantillas) para definir parámetros comunes y reutilizarlos.

bash
# ── EN EL SERVIDOR REMOTO: Instalar NRPE ─────────────
sudo apt install nagios-nrpe-server nagios-plugins-basic nagios-plugins-standard

sudo nano /etc/nagios/nrpe.cfg
# Cambiar: allowed_hosts=127.0.0.1,192.168.1.10  (IP de tu Nagios server)

# Comandos disponibles en NRPE:
command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10
command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
command[check_disk]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /
command[check_mem]=/usr/lib/nagios/plugins/check_memory -w 80 -c 95
command[check_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200

sudo systemctl restart nagios-nrpe-server

# ── EN EL SERVIDOR NAGIOS: Configurar el host ─────────
sudo nano /usr/local/nagios/etc/objects/servers/web01.cfg

define host {
    use                 linux-server
    host_name           web-server-01
    alias               Servidor Web Principal
    address             192.168.1.100
    max_check_attempts  3
    check_period        24x7
    notification_interval 60
    notification_period 24x7
    contacts            nagiosadmin
}

define service {
    use                 generic-service
    host_name           web-server-01
    service_description HTTP
    check_command       check_http
    check_interval      5
    notifications_enabled 1
}

define service {
    use                 generic-service
    host_name           web-server-01
    service_description Carga CPU
    check_command       check_nrpe!check_load
}

define service {
    use                 generic-service
    host_name           web-server-01
    service_description Disco /
    check_command       check_nrpe!check_disk
}

# Verificar sin errores y recargar:
sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
sudo systemctl reload nagios

💡Organiza los archivos .cfg por servidor o grupo. Usa la directiva "use" para herdar de templates y evitar duplicar configuración.

Alertas, notificaciones y escalado

Email, Slack, SMS y escalation policies

Las notificaciones son el corazón de Nagios. Cuando un servicio cambia de estado, Nagios notifica a los contactos. El sistema de escalado permite avisar a diferentes personas según cuánto tiempo lleva un problema sin resolverse.

Estados que generan notificaciones: • PROBLEM: Cuando un servicio cae (OK → WARNING/CRITICAL) • RECOVERY: Cuando se recupera (WARNING/CRITICAL → OK) • ACKNOWLEDGEMENT: Cuando alguien reconoce el problema en la web • FLAPPINGSTART/STOP: Cuando un servicio oscila entre estados

Lógica anti-falsos-positivos: Nagios solo notifica después de N intentos fallidos (max_check_attempts). Esto evita alertas por problemas transitorios de red.

Escalado de alertas: Si un problema no se resuelve en X minutos, se puede escalar a supervisores o equipos de guardia. Crítico para entornos 24/7.

Integraciones modernas: Nagios originalmente solo tenía email, pero hoy se integra con Slack, PagerDuty, Teams, y SMS via scripts personalizados de notificación.

bash
# ── CONTACTO CON EMAIL ────────────────────────────────
sudo nano /usr/local/nagios/etc/objects/contacts.cfg

define contact {
    contact_name            nagiosadmin
    use                     generic-contact
    alias                   Administrador Nagios
    email                   admin@tuempresa.com
    service_notification_options    w,u,c,r,f,s
    host_notification_options       d,u,r,f,s
    service_notification_commands   notify-service-by-email
    host_notification_commands      notify-host-by-email
    service_notification_period     24x7
    host_notification_period        24x7
}

define contactgroup {
    contactgroup_name   sysadmins
    alias               Administradores de Sistema
    members             nagiosadmin,admin2,oncall
}

# ── NOTIFICACIÓN POR SLACK ─────────────────────────────
cat > /usr/local/nagios/libexec/notify-slack.sh << 'SCRIPT'
#!/bin/bash
WEBHOOK="https://hooks.slack.com/services/TU/WEBHOOK/AQUI"
COLOR="danger"
[ "$NAGIOS_SERVICESTATE" = "OK" ] && COLOR="good"
[ "$NAGIOS_SERVICESTATE" = "WARNING" ] && COLOR="warning"
curl -s -X POST $WEBHOOK -H 'Content-type: application/json' -d "{
  "attachments": [{"color":"$COLOR",
  "title":"$NAGIOS_SERVICESTATE - $NAGIOS_HOSTNAME",
  "text":"Servicio: $NAGIOS_SERVICEDESC\n$NAGIOS_SERVICEOUTPUT"}]}"
SCRIPT
chmod +x /usr/local/nagios/libexec/notify-slack.sh

# Añadir en commands.cfg:
define command {
    command_name    notify-service-by-slack
    command_line    /usr/local/nagios/libexec/notify-slack.sh
}

# ── ESCALADO DE ALERTAS ────────────────────────────────
# Si problema persiste 60+ min → escalar al gerente
define serviceescalation {
    host_name               web-server-01
    service_description     HTTP
    first_notification      4       # 4ta notificación en adelante
    last_notification       0       # 0 = sin límite
    notification_interval   30
    contact_groups          management
}

# ── MANTENIMIENTO PROGRAMADO ───────────────────────────
# Evitar alertas durante actualizaciones:
echo "[$(date +%s)] SCHEDULE_HOST_DOWNTIME;web-server-01;$(date +%s);$(date -d '+2 hours' +%s);1;0;7200;nagiosadmin;Mantenimiento" \
  > /usr/local/nagios/var/rw/nagios.cmd

💡Configura siempre ventanas de mantenimiento (downtime) antes de hacer actualizaciones para evitar que el equipo reciba alertas innecesarias a las 3am.

Labs Prácticos

Básico 20 min

Lab 1: Monitorear servidor Apache con check_http

Objetivo

Configurar Nagios para monitorear un servidor Apache y recibir alertas cuando el sitio web caiga o responda lento.

Escenario

Tienes un servidor web Apache en producción en 192.168.1.100. Quieres ser notificado inmediatamente si el sitio web cae o si los tiempos de respuesta superan los 2 segundos.

Pasos

1

Verificar que el plugin check_http está instalado en /usr/local/nagios/libexec/

2

Crear archivo de configuración /etc/nagios/objects/servers/apache01.cfg

3

Agregar servicios HTTP, HTTPS y tiempo de respuesta

4

Verificar la configuración con nagios -v y recargar

5

Confirmar que el host aparece verde en la UI web

bash — práctica
# VERIFICAR PLUGIN
ls -la /usr/local/nagios/libexec/check_http
/usr/local/nagios/libexec/check_http -H 192.168.1.100 -p 80 -w 2 -c 5

# CREAR CONFIGURACIÓN
sudo nano /usr/local/nagios/etc/objects/servers/apache01.cfg

define host {
    use                 linux-server
    host_name           apache-produccion
    alias               Servidor Apache
    address             192.168.1.100
    max_check_attempts  3
    check_interval      5
    notification_interval 30
    notification_period 24x7
    contacts            nagiosadmin
}

define service {
    use                 generic-service
    host_name           apache-produccion
    service_description HTTP
    check_command       check_http
    check_interval      5
}

define service {
    use                 generic-service
    host_name           apache-produccion
    service_description HTTP Tiempo Respuesta
    check_command       check_http!-w 2 -c 5
    check_interval      2
}

# INCLUIR EN nagios.cfg
echo "cfg_file=/usr/local/nagios/etc/objects/servers/apache01.cfg" \
  | sudo tee -a /usr/local/nagios/etc/nagios.cfg

# VERIFICAR Y RECARGAR
sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
sudo systemctl reload nagios

# SIMULAR CAÍDA para probar alertas:
sudo systemctl stop apache2
# En 1-3 min Nagios detecta → alerta por email

Resultado esperado

El servicio HTTP aparecerá en rojo cuando Apache esté caído y recibirás un email de alerta. Al restaurar el servicio recibirás notificación RECOVERY.

Intermedio 35 min

Lab 2: Monitoreo de recursos del sistema con NRPE

Objetivo

Instalar NRPE en un servidor remoto y configurar Nagios para monitorear CPU, RAM, disco y procesos.

Escenario

Con solo PING y check_http puedes verificar disponibilidad de red, pero necesitas saber cuando el disco llega al 85% o la CPU está al 95% por más de 5 minutos.

Pasos

1

Instalar nagios-nrpe-server y plugins en el servidor remoto

2

Configurar comandos en nrpe.cfg y allowed_hosts

3

Verificar comunicación con check_nrpe desde Nagios

4

Crear definición del host con todos los servicios de recursos

5

Probar umbrales generando carga artificial

bash — práctica
# EN EL SERVIDOR REMOTO (192.168.1.100)
sudo apt install nagios-nrpe-server nagios-plugins-basic nagios-plugins-standard -y

sudo nano /etc/nagios/nrpe.cfg
# allowed_hosts=127.0.0.1,192.168.1.10

command[check_load]=/usr/lib/nagios/plugins/check_load -w 5,4,3 -c 10,8,6
command[check_users]=/usr/lib/nagios/plugins/check_users -w 3 -c 5
command[check_disk]=/usr/lib/nagios/plugins/check_disk -w 15% -c 5% -p /
command[check_mem]=/usr/lib/nagios/plugins/check_memory -u -w 80% -c 95%
command[check_procs]=/usr/lib/nagios/plugins/check_procs -w 200 -c 300

sudo systemctl restart nagios-nrpe-server

# EN NAGIOS SERVER: Probar
/usr/local/nagios/libexec/check_nrpe -H 192.168.1.100 -c check_disk
/usr/local/nagios/libexec/check_nrpe -H 192.168.1.100 -c check_load

# CONFIGURACIÓN DEL HOST
define service {
    use               generic-service
    host_name         servidor-app-01
    service_description CPU Load
    check_command     check_nrpe!check_load
}
define service {
    use               generic-service
    host_name         servidor-app-01
    service_description Disco /
    check_command     check_nrpe!check_disk
}
define service {
    use               generic-service
    host_name         servidor-app-01
    service_description Memoria RAM
    check_command     check_nrpe!check_mem
}

Resultado esperado

Verás en el dashboard todos los recursos internos: CPU, RAM, disco y procesos. Nagios alertará cuando cualquier recurso alcance los umbrales.

Intermedio 30 min

Lab 3: Monitorear MySQL y tiempo de respuesta

Objetivo

Crear un plugin que monitoree disponibilidad de MySQL, conexiones activas y queries lentas.

Escenario

Tu aplicación depende de MySQL. Necesitas alertas si MySQL está caído, si hay demasiadas conexiones (posible DoS) o si las queries tardan demasiado.

Pasos

1

Crear usuario de monitoreo MySQL con mínimos privilegios

2

Configurar check_mysql con credenciales

3

Crear script personalizado para queries lentas

4

Agregar servicios MySQL al archivo de configuración

5

Probar generando carga en la BD

bash — práctica
# CREAR USUARIO MySQL DE MONITOREO
mysql -u root -p << 'SQL'
CREATE USER 'nagios_mon'@'192.168.1.10' IDENTIFIED BY 'NagiosMon2024!';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'nagios_mon'@'192.168.1.10';
FLUSH PRIVILEGES;
SQL

# PROBAR PLUGIN
/usr/local/nagios/libexec/check_mysql \
  -H 192.168.1.101 -u nagios_mon -p 'NagiosMon2024!'

# SCRIPT PARA QUERIES LENTAS
cat > /usr/local/nagios/libexec/check_mysql_slow.sh << 'SCRIPT'
#!/bin/bash
SLOW=$(mysql -h 192.168.1.101 -u nagios_mon -pNagiosMon2024! \
  -e "SHOW STATUS LIKE 'Slow_queries';" 2>/dev/null | awk 'NR==2{print $2}')
[ -z "$SLOW" ] && echo "UNKNOWN: No se pudo conectar" && exit 3
[ "$SLOW" -ge 50 ] && echo "CRITICAL: $SLOW queries lentas" && exit 2
[ "$SLOW" -ge 10 ] && echo "WARNING: $SLOW queries lentas" && exit 1
echo "OK: $SLOW queries lentas" && exit 0
SCRIPT
chmod +x /usr/local/nagios/libexec/check_mysql_slow.sh

# SERVICIOS EN nagios.cfg
define service {
    use               generic-service
    host_name         db-server-01
    service_description MySQL Disponibilidad
    check_command     check_mysql!-H 192.168.1.101 -u nagios_mon -p NagiosMon2024!
}
define service {
    use               generic-service
    host_name         db-server-01
    service_description MySQL Queries Lentas
    check_command     check_command_mysql_slow
}

Resultado esperado

Nagios monitoreará MySQL: disponibilidad, conexiones y queries lentas. Alertas inmediatas si la BD cae o el rendimiento se degrada.

Avanzado 45 min

Lab 4: Mapa de topología de red con dependencias

Objetivo

Crear un mapa visual de la topología de red con dependencias correctas para evitar alertas en cascada cuando el router cae.

Escenario

Tienes router → 2 switches → 8 servidores. Si el router cae recibes 11 alertas en lugar de 1. Con dependencias, Nagios solo alerta del problema raíz.

Pasos

1

Definir todos los hosts con el campo "parents"

2

Configurar objetos de dependencia en Nagios

3

Crear vista de mapa en la UI web

4

Verificar supresión de alertas en cascada

5

Simular fallo del router para validar

bash — práctica
# HOSTS CON DEPENDENCIAS
sudo nano /usr/local/nagios/etc/objects/red-completa.cfg

define host {
    use           generic-switch
    host_name     router-wan
    address       192.168.1.1
    # Sin parents — es el host raíz
}
define host {
    use           generic-switch
    host_name     switch-core-01
    address       192.168.1.2
    parents       router-wan      # Depende del router
}
define host {
    use           linux-server
    host_name     srv-web-01
    address       192.168.1.100
    parents       switch-core-01  # Conectado al switch 1
}
define host {
    use           linux-server
    host_name     srv-db-01
    address       192.168.1.101
    parents       switch-core-01
}

# DEPENDENCIAS (evitar alertas en cascada)
define hostdependency {
    dependent_host_name     srv-web-01,srv-db-01
    host_name               switch-core-01
    inherits_parent         1
    execution_failure_criteria  d,u
    notification_failure_criteria d,u
}

# VER MAPA: Nagios Web UI → Map
# Muestra topología con líneas de dependencia

# VERIFICAR TODA LA RED
for HOST in router-wan switch-core-01 srv-web-01 srv-db-01; do
    IP=$(grep -A3 "host_name.*$HOST" /usr/local/nagios/etc/objects/red-completa.cfg | grep address | awk '{print $2}')
    STATUS=$(ping -c 1 -W 2 $IP &>/dev/null && echo "UP" || echo "DOWN")
    echo "  $HOST ($IP): $STATUS"
done

Resultado esperado

Si el router cae, recibirás 1 sola alerta (del router). Nagios suprimirá las alertas de todos los hosts que dependen de él.

Aviso legal: Este contenido es estrictamente educativo. CyberFlows no apoya actividades ilegales. Úsalo solo en entornos autorizados.