Implementación de un manejador de evento (Event Handler) en Nagios para mantener una conexión PPTP en Windows
Por: Juan Felipe Muñoz Fernández
Descarcar este artículo en formato PDF, clic aquí
Introducción
Nagios se ha convertido en una de las herramientas más poderosas de monitoreo de infraestructura informática y de telecomunicaciones debido a su robustez y flexibilidad. Una de las características que más disfruta el administrador de Nagios es su arquitectura modular; en Nagios, el núcleo de monitoreo está conformado por diferentes plugins que desempeñan la labor principal del sistema: monitorear, avisar de cualquier evento o cambio que suceda a los objetos que están siendo monitoreados y disparar los correspondientes manejadores de eventos que lidian con los cambios detectados. En este artículo se expondrá una situación en la que Nagios monitorea la disponibilidad de una conexión VPN, cuando esta conexión queda por fuera de línea, es decir, cuando se desconecta, Nagios dispara un manejador de evento que se encarga de reconectar remotamente el enlace VPN caído.
Escenario de monitoreo
En la siguiente figura se ilustra el escenario de los componentes que están siendo monitoreados por Nagios.

Figura 1: Escenario de monitoreo
Características de este escenario de monitoreo
Lógica del monitoreo
Para que exista la conexión VPN desde el servidor S es necesario que entre el enrutador R y la subred en donde se encuentra Nagios exista siempre un canal de Internet activo. Debido a esto y teniendo en cuenta la última característica mencionada en el apartado anterior, Nagios deberá monitorear tanto la disponibilidad del acceso a Internet en el enrutador R como la conexión VPN en el servidor S.
La lógica del monitoreo es muy simple en términos de definición de objetos en la configuración de Nagios.
La definición de este objeto tiene la particularidad de que depende del primer objeto, ya que el primer objeto es quién dispone del recurso de conexión a Internet. Esto es bien importante a la hora de recibir las notificaciones. Esta definición de dependencia le indica a Nagios la misma lógica que se está planteando aquí, es decir, Nagios sabrá que si no hay canal de Internet en el enrutador R no puede existir conexión VPN en el servidor S y dejará de notificar este problema.
Definición del monitoreo para el enrutador R
1 define host{
2 use generic-host
3 host_name Enrutador-R
4 alias Enrutador R
5 address 200.1.1.1
6 }
Listado 1: Definición del objeto para el enrutador R
En la línea 2 se hace uso de una plantilla llamada ‘generic-host’ que define las propiedades básicas de este tipo de host.
En la línea 3 se le indica a Nagios cual será el nombre de este objeto, esta propiedad identifica al objeto dentro del sistema de monitoreo.
En la línea 4 se le define un alias que es usado para mostrar más amigablemente el nombre del objeto monitoreado en la interfase de administración de Nagios.
En la línea 5 se le indica a Nagios cual es la dirección IP del objeto que se está definiendo. Nagios utiliza esta propiedad para hacer ‘ping’ a esta dirección y monitorear la disponibilidad de este objeto.
Definición del monitoreo para la conexión VPN en el servidor S
1 define host{
2 use generic-host
3 host_name VPN-en-servidor-S
4 alias VPN en servidor S
5 address 192.168.1.20
6 parents Enrutador-R
7 }
Listado 2: Definición del objeto para el servidor S
Manejadores de eventos
Un manejador de evento es un componente de software que se ejecuta cuando se detecta un cambio en el estado de un host o un servicio que se está monitoreando. Por ejemplo, si la conexión VPN cambia de su estado conectado a desconectado (sin que el canal de Internet del enrutador R haya cambiado a un estado desconectado), es posible disparar la ejecución de un componente de software que levante la conexión VPN en el servidor S. Para una mejor comprensión de la lógica con la que deben construirse los manejadores de eventos, se recomienda visitar el enlace relacionado en el apartado de referencias.
Para este caso se ha diseñado el siguiente manejador de evento que es capaz de iniciar nuevamente la conexión VPN por solicitud del componente de monitoreo de Nagios. Cabe apuntar que este manejador de evento estará instalado en el servidor S a través del componente ‘nrpe_nt’ del que se hablará mas adelante.
' Copyright 2008 Oteon S.A.
'
' 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; version 2
' of the License.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
'Autor: Juan Felipe Muñoz Fernandez [jmunoz@oteon.com]
'Dic 2008
Option Explicit
Const RASDIAL = "C:\WINDOWS\system32\rasdial.exe"
Dim objShell, nRetorno, HostState, HostStateType, HostAttemp
Dim ConexionVPN, Attemp, Usuario, Password
Dim objExec, strConexionesActivas, ExpReg
Set objShell = CreateObject("WScript.Shell")
Function EstaConectado()
Dim Ret
Set ExpReg = new RegExp
Set objExec = objShell.Exec(RASDIAL)
strConexionesActivas = objExec.StdOut.ReadAll
ExpReg.Pattern = ConexionVPN
ExpReg.IgnoreCase = True
If ExpReg.Test(strConexionesActivas) Then
Ret = True
Else
Ret = False
End If
EstaConectado = Ret
End Function
Function DesconectarConectar()
If EstaConectado() Then
nRetorno = objShell.Run(RASDIAL & " " & ConexionVPN & " /DISCONNECT",0,True)
Wscript.Sleep 5000
End If
nRetorno = objShell.Run(RASDIAL & " " & ConexionVPN & " " & Usuario & " " & Password,0,True)
End Function
ConexionVPN = WScript.Arguments(0)
Usuario = WScript.Arguments(1)
Password = WScript.Arguments(2)
Attemp = WScript.Arguments(3)
HostState = WScript.Arguments(4)
HostStateType = WScript.Arguments(5)
HostAttemp = WScript.Arguments(6)
If Trim(HostState) = "DOWN" Then
If Trim(HostStateType) = "SOFT" Then
If HostAttemp = Attemp Then
DesconectarConectar()
End If
End If
If Trim(HostStateType) = "HARD" Then
DesconectarConectar()
End If
End If
WScript.Echo "OK"
WScript.Quit(0)
Listado 3: Código del manejador del evento UpPPP.vbs
Debido al alcance de este artículo explicar cada línea de este código queda imposible, pero se puede mencionar que está escrito en Visual Basic Script y hace uso del comando ‘rasdial.exe’ disponible en el sistema operativo Windows para desconectar o conectar la conexión VPN a través de la línea de comandos.
Los argumentos que recibe este script en la línea de comandos son los siguientes en el mismo orden listado a continuación:
Para probar el código anterior, debe copiarse a un archivo de texto y guardarse con extensión ‘.vbs’, luego debe irse al símbolo del sistema y ejecutar el script de la siguiente manera:
cscript //nologo UpPPP.vbs
Ejemplos:
cscript //nologo UpPPP.vbs miconn pepito passpepito 2 DOWN SOFT 2 cscript //nologo UpPPP.vbs miconn pepito passpepito 2 DOWN HARD 2
Lo que está en mayúsculas corresponde al valor de las macros $HOSTSTATE$, $HOSTSTATETYPE$ y $HOSTATTEMP$ y para las pruebas estos argumentos deben pasarse en mayúsculas ya que al interior del código se comparan en mayúsculas.
El componente NRPE_NT
Para instalar el manejador del evento es necesario descargar e instalar el componente ‘nrpe_nt’ sobre el servidor S. Para instalar el componente ‘nrpe_nt’ se recomienda leer el documento INSTALL que contiene el paquete descargado.
El componente ‘nrpe_nt’ depende de un archivo de configuración ubicado en el directorio ‘bin’, a este archivo de nombre ‘nrpe.cfg’ deben modificársele las siguientes líneas por los valores ilustrados a continuación:
1 allowed_hosts= 2 dont_blame_nrpe=1 3 command_timeout=60
Listado 4: Directivas que cambian en el archivo ‘nrpe_nt.cfg’
En la línea número 1 debe especificarse la dirección IP pública de donde proviene la conexión de Nagios.
En la línea número 2 debe habilitarse la posibilidad de que los comandos definidos puedan recibir argumentos.
En la línea número 3 simplemente se modifica el valor de espera para terminar la ejecución de los comandos cuando éstos tardan mucho en retornar.
Guarde los cambios en el archivo ‘nrpe_nt.cfg’ y reinicie el servicio de la siguiente manera en el símbolo del sistema:
net start nrpe_nt
Es bueno revisar el archivo ‘nrpe_nt.log’ ubicado en el directorio ‘bin’ para constatar de que no existen errores en el archivo de configuración ‘nrpe_nt.cfg’.
También es importante mencionar que el servicio ‘nrpe_nt’ escucha el puerto 5666 en TCP, de tal manera que el administrador del sistema debe permitir las conexiones entrantes hacia este puerto en el enrutador R apuntando hacia el servidor S.
Instalación del manejador de evento
Una vez instalado y probado el componente ‘nrpe_nt’ en el servidor S, el primer paso es definir el comando en el archivo ‘nrpe.cfg’ de la siguiente manera:
command[up_ppp]=cscript.exe //nologo //T:60 C:\nrpe_nt\UpPPP.vbs $ARG1$ $ARG2$ $ARG3$ $ARG4$ $ARG5$ $ARG6$ $ARG7$
Listado 5: Definición el commando ‘up_ppp’ en el servicio ‘nrpe_nt’
No olvide guardar los cambios en el archivo ‘nrpe_nt.cfg’ y reiniciar el servicio.
El segundo paso consiste en definir el mismo comando en el servidor Nagios de manera casi igual. Las siguientes líneas definen el comando para el manejador del evento en Nagios:
1 define command{
2 command_name up_ppp
3 command_line $USER1$/check_nrpe -t 60 -H $ARG1$ -c up_ppp -a $ARG2$ $ARG3$ $ARG4$ $ARG5$ $HOSTSTATE$ $HOSTSTATETYPE$ $HOSTATTEMPT$
4 }
Listado 6: Definición del comando ‘up_ppp’ en el servidor Nagios
En la línea 2 se está definiendo el nombre del comando para el manejador del evento.
En la línea 3 la macro $USER1$ tiene el valor ‘/usr/local/nagios/libexec’ que es donde residen los plugins con los que Nagios ejecuta los monitoreos. El argumento $ARG1$ deberá valorarse con la dirección IP pública en donde se encuentra el componente ‘nrpe_nt’ a la escucha a la hora de su ejecución. Los demás argumentos y macros después del modificador ‘-a’ corresponden con los argumentos que espera el script ‘UpPPP.vbs’. Note como los tres últimos parámetros que espera el script ‘UpPPP.vbs’ corresponden a las macros antes mencionadas.
Si se desea comprobar el funcionamiento del comando anteriormente definido, se puede ejecutar a mano, en la línea de comandos del servidor Nagios, la siguiente orden:
/usr/local/nagios/libexec/check_nrpe –t 60 –H 200.1.1.1 –c up_ppp –a miconn pepito passpepito 2 DOWN SOFT 2
Si previamente se ha publicado el puerto 5666 en TCP hacia el servidor S en el enrutador R, la orden llegará al servicio ‘nrpe_nt’ que se ejecuta en el servidor S y éste disparará la ejecución del comando ‘up_ppp’ con los parámetros que está recibiendo desde el servidor Nagios.
Para finalizar, faltaría ajustar las definición del objeto ‘VPN-en-servidor-S’ realizada en el Listado No. 2, para agregar el manejador del evento.
1 define host{
2 use generic-host
3 host_name VPN-en-servidor-S
4 alias VPN en servidor S
5 address 192.168.1.20
6 parents Enrutador-R
7 event_handler up_ppp!200.1.1.1!miconn!pepito!passpepito!2
8 }
En la línea 7 se está definiendo el manejador del evento, la palabra ‘up_ppp’ corresponde al nombre del comando que se especificó con ‘command_name’. La dirección 200.1.1.1 es la dirección IP que tiene asignado el enrutador R y por donde se llega hasta el servidor S. La palabra ‘miconn’ corresponde al nombre de la conexión VPN en el servidor S. Los siguientes dos parámetros corresponden al usuario y al password usados en la autenticación de la conexión VPN. El último parámetro ‘2’ le dice al plugin ‘UpPPP.vbs’ que si la conexión VPN se encuentra desconectada y ya es la segunda revisión que hace Nagios sobre el estado de la conexión luego de desconectarse, entonces es hora de reconectar la conexión VPN. El lector inquieto se preguntará ¿y donde están los argumentos restantes que espera el script ‘UpPPP.vbs’?, la respuesta está en la definición del comando ‘up_ppp’ del Listado 6. Nagios puede llena los valores de las macros $HOSTSTATE$, $HOSTSTATETYPE$ y $HOSTATTEMP$ al momento en que ejecuta el manejador del evento. La macros anteriores pueden tomar los siguientes valores:
| $HOSTSTATE$ | Una cadena de caracteres que indica el estado actual del host: “UP”, “DOWN” ó “UNREACHABLE” |
| $HOSTSTATETYPE$ | Una cadena de caracteres que indica el tipo de estado en el que se encuentra el host actual: “SOFT” ó “HARD” |
| $HOSTATTEMP$ | El número de chequeos que lleva Nagios hacia el host luego de que se detectó un cambio en el estado del mismo. |
Tabla 1: Valores de las macros usadas en el manejador de evento
Aplicaciones reales
La aplicación de este manejador de evento mejoró sustancialmente la disponibilidad de una conexión VPN en un entorno real de comunicaciones. Las siguientes imágenes ilustran las gráficas de disponibilidad de la conexión VPN sin el manejador del evento y la disponibilidad de la conexión con el manejador del evento. Teniendo en cuenta que se trata de una conexión VPN que debe permanecer conectada las 24 horas.
En la siguiente imagen, la gráfica ilustra como la mayoría del tiempo la conexión VPN permanecía desconectada (franja de color rojo).
Figura 2: Reporte de disponibilidad de la conexión sin el manejador de evento
La implementación del manejador del evento se comenzó a usar desde el 15 de enero de 2009 y para la fecha de finalización de este artículo, la mejora era sustancial en solo 24 horas de aplicación de este manejador.
Figura 3: Reporte de disponibilidad de la conexión con el manejador de evento
Referencias