Hace apenas un par de semanas he cambiado de trabajo, y uno de los primeros problemas que he tenido que resolver estaba relacionado con Nagios. Ocurre que tenemos unas máquinas en una red privada, y un servidor Nagios corporativo que no puede acceder a ellas.
Nagios es una herramienta de monitorización de redes y sistemas de código abierto. Es extremadamente popular, y desde su origen en 1999 se usa en multitud de sistemas. Por lo general se compone de un servidor que realiza tests y recopila sus resultados, agentes que tienen la capacidad de realizar tests, y de plugins. Estos plugins son pequeños programas que se pueden utilizar para ejecutar pruebas locales, pruebas remotas, o para realizar tareas auxiliares que asistan a los dos usos anteriores.
La principal característica de Nagios es la cantidad de recursos y plugins existenes. Algunos ejemplos de repositorios de plugins son Nagios Exchange, Nagios Plugins, The Monitoring Plugins Project, etc. El blog de El Despistado trata casi en exclusiva sobre Nagios y tiene publicados multitud de artículos de interés.
En esta entrada voy a repasar la solución que hemos adoptado. El sistema operativo de los equipos que he utilizado es Ubuntu 12.04, aunque posiblemente la configuración del entorno sea exactamente la misma (o al menos muy parecida) en Ubuntu 14.04.
Problemática
El servidor Nagios (en adelante Nagios a secas) no es capaz de llegar a un conjunto de hosts que se encuentran en una red privada. Después de investigar, encontramos dos posibles soluciones:
- Realizar chequeos pasivos utilizando NSCA (Nagios Service Check Acceptor). La iniciativa de la comunicación la toman los hosts, y estos si que pueden llegar al Nagios porque salen a través de un NAT. Esta aproximación requiere la instalación de un servidor NSCA en el Nagios, y de un cliente NSCA en cada uno de los hosts.
- Utilizar NRPE (Nagios Remote Plugin Executor) para montar un escenario muy parecido al descrito en Multiple Indirected Service Checks. NRPE es un agente de Nagios que permite la monitorización mediante plugins que se encuentran instalados en los sistemas remotos. Se compone de un plugin NRPE que se debe instalar en el Nagios, y de un servidor NRPE en cada uno de los hosts.
Como resulta que el Nagios es corporativo, y que ya tenían el plugin NRPE instalado, se eligió esta última opción.
Descripción del escenario
Nuestro escenario consiste básicamente en que hay un host que está detrás del firewall y que tiene acceso al resto de elementos que queremos monitorizar. El servidor Nagios se conecta a él, y éste a su vez se conectará al resto de elementos de la red:

Tendremos por tanto los siguientes elementos:
- Un servidor en el que estará instalado Nagios, y el plugin de NRPE.
- Una máquina de salto en la que estarán instalados el servidor NRPE, el plugin NRPE, y posiblemente otros plugins de Nagios.
- Un conjunto de hosts a monitorizar, en los que se instalarán un servidor NRPE en cada uno de ellos, y un cojunto de plugins de Nagios.
Configuración de los hosts
En los hosts es necesario instalar el servidor NRPE:
sudo apt-get install nagios-nrpe-server nagios-plugins
Los comandos que van a ser invocados por el servidor NRPE se configuran en el archivo /etc/nagios/nrpe.cfg
, como por ejemplo:
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
Como medida de seguridad, se puede añadir la IP de la máquina de salto en la variable allowed_hosts
del archivo /etc/nagios/nrpe.cfg
:
allowed_hosts=192.168.60.10
La documentación de NRPE informa que esta opción se ignora si NPRE se ejecuta bajo inetd
o xinetd
, y que en los casos que se aplica las comprobaciones que realiza son bastante rudimentarias. Por estas razones es bastante común combinar esta variable con comprobaciones adicionales en los archivos /etc/hosts.allow
y /etc/hosts.deny
.
No hay que olvidar reiniciar el servicio nagios-nrpe-server
después de modificar la configuración:
sudo service nagios-nrpe-server restart
Configuración de la máquina de salto
En la máquina de salto se deben instalar el servidor NRPE y el plugin NRPE de Nagios:
sudo apt-get install nagios-nrpe-server nagios-plugins
Hay que prestar atención a la hora de instalar el paquete nagios-nrpe-plugin
porque "recomienda" el paquete nagios3
, y en Ubuntu los paquetes recomendados se instalan automáticamente. Como no necesitamos instalar Nagios en la máquina de salto, le debemos pasar el flag --no-install-recommends
a apt-get
:
sudo apt-get install --no-install-recommends nagios-nrpe-plugin
El paquete nagios-nrpe-plugin
proporciona el binario check_nrpe
en la ruta /usr/lib/nagios/plugins
. Este binario es en realidad un cliente que utilizaremos para ordenar la ejecución de tests en un host remoto que tenga instalado un servidor NRPE.
Es recomendable ejecutar primero el binario check_nrpe
para depurar la configuración, y comprobar que la comunicación entre los hosts es correcta:
/usr/lib/nagios/plugins/check_nrpe -H 192.168.60.11 -c check_users
USERS OK - 1 users currently logged in |users=1;5;10;0
Una vez se ha comprobado que la comunicación entre la máquina de salto y los hosts es correcta, se añadirá un nuevo test dummy llamado check_remote_check
en el servidor NRPE de la máquina de salto. La misión de este test es ordenar la ejecución de un test en un host remoto y recoger el resultado. Este nuevo test se definirá al igual que antes en el archivo /etc/nagios/nrpe.cfg
:
command[check_remote_check]=/usr/lib/nagios/plugins/check_nrpe -H $ARG1$ -c $ARG2$
Este test toma dos parámetros:
$ARG1$
es el host remoto.$ARG2$
es el test que se desea ejecutar.
En Ubuntu, el servidor NRPE no permite por defecto el paso de parámetros a los tests porque es un riesgo de seguridad. Para habilitar esta funcionalidad se debe modificar el fichero /etc/nagios/nrpe.cfg
y habilitar la opción dont_blame_nrpe
:
dont_blame_nrpe=1
Una alternativa a habilitar los parámetros sería que en lugar de crear un comando genérico como check_remote_check
, añadir comandos específicos para cada host como:
command[check_remote_users_host1]=/usr/lib/nagios/plugins/check_nrpe -H 192.168.60.11 -c check_users
Aunque posiblemente más segura, esta aproximación tiene la desventaja de que habría que crear un comando para cada uno de los tests de cada uno de los hosts que se quisieran monitorizar.
Al igual que en el caso anterior, es aconsejable configurar la variable allowed_hosts
para que sólo figure la IP del servidor Nagios.
No hay que olvidar reiniciar el servicio nagios-nrpe-server
después de modificar la configuración:
sudo service nagios-nrpe-server restart
Configuración servidor Nagios
Además de Nagios, en el servidor se debe instalar el plugin NRPE:
sudo apt-get install nagios-nrpe-plugin
Si la configuración de la máquina de salto y de los hosts es correcta, el binario check_nrpe
debería poder ejecutar el test check_remote_check
en la máquina de salto:
/usr/lib/nagios/plugins/check_nrpe -H 192.168.50.5 -c check_remote_check -a 192.168.60.11 check_users
USERS OK - 1 users currently logged in |users=1;5;10;0
Por ejemplo, se pueden definir un conjunto de test que usen check_remote_check
de la máquina de salto de la siguiente manera:
define host {
use generic-host
host_name jumpbox
alias JumpBox
address 192.168.50.5
}
define host {
use generic-host
host_name host1
alias Host1
address 192.168.50.5
}
define service {
use generic-service
host_name jumpbox
service_description JumpBox_PING
check_command check_ping!100.0,20%!500.0,60%
}
define service {
use generic-service
host_name host1
service_description host1_System_Load_With_Params
check_command check_nrpe_3args!check_remote_check!192.168.60.11!check_load
}
define service {
use generic-service
host_name host1
service_description host1_System_Load_Without_Params
check_command check_nrpe_1arg!check_remote_load_host1
}
Hay que prestar atención a los siguientes detalles:
- Cuando se definan los hosts que no están directamente accesibles en Internet, el campo
address
debe tener la dirección IP de la máquina de salto. De esta forma, cuando Nagios vaya a ejecutar los tests dehost1
realmente se ejecutarán en la máquinajumpbox
. - El test host1_System_Load_With_Params utiliza el comando
check_remote_check
que hemos definido anteriormente en la máquina de salto. - El test host1_System_Load_Without_Params utiliza el comando
check_remote_load_host1
para ejecutar un test sin que haya un paso de parámetros del Nagios a la máquina de salto. - Se utilizan los comandos
check_nrpe_1arg
ycheck_nrpe_3args
que respectivan invocan acheck_nrpe
tomando uno y tres argumentos.
A diferencia de la distribución estándar de Nagios, Ubuntu (o mas bien Debian) fragmenta la definición de los comandos en múltiples ficheros que se encuentran en /etc/nagios-plugins/config/
. En el caso de NRPE, utiliza el archivo check_nrpe.cfg
. En mi caso tuve que añadir la definición del comando check_nrpe_3args
para invocar a check_nrpe
con 3 argumentos:
# this command runs a program $ARG1$ with arguments $ARG2$
define command {
command_name check_nrpe
command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
}
# this command runs a program $ARG1$ with no arguments
define command {
command_name check_nrpe_1arg
command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
# this command runs a program $ARG1$ with arguments $ARG2$ and $ARG3$
define command {
command_name check_nrpe_3args
command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$ $ARG3$
}
No hay que olvidar reiniciar el servicio nagios3
después de modificar la configuración:
sudo service nagios3 restart
Problemas
Más que problemas, esta aproximación introduce las siguientes molestias:
- Nagios realiza pings periódicos a todos los hosts definidos en su configuración. Según el resultado de este test explícito, Nagios determina si un host está UP o DOWN. Como en la definición de las máquinas que están en la red interna se ha utilizado la dirección IP de la máquina de salto, el resultado de este test será falso porque quien en realidad estará contestando los pings es la máquina de salto.
- La monitorización de gran parte de la infraestructura depende exclusivamente de la máquina de salto. Como esta máquina se desconecte o se caiga nos llegarán miles de alertas, aún cuando el resto de la infraestructura esté operativa.
Conclusiones
Se ha presentado una posible solución para el problema de monitorizar una red privada desde un servidor Nagios que no tiene acceso directo a los elementos de red. Es posible que la solución óptima en estos casos sea que las propias máquinas envíen sus resultados al servidor Nagios, pero cuando esto no sea posible la propuesta presentada puede ser de utilidad.
Comments
comments powered by Disqus