Ir al contenido principal
Su aplicación está reportando problemas para llegar al servidor de la base de datos del back end al 172.16.1.116 o tal vez está a punto de configurar una nueva aplicación y quiere asegurarse de que puede llegar al servidor de la base de datos del back end. La primera herramienta que se me ocurre es el ping pero muchos hosts ya no responderán a las solicitudes de eco (ping) de ICMP y de los que lo hagan hay una alta probabilidad de que sus cortafuegos de red bloqueen sus solicitudes de ping o sus respuestas. Si el ping se agota (figura 1) hay otras formas de probar la conectividad de la red.
ping 172.16.1.116
Pinging host 172.16.1.116 : 172.16.1.116
ping: No reply. Time Out !!
ping: No reply. Time Out !!
ping: No reply. Time Out !!
ping: No reply. Time Out !!
Host 172.16.1.116 replied to 0 of the 4 pings
ready 12:26:32
Figura 1 - ping timing out
Suponiendo que el host al que intentamos llegar ejecute un servicio basado en TCP (en lugar de UDP), podemos simplemente enviar un telnet al host y especificar el número de puerto del servicio. Hay 4 respuestas posibles, una conexión (figura 2), un rechazo (figura 6), una indicación de algo incorrecto (figuras 7 y 8) o un tiempo de espera (figura 9).
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
Figura 2 - conexión
Un mensaje de "Conectado" indica que estás conectado con el anfitrión - probablemente. Algunos aceleradores de la WAN interceptarán la conexión y la completarán, actuando como un proxy. Si te conectas y luego te desconectas unos segundos después, puede ser que te hayas conectado al acelerador y luego el acelerador no pudo conectarse al destino final, por lo que se desconectó de ti. Por supuesto, también podría ser que te conectaras al host real y la aplicación se estrellara. Vale la pena saber si estás usando algún hardware de acelerador y exactamente cómo funciona.
Para desconectar teclee control-] y "salir" en el indicador de telnet>.
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
telnet> quit
Figura 3 - desconectando una sesión conectada
La única manera de estar absolutamente seguro de que ha llegado al servicio correcto que se ejecuta en el host de destino es si ese servicio responde a la solicitud de conexión con algún tipo de mensaje de banner. Por ejemplo, un aviso de conexión que identifique al host. Si tiene acceso al host de destino y ese host tiene Perl instalado, puede ejecutar el script Perl tcplisten que enviará un mensaje de banner específico cuando acepte una conexión.
On target system (Linux)
[ndav@phx-lab-lnx64 ~]$ perl tcplisten.pl -p 1830 -m 'Connection has been accepted'
perl tcplisten.pl -port 1830 -message 'Connection has been accepted'
On OpenVOS client
stp -ttp ascii
ready 12:16:34
telnet 164.152.77.155 1830
Trying...
Connected to 164.152.77.155.
Escape character is '^]'.
Connection has been accepted
Escape character is '^]'.Connection closed by forei.
Ready 12:16:40
Figura 4 ejecutando tcplisten.pl en el sistema Linux con el cliente OpenVOS
Debido a que el cliente telnet OpenVOS limpiará la ventana de la terminal cuando se cierre la conexión, probablemente tendrá que configurar su tipo de terminal en ascii para ver el mensaje de conexión.
También puedes ejecutar tcplisten en OpenVOS (asumiendo que tienes la gnu_library instalada).
On OpenVOS target system
perl tcplisten.pl -p 1830 -m 'made it to m16'
perl tcplisten.pl -port 1830 -message 'made it to m16'
On Linux client
[ndav@phx-lab-lnx64 ~]$ telnet 164.152.77.128 1830
Trying 164.152.77.128...
Connected to rigel.az.stratus.com (164.152.77.128).
Escape character is '^]'.
made it to m16
Connection closed by foreign host.
[ndav@phx-lab-lnx64 ~]$
Figura 5 ejecutando tcplisten.pl en el sistema OpenVOS con el cliente Linux
Un mensaje de "rechazado" indica que llegó al host objetivo pero que no tenía un servicio de escucha en ese puerto - probablemente.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 12:31:28
Figura 6 - rechazo
Algunos cortafuegos pueden enviar un restablecimiento en respuesta a una solicitud de conexión no aprobada. Es muy difícil o imposible decir qué escenario está ocurriendo, al menos desde el lado del cliente.
Si telnet recibe una indicación de que la red (figura 7) o el host (figura 8) son inalcanzables, informará de ello. El mensaje "red ... inalcanzable" indica que o bien OpenVOS no tiene una ruta hacia la red de destino o bien algún encaminador en el centro de la red no pudo llegar a la red de destino. El mensaje "No route to host" indica que el enrutador conectado a la red de destino no pudo llegar al host de destino. Lo más probable es que esto signifique que el host de destino está caído.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: Network trying to be reached is unreac
+hable.
ready 12:54:34
Figura 7 - Cliente de telnet de OpenVOS informando que la red es inalcanzable.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: No route to host.
ready 12:55:44
Figura 8 - Cliente de telnet de OpenVOS informando que el host es inalcanzable
Telnet no informará de la fuente de estos errores. El script Perl tuc.pl (prueba de conexión UDP) dirigido a la misma dirección IP y número de puerto reportará la dirección IP de origen (ver la siguiente discusión sobre las pruebas UDP)
Un tiempo de espera indica que no se puede llegar al anfitrión - probablemente. La mayoría de los hosts responderán con una conexión o con una denegación, pero si un host tiene un cortafuegos basado en el host, puede que simplemente deje la solicitud sin responder. De manera similar, un cortafuegos basado en la red puede dejar caer la solicitud sin responder; y por supuesto, cualquier mensaje ICMP enviado por un enrutador o un host también puede ser dejado caer por otro enrutador o cortafuegos.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The operation timed out.
Figura 9 - Cliente de telnet de OpenVOS informando de un tiempo de espera
En resumen, hay 5 resultados posibles
Mensaje
Significado
Conectados (con la bandera)
Puede llegar al host y a la aplicación
Conectado (sin bandera)
Puede llegar al anfitrión y a la aplicación - probablemente
Rechazado
Puede llegar al anfitrión pero no a la aplicación - probablemente
Inaccesible
No puede llegar al anfitrión
Tiempo de espera
No puede llegar al anfitrión - probablemente
Figura 10 - resumen de resultados e interpretaciones para las conexiones TCP
Si la aplicación usa un puerto UDP las cosas son más difíciles. Primero, no hay utilidades estándar en OpenVOS para enviar un datagrama UDP. Segundo, una respuesta puede volver como un datagrama UDP o un mensaje ICMP. El script Perl tuc.pl (test UDP connection) enviará un datagrama con la fecha y hora actual al host y puerto especificados. Luego espera un datagrama UDP o un mensaje ICMP. Lo ideal es que su aplicación devuelva un mensaje que luego se muestre. La figura 11 muestra que la aplicación de escucha se hizo eco del mensaje enviado por el script.
perl tuc.pl -i 172.16.1.116 -p 1830
Reply received on UDP socket from 164.152.77.128 message: echoed by udpecho.pl:
+sent by tuc.pl at Mon Aug 30 13:31:34 2010
ready 13:31:34
Figura 11 - La aplicación del servidor UDP hace eco del mensaje recibido
Si el servidor no está escuchando en el puerto de destino debería enviar un mensaje de "puerto de destino inalcanzable". Asumiendo que el mensaje es recibido desde la dirección IP de destino esto significa que llegó al servidor pero ninguna aplicación estaba escuchando.
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Destination port unreachable message received from 172.16.1.116
ready 11:40:12
Figura 12 - el host objetivo envía un mensaje de puerto inalcanzable
Como las pruebas de telnet, puedes obtener mensajes ICMP que indican problemas de red y de host y, como he dicho antes, obtienes la dirección IP del remitente para tener un punto de partida más definido para comenzar tus investigaciones.
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Destination network unreachable message received from 164.152.77.171
ready 11:43:50
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Destination host unreachable message received from 164.152.77.171
ready 11:44:54
Figura 13 - red y anfitrión de mensajes inalcanzables
Los errores anteriores son probablemente dos de los más comunes. Otro indica un bucle de enrutamiento
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Time exceeded , TTL expired in transit message received from 164.152.77.34
ready 11:45:39
Figura 14 - Mensaje ICMP indicando un bucle de enrutamiento
Hay muchos otros errores, algunos de los cuales indican la adopción de medidas administrativas para impedir el flujo de paquetes. Puede estar seguro de que estos mensajes indican que un cortafuegos bloquea sus paquetes.
Sin embargo, muchas aplicaciones esperan un mensaje con un formato específico. En ese caso, es probable que sea yo quien se quede en silencio. Por defecto, el guión se apaga después de 5 segundos y reporta "no hay respuesta".
perl tuc.pl -i 172.16.1.116 -p 1830
No response was received from 172.16.1.116
ready 16:43:26
Figura 15 - no hay respuesta
Si quieres esperar más tiempo (o menos) puedes usar la "opción -t"
perl tuc.pl -i 172.16.1.117 -p 1830 -t 10
No response was received from 172.16.1.117
ready 12:06:26
perl tuc.pl -i 172.16.1.117 -p 1830 -t 1
No response was received from 172.16.1.117
ready 12:06:32
Figura 16 - cambiando el tiempo de espera por defecto
El silencio no es necesariamente malo. Podría significar que has llegado al anfitrión del objetivo, que está escuchando en el puerto de destino, pero no le gustó el mensaje de prueba que se envió. Desafortunadamente, también podría significar que el paquete de prueba nunca llegó al host objetivo y que cualquier mensaje ICMP enviado de vuelta para indicar que fue bloqueado. Si usted tiene acceso al servidor puede ejecutar el script Perl udpecho.pl, el cual agregará su propio encabezado y luego hará eco de lo que se le envió (figura 11).
En resumen
Mensaje
Significado
Mensaje del banner de la aplicación
Puede llegar al host y a la aplicación
Red ICMP/mensaje central
No puede llegar al anfitrión
Mensaje de puerto ICMP del host
Puede llegar al anfitrión pero no a la aplicación
No hay respuesta, la aplicación envía un mensaje de banner
No puede llegar al anfitrión
No hay respuesta, la aplicación no envía un mensaje de banner
Puede o no ser capaz de llegar al huésped
Figura 17 - resumen de resultados e interpretaciones para las conexiones de UCP

tcplisten.pl

# tcplisten.pl begins here

#

# Versión 1.00 10-07-30

# Este guión ha sido probado en

# Abrir VOS 17.0.2ah ejecutando Perl v5.8.0 construido para i686-vos

# Microsoft Windows XP Service Pack 3 funcionando

# ActiveState Perl v5.10.0 construido para MSWin32-x86-multi-hilo

# Red Hat Linux 4AS-5.5 funcionando

# Perl v5.8.5 construido para x86_64-linux-thread-multi

#

# [email protected]

#

use IO::Socket;

usa Getopt::Long;

usa Sys::Nombre de host;

...usar estrictamente;

mi ($resultado);

mi ($localPort, $message, $peerAddr);

mi ($newSock, $data);

$resultado = GetOptions ('port=s' => $localPort,

(message=s' => $message);

si (($resultado != 1) || !(definido($localPort))

{

Imprime "nnUsage:n";

imprimir "tperl tcplisten.pl -port PORT-NUMBER [-mensaje MENSAJE]nn";

salida;

}

si (!definido ($mensaje))

{

imprimir "No se ha especificado ningún mensaje - creación de un mensaje";

$message = "Conexión aceptada por tcplisten ejecutándose en " . nombre de host;

}

imprimir "perl tcplisten.pl -port $localPort -message '" . $message . "“‘n”;

mi calcetín = IO::Socket::INET->new(

Proto => 'tcp',

LocalPort => $localPort,

Dir. Local => '0.0.0.0',

Escucha => 1,

) o morir "No se pudo crear un enchufe para el puerto $localPort: $!n";

mientras que (1)

{

mi $newSock = $sock->aceptar ();

Imprimir "Conectado aceptado desde". $newSock->peerhost.

"en" . hora local () . "“n”;

imprimir $newSock $message . "“n”;

$newSock -> apagado(2);

$sock->read($data, 1024); # espera para obtener una indicación cercana */

$newSock->close();

}

#

# tcplisten.pl termina aquí

tuc.pl

# tuc.pl begins here

#

# Versión 1.00 10-07-30

# Este guión ha sido probado en

# Abrir VOS 17.0.2ah ejecutando Perl v5.8.0 construido para i686-vos

# Microsoft Windows XP Service Pack 3 funcionando

# ActiveState Perl v5.10.0 construido para MSWin32-x86-multi-hilo

# Red Hat Linux 4AS-5.5 funcionando

# Perl v5.8.5 construido para x86_64-linux-thread-multi

#

# [email protected]

#

use IO::Socket;

use IO::Select;

usa Getopt::Long;

...usar estrictamente;

mi ($resultado);

mi ($destIP, $destPort, $timeout, $resultado, $mensaje, $banderas);

mi ($ready, $socket);

mi ($x, $c, $icmp Ya);

$resultado = GetOptions ('ip=s' => $destIP,

'port=s' => $destPort,

(timeout=s' => $timeout);

si (($resultado != 1) || !(definido($destIP) && definido($destPort))

{

Imprime "nnUsage:n";

imprimir "tperl tuc.pl -ip DESTINO-IP-ADDRESS" .

"-DEPARTAMENTO DE DESTINO-PUERTO-NUMBERN";

salida;

}

if (!defined($timeout)) { $timeout = 5; }

elsif ($timeout > 15) { print "OK, but " . $timeout .

"parece irrazonablemente largo.n"; }

$message = "enviado por tuc.pl a " . hora local ();

mi calcetín = IO::Socket::INET->new(

Proto => 'udp',

PeerPort => $destPort,

PeerAddr => $destIP

) o morir "No se pudo crear un enchufe para el destino $destIP: $!n";

mi $isock = IO::Socket::INET->new(

Proto => 'icmp');

$sock->enviar($message) o morir "Enviar error: $!n";

$message = "";

mi $read_set = nuevo IO::Select();

$read_set->add($sock);

$read_set->add($isock);

($ready) = IO::Select->select($read_set, undef, undef, $timeout);

$icmp Ya = 0;

$c = 0;

foreach $socket (@$ready)

{

$c = $c + 1;

si ($socket == $sock)

{

$x = "Respuesta recibida en el enchufe UDP de ";

$socket->recv($message, 100, $flags);

si ($icmpAlready == 0)

{

si (longitud ($message) > 0)

{ print $x . $socket->peerhost . ” message: ” . $message . “n”; }

else { print $x . $socket->peerhost . “n”; }

}

}

else # icmp message received

{

$icmp Ya = 1;

$socket->recv($message, 100, $flags);

si (longitud ($message) > 98)

{ print "Inesperadamente largo (" . longitud ($mensaje) .

") Mensaje ICMP de " . $socket->peerhost .

"Mensaje": " . $mensaje . "“n”; }

elsif (length ($message) < 52)

{ print "Inexactamente corto (" . longitud ($mensaje) .

") Mensaje ICMP de " . $socket->peerhost . "“n”; }

else # process icmp message

{

mi $tipo = ord (substr ($mensaje, 20, 1));

mi $código = ord (substr ($message, 21, 1));

mi $port = ord (substr ($message, 50, 1)) * 256 +

ord (substr ($message, 51, 1));

si ($port != $destPort)

{ print "Mensaje ICMP inesperado recibido de " .

$socket->peerhost . " mensaje : " . substr ($message, 20) .

"“n”; }

else # icmp message is good

{

si ($tipo == 3)

{

if ($code == 0) { print "ICMP Red de destino " .

"mensaje inalcanzable recibido de" .

$socket->peerhost . "“n”; }

elsif ($code == 1) { print "ICMP Destination host " .

"mensaje inalcanzable recibido de" .

$socket->peerhost . "“n”; }

elsif ($code == 3) { print "ICMP Puerto de destino " .

"mensaje inalcanzable recibido de" .

$socket->peerhost . "“n”; }

elsif ($code == 6) { print "ICMP Red de destino " .

"mensaje desconocido recibido de".

$socket->peerhost . "“n”; }

elsif ($code == 7) { print "ICMP Destination host unknown " .

"Mensaje recibido de". $socket->peerhost. "“n”; }

elsif ($code == 8) { print "ICMP Host de origen aislado " .

"mensaje recibido de".

$socket->peerhost . "“n”; }

elsif ($code == 9) { print "ICMP Network administratively " .

"mensaje prohibido recibido de".

$socket->peerhost . "“n”; }

elsif ($code == 10) { print "ICMP Host administratively " .

"mensaje prohibido recibido de".

$socket->peerhost . "“n”; }

elsif ($code == 11) { print "Red ICMP inalcanzable para " .

"Mensaje TOS recibido de".

$socket->peerhost . "“n”; }

elsif ($code == 12) { print "ICMP Host unreachable for " .

"Mensaje TOS recibido de".

$socket->peerhost . "“n”; }

elsif ($code == 13) { print "Comunicación ICMP " .

"mensaje administrativamente prohibido recibido de".

$socket->peerhost . "“n”; }

else { print "Mensaje ICMP inesperado recibido tipo = " .

$tipo . ", código = " . $código . " de " .

$socket->peerhost . "“n”; }

} # si ($tipo == 3)

elsif (($tipo == 11) & ($código == 0))

{ print "Tiempo ICMP excedido , TTL expirado en tránsito " .

"Mensaje recibido de". $socket->peerhost. "“n”; }

else { print "Mensaje ICMP inesperado recibido tipo = " .

$tipo . ", código = " . $código . " de " .

$socket->peerhost . "“n”; }

} # Más # El mensaje del ICMP es bueno

} # else # process icmp message

} # más # mensaje recibido de la ICMP

} # foreach $socket (@$ready)

if ($c == 0) { print "No se ha recibido respuesta de " .

$sock->peerhost . "“n”; }

#

# tuc.pl termina aquí

udpecho.pl

# udpecho.pl begins here

#

# Versión 1.00 10-07-30

# Este guión ha sido probado en

# Abrir VOS 17.0.2ah ejecutando Perl v5.8.0 construido para i686-vos

# Microsoft Windows XP Service Pack 3 funcionando

# ActiveState Perl v5.10.0 construido para MSWin32-x86-multi-hilo

# Red Hat Linux 4AS-5.5 funcionando

# Perl v5.8.5 construido para x86_64-linux-thread-multi

#

# [email protected]

#

use IO::Socket;

use IO::Select;

usa Getopt::Long;

...usar estrictamente;

mi ($resultado);

mi ($localPort, $debug, $resultado, $mensaje, $banderas);

mi ($ready, $socket);

mi ($x, $c);

$resultado = GetOptions ('port=s' => $localPort,

'debug' => $debug);

si (($resultado != 1) || !(definido($localPort))

{

Imprime "nnUsage:n";

imprimir "tperl udpecho.pl -port LOCAL-PORT-NUMBER [-debug]nn";

salida;

}

if (defined($debug)) { print “local port number is ” . $localPort . “n”; }

mi calcetín = IO::Socket::INET->new(

Proto => 'udp',

LocalPort => $localPort

) o morir "No pudo crear el enchufe $!n";

mi $read_set = nuevo IO::Select();

$read_set->add($sock);

$message = "";

mientras que (1)

{

($ready) = IO::Select->select($read_set, undef, undef, 300);

foreach $socket (@$ready)

{

$socket->recv($message, 100, $flags);

if (defined ($debug)) { print "Mensaje de " . $socket->peerhost .

"Mensaje": " . $mensaje . "“n”; }

$socket->send("echo por udpecho.pl: " . $message) o morir "Send error: $!

+n”;

}

}

#

# udpecho.pl termina aquí