La monitorización de infraestructuras informáticas es una de las tareas fundamentales en la administración de sistemas y la ciberseguridad. Permite conocer el estado de los servidores, comprobar la disponibilidad de los servicios, detectar anomalías y anticiparse a posibles incidentes.
En este artículo vamos a utilizar Nagios Core y Docker para construir un pequeño entorno de monitorización que nos permitirá experimentar con servidores web, bases de datos, puertos de red y servicios.
La propuesta consiste en desplegar Nagios mediante un contenedor Docker y utilizar otros contenedores para representar diferentes elementos de una infraestructura informática.
A partir de esta instalación podremos realizar diferentes experimentos:
- Monitorizar servidores y comprobar su disponibilidad.
- Comprobar puertos TCP y servicios de red.
- Vigilar servidores web y bases de datos.
- Simular caídas de servicios.
- Investigar problemas de conectividad.
- Recopilar evidencias durante un incidente.
- Comprobar la recuperación de los servicios.
El objetivo es disponer de un laboratorio reproducible que permita a los alumnos experimentar con situaciones habituales en la administración de sistemas y la investigación de incidentes de ciberseguridad.
1. Arrancar Nagios con Docker
Una de las ventajas de Docker es que podemos desplegar herramientas de monitorización sin necesidad de instalarlas directamente en el sistema operativo.
En este caso utilizaremos la imagen jasonrivers/nagios, que permite ejecutar Nagios Core dentro de un contenedor.
Descargar la imagen
docker pull jasonrivers/nagios:latest
Crear el contenedor
docker run -d \
--name nagios4 \
-p 8080:80 \
--restart unless-stopped \
jasonrivers/nagios:latest
Los parámetros utilizados son:
| Parámetro | Descripción |
|---|---|
-d | Ejecuta el contenedor en segundo plano. |
--name nagios4 | Asigna un nombre al contenedor. |
-p 8080:80 | Publica el puerto 80 del contenedor en el puerto 8080 del equipo. |
--restart unless-stopped | Reinicia automáticamente el contenedor salvo que se detenga manualmente. |
Acceder a Nagios
Una vez iniciado el contenedor, podemos acceder a la interfaz web:
http://localhost:8080/nagios
Las credenciales habituales de esta imagen son:
Usuario: nagiosadmin
Contraseña: nagios
Si las credenciales no funcionan, habrá que comprobar las configuradas en la imagen.
Comprobar el funcionamiento
Podemos consultar el estado del contenedor:
docker ps
Consultar los registros:
docker logs nagios4
Comprobar la respuesta HTTP:
curl -I http://localhost:8080
También podemos acceder directamente al interior del contenedor:
docker exec -it nagios4 bash
Nota: si utilizamos un Mac con procesador Apple Silicon, podemos encontrar una advertencia indicando que la imagen está preparada para linux/amd64, mientras que el equipo utiliza linux/arm64. Docker puede ejecutar la imagen mediante emulación, aunque el rendimiento puede variar.
2. Ejemplos de laboratorios que podemos realizar
Una vez instalado Nagios, podemos plantear diferentes ejercicios para aprender a monitorizar una infraestructura informática.
Laboratorio 1. Monitorización de servidores
El objetivo consiste en comprobar si varios servidores están disponibles y si responden correctamente a las comprobaciones de conectividad.
Podemos investigar:
- Disponibilidad de los equipos.
- Respuesta a solicitudes ICMP.
- Resolución de nombres.
- Estado de los servidores.
- Identificación de equipos que dejan de responder.
Ejercicio: detener uno de los servidores y comprobar cómo cambia el resultado de las comprobaciones de disponibilidad.
3. Crear un laboratorio real con varios servidores Docker
Vamos a construir una pequeña infraestructura informática formada por tres contenedores:
- Nagios: servidor de monitorización.
- Apache: servidor web.
- MySQL: servidor de bases de datos.
La finalidad es que Nagios pueda comprobar la disponibilidad de los otros dos servicios.
Arquitectura del laboratorio
EQUIPO DEL ALUMNO
|
|
Puerto 8080
|
v
+-------------+
| NAGIOS |
| Monitoring |
+-------------+
|
RED DOCKER
laboratorio
|
+---------+---------+
| |
v v
+-------------+ +-------------+
| APACHE | | MYSQL |
| | | |
| HTTP :80 | | MYSQL :3306 |
+-------------+ +-------------+
3.1. Crear una red Docker
Primero creamos una red virtual para permitir la comunicación entre los contenedores:
docker network create laboratorio
Podemos comprobar que se ha creado correctamente:
docker network ls
3.2. Conectar Nagios a la red
El contenedor de Nagios ya está creado, por lo que tenemos que conectarlo a la nueva red:
docker network connect laboratorio nagios4
De esta manera, Nagios podrá comunicarse con otros contenedores de la misma red utilizando sus nombres.
3.3. Crear el servidor Apache
Creamos un contenedor con Apache:
docker run -d \
--name apache-lab \
--network laboratorio \
httpd:2.4
Apache escuchará en el puerto 80 dentro de la red Docker.
No es necesario publicar este puerto en el equipo anfitrión para que Nagios pueda comprobarlo.
3.4. Crear el servidor MySQL
Ahora creamos una base de datos:
docker run -d \
--name mysql-lab \
--network laboratorio \
-e MYSQL_ROOT_PASSWORD=Laboratorio123! \
-e MYSQL_DATABASE=laboratorio \
mysql:8
La contraseña utilizada es exclusivamente para el laboratorio.
MySQL utilizará el puerto 3306 dentro de la red Docker.
3.5. Comprobar los contenedores
Podemos comprobar que los tres contenedores están funcionando:
docker ps
También podemos consultar los detalles de la red:
docker network inspect laboratorio
En este momento tenemos una pequeña infraestructura informática con dos servicios que podemos monitorizar.
4. Realizar comprobaciones desde Nagios
Una vez desplegada la infraestructura, podemos ejecutar diferentes pruebas desde el contenedor de Nagios.
4.1. Comprobar si Apache está disponible
Entramos en el contenedor:
docker exec -it nagios4 bash
Comprobamos si podemos acceder al servidor Apache:
curl -I http://apache-lab
También podemos comprobar directamente el puerto TCP:
nc -zv apache-lab 80
Si Apache está funcionando correctamente, deberíamos obtener una respuesta satisfactoria.
4.2. Provocar una caída del servidor Apache
Ahora vamos a simular un incidente.
Desde otra terminal detenemos Apache:
docker stop apache-lab
Volvemos a comprobar la disponibilidad:
docker exec nagios4 \
/opt/nagios/libexec/check_http \
-H apache-lab -p 80
El servicio dejará de responder y Nagios devolverá un estado de error.
Arrancamos Apache de nuevo:
docker start apache-lab
Volvemos a realizar la comprobación:
docker exec nagios4 \
/opt/nagios/libexec/check_http \
-H apache-lab -p 80
Objetivo didáctico: observar cómo cambia el estado del servicio cuando deja de estar disponible y cuando se recupera.
4.3. Simular una caída de MySQL
Podemos realizar el mismo ejercicio con la base de datos.
Detenemos MySQL:
docker stop mysql-lab
Comprobamos el puerto 3306:
docker exec nagios4 \
/opt/nagios/libexec/check_tcp \
-H mysql-lab -p 3306
Arrancamos de nuevo MySQL:
docker start mysql-lab
Volvemos a comprobar el puerto:
docker exec nagios4 \
/opt/nagios/libexec/check_tcp \
-H mysql-lab -p 3306
El alumno tendrá que identificar qué servicio ha dejado de estar disponible y documentar el incidente.
5. Configurar Nagios para vigilar Apache y MySQL automáticamente
Hasta ahora hemos realizado comprobaciones manuales mediante los plugins de Nagios.
Sin embargo, crear los contenedores no significa que Nagios empiece a monitorizarlos automáticamente.
Para ello debemos declarar los equipos y servicios en sus archivos de configuración.
5.1. Localizar los archivos de configuración
La imagen utiliza habitualmente esta ruta:
/opt/nagios/etc
Entramos en el contenedor:
docker exec -it nagios4 bash
Comprobamos que existen los plugins necesarios:
ls -l /opt/nagios/libexec/check_http
ls -l /opt/nagios/libexec/check_tcp
5.2. Añadir Apache a la configuración
Vamos a añadir una definición para el servidor Apache.
El siguiente ejemplo utiliza las plantillas habituales linux-server y generic-service, así como el comando check_http.
cat >> /opt/nagios/etc/objects/localhost.cfg <<'EOF'
define host {
use linux-server
host_name apache-lab
alias Servidor Apache de laboratorio
address apache-lab
max_check_attempts 3
check_interval 1
retry_interval 1
}
define service {
use generic-service
host_name apache-lab
service_description HTTP
check_command check_http
check_interval 1
retry_interval 1
}
define host {
use linux-server
host_name mysql-lab
alias Servidor MySQL de laboratorio
address mysql-lab
max_check_attempts 3
check_interval 1
retry_interval 1
}
define service {
use generic-service
host_name mysql-lab
service_description MYSQL TCP
check_command check_tcp!3306
check_interval 1
retry_interval 1
}
EOF
La configuración anterior presupone que las plantillas y los comandos check_http y check_tcp están definidos en la instalación.
5.3. Comprobar la configuración
Antes de reiniciar Nagios debemos validar que no existen errores:
/opt/nagios/bin/nagios \
-v /opt/nagios/etc/nagios.cfg
Si la validación es correcta, salimos del contenedor:
exit
Reiniciamos Nagios:
docker restart nagios4
Ahora podemos consultar la interfaz web:
http://localhost:8080/nagios

En la sección de equipos y servicios podremos consultar las comprobaciones configuradas.
Importante: el archivo localhost.cfg debe estar incluido en la configuración principal de Nagios. Si se utiliza otro archivo, también habrá que comprobar que está incluido mediante una directiva cfg_file o una configuración equivalente.
6. Otros experimentos de investigación de incidentes
Los laboratorios anteriores pueden ampliarse con diferentes situaciones que permitan investigar problemas de disponibilidad, conectividad y rendimiento.
| Experimento | Acción | Qué debe investigar el alumno |
|---|---|---|
| Servidor caído | Detener Apache | Disponibilidad |
| Puerto cerrado | Detener un servicio | Conectividad |
| DNS incorrecto | Modificar la resolución de nombres | Errores DNS |
| Disco lleno | Generar archivos de prueba controlados | Capacidad |
| CPU elevada | Ejecutar una carga controlada | Rendimiento |
| Servicio detenido | Parar MySQL | Dependencias |
| Recuperación | Volver a iniciar los servicios | Tiempo de recuperación |
Ejercicio: descubrir qué servicio ha fallado
Una práctica especialmente interesante consiste en que el alumno no sepa qué servicio se ha detenido.
El profesor puede detener Apache o MySQL sin comunicarlo previamente.
El alumno tendrá que:
- Consultar Nagios.
- Identificar qué servicio presenta problemas.
- Comprobar la conectividad.
- Consultar los registros de Docker.
- Determinar cuándo se ha producido el problema.
- Reconstruir lo ocurrido.
- Proponer medidas para evitar que vuelva a suceder.
De esta manera, el alumno no se limita a ejecutar comandos, sino que debe interpretar los resultados y tomar decisiones.
7. Relación con la investigación forense y la respuesta ante incidentes
Este laboratorio también permite trabajar contenidos relacionados con la investigación de incidentes de ciberseguridad.
Podemos utilizar Nagios como herramienta de detección y combinarlo con otros comandos para recopilar evidencias.
Por ejemplo:
Consultar los registros de Apache
docker logs apache-lab
Consultar los registros de MySQL
docker logs mysql-lab
Consultar los registros de Nagios
docker logs nagios4
Comprobar el consumo de recursos
docker stats
Identificar las direcciones IP de los contenedores
docker inspect \
--format '{{json .NetworkSettings.Networks}}' \
apache-lab
Consultar las conexiones de red
Desde el contenedor correspondiente podemos utilizar herramientas como:
ss -tulpen
o:
netstat -tulpen
Estas herramientas permiten ampliar la investigación y relacionar los resultados de monitorización con las evidencias obtenidas durante el análisis.
Secuencia de investigación
INFRAESTRUCTURA
|
v
MONITORIZACION
NAGIOS
|
v
DETECCION ANOMALIA
|
v
ANALISIS
|
v
RECOPILACION DE LOGS
|
v
IDENTIFICACION CAUSAS
|
v
CONTENCION
|
v
RECUPERACION
|
v
DOCUMENTACION
La finalidad es que los alumnos comprendan cómo se relacionan la monitorización, la investigación técnica y la respuesta ante incidentes.
8. Comandos útiles para gestionar el laboratorio
Durante las prácticas podemos utilizar los siguientes comandos para administrar la infraestructura Docker.
Consultar los contenedores:
docker ps -a
Consultar los registros de Nagios:
docker logs nagios4
Consultar los registros de Apache:
docker logs apache-lab
Detener Apache:
docker stop apache-lab
Arrancar Apache:
docker start apache-lab
Detener MySQL:
docker stop mysql-lab
Arrancar MySQL:
docker start mysql-lab
Consultar estadísticas:
docker stats
Consultar las redes:
docker network ls
Inspeccionar la red del laboratorio:
docker network inspect laboratorio
Eliminar los contenedores:
docker rm -f nagios4 apache-lab mysql-lab
Eliminar la red:
docker network rm laboratorio