hping2.pl. Script para monitorizar servicios remotos

Estos días ando metido en la puesta en marcha de un sistema de monitorización de servicios de red.

Para ello he seleccionado Cacti, que es una herramienta que ya conocía, madura y bastante potente.

El caso es que en esta ocasión me he encontrado con un pequeño problemilla. Necesitaba monitorizar el estado de servicios externos a nuestra red y a los cuales no podía acceder ni vía ping, ni vía SNMP. Después de hacer una pequeña investigación me encontre con hping, una herramienta que es como un ping superavanzado que permite enviar no solo paquetes ICMP (pings) sino componer y enviar paquetes a cualquier puerto destino. Por ejemplo, me permite hacer un ping (estrictamente hablando no es un ping) a un servidor al puerto de CVS, o de HTTP, o de cualquier otra cosa.

Después de investigar un buen rato comprobé que nadie (extrañamente) se había encontrado con el mismo problema y por lo tanto me he tenido que poner a integrar yo hping con Cacti. Esto se concreta en programar un script que ejecute el hping e imprima los resultados en un formato determinado que Cacti es capaz de interpretar.

El proceso es muy simple, me he limitado a copiar un script Perl que hacía algo parecido y adaptarlo para que use hping en vez de ping. Me animo a publicarlo por que no he encontrado ya uno hecho y por que he perdido más de 2 horas hasta que he averiguado que el comando hping2 se comporta de forma «peculiar» ya que parte de su salida la envía a STDOUT y otra parte a STDERR. Si alguno de vosotros se encuentra en la misma tesitura espero que mi experiencia os sirva para ahorraros esas dos horas. 🙂

Adjunto a continuación el scrip completo.


#!/usr/bin/perl -w## File     : hping2.pl
# Version  : 1.
# Date     : July 19th 2007
# Author   : Jorge Tomé Hernando <jorge@jorgetome.info>
#
# Based on : echoping.pl by Sébastien Desse <sdesse@euresys.fr>
#            SmokePing Like 1.0 for Cacti by drose12
#
# Description
# ===========
# This script uses the hping2 utility to check the availability
# and response times of remote services.
# I create this script to be able to monitor the availability of
# services on servers external to my network (behind a firewall) that
# i cannot ping neither access by SNMP.
#
# Syntax
# hping2.pl <number of tests> <destination port> <destination host>
#
# Where...
#   number of tests  : Numeric value. Greater than 0.
#   destination port : Numeric value. Any valid port.
#   destination host : IP address or host name
#
# The script prints a line to the STDOUT with this format:
#
# min:$min avg:$avg max:$max loss:$loss
#
# Where...
#   $min  : Numeric value. Minimum response time in milliseconds
#   $avg  : Numeric value. Average response time in milliseconds
#   $max  : Numeric value. Maximum response time in milliseconds
#   $loss : Numeric value. Percent of packets loss

## Configuration section ==============================================
$HPING2CMD    = "/usr/sbin/hping2";    # Location of the hping2 program
$HPING2PARAMS = "--numeric --quiet --syn"; # Parameters for hping2
# End of configuration section =======================================

# Check syntax
@ARGV == 3 or die "Syntax : hping2.pl <number of tests> <destination port> <destination host>n";

# Map arguments
my $count    = $ARGV[0];
my $destport = $ARGV[1];
my $host     = $ARGV[2];

# Initialize variables
my $min  = "err";
my $avg  = "err";
my $max  = "err";
my $loss = "err";

# Execute hping2
# Important!!. I lost more than 2 hours until i discovered that
# hping2 sends the result to STDERR instead of STDOUT, this is
# the reason for the "2>&1" in the command invocation.
open (HPING, "$HPING2CMD $HPING2PARAMS --count $count --destport $destport $host 2>&1 | ");

# Analyze the result
while (<HPING>) {
/(d+)% packet loss/ && ($loss = $1);
/= (.+)/(.+)/(.+) ms/ && (($min,$avg,$max) = ($1,$2,$3));
}

close(HPING);

# Print the results
print "min:$min avg:$avg max:$max loss:$loss";

## End of script

8 comentarios en “hping2.pl. Script para monitorizar servicios remotos

  1. Gracias por el comentario Christyian

    Respecto a cómo instalarlo en MS Windows, ¡caramba!, ni siquiera sabía que había una versión de hping para MS Windows.

    El script que yo he preparado es un script Perl, por lo que para ejecutarlo en MS Windows necesitaras, al menos, disponer de un interprete de Perl para MS Windows. El que yo he utilizado en alguna ocasión es el de ActivePerl que puedes encontrar aquí

    Una vez que tengas instalado el soporte de Perl en tu máquina podrás ejecutar el script de la misma forma que los otros scripts de Cacti.

  2. Amigo Jorge,

    Pienso que tu eres la persona indicada para ayudarme en lo siguiente:

    Tengo instalado en Ubunti 7.1, y he logrado instalar el Cacti, pero grande fue mi sorpresa que no logro hacerlo funcionar correctamente, por lo siguiente:

    Para empezar al agregar varios dispositivos no se exactamente cuantos el famoso cacti no logra mostrarlos UP, y aparte de eso me da un error al configurar el tipo de ping en ICMP, me dice que debo tener permisios de root y yo no se como hacer para que esta vaina funcione correctamente ya llevo varios dias tratando de hallar la solucion, pues es una herramienta muy util para mi pero la necesio 100% operacional, espero me puedas ayudar con este problema.

    Saludos,

    Axel

  3. Buenas. Bonito post. Aunque no entiendo mucho del perl ando en los bajos mundos de python aun! bueno mi inquietud es la siguiente: donde puedo encontrar un manual de esos de revista de hping2 lo necesito urgentemente, bueno no tanto pero quiero aprender jeeje.
    Con respecto a Axel bueno ya intentaste instalar desde la consola el cactis? te funciona en consola? si te funciona en consola tu problema es el sistema operativo?

    no es q tenga nada en contra de ubuntu pero si quieres tener un software libre creo q no es la mejor opcion yo siempre lo recomiendo para migrar a la gente q teme a volverse loca en la terminal jeje, pero creo q sabes hasta mas q yo de unix y aun con ubuntu no se es mi punto de vista!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *