Skip to main content
Votre application signale des problèmes pour atteindre le serveur de base de données dorsale au 172.16.1.116 ou peut-être êtes-vous sur le point de mettre en place une nouvelle application et vous voulez vous assurer qu'elle peut atteindre le serveur de base de données dorsale. Le premier outil qui vous vient à l'esprit est le ping mais de nombreux hôtes ne répondront plus aux demandes d'écho ICMP (ping) et parmi ceux qui le font, il y a une forte probabilité que leurs pare-feu réseau bloquent soit vos demandes ping soit leurs réponses. Si le ping est interrompu (figure 1), il existe d'autres moyens de tester la connectivité du réseau.
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
Figure 1 - Timing de ping
En supposant que l'hôte que vous essayez d'atteindre exécute un service basé sur TCP (par opposition à UDP), vous pouvez simplement faire un telnet à l'hôte et spécifier le numéro de port du service. Il y a 4 réponses possibles, une connexion (figure 2), un refus (figure 6), une indication de quelque chose qui ne va pas (figures 7 et 8) ou un délai d'attente (figure 9).
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
Figure 2 - connexion
Un message "Connecté" indique que vous êtes connecté à l'hôte - probablement. Certains accélérateurs WAN interceptent la connexion et la complètent, agissant comme un proxy. Si vous vous connectez et que vous vous déconnectez quelques secondes plus tard, il se peut que vous vous soyez connecté à l'accélérateur et que celui-ci n'ait pas pu se connecter à la destination finale et se soit donc déconnecté de vous. Bien sûr, il se peut aussi que vous vous soyez connecté à l'hôte réel et que l'application ait planté. Il est utile de savoir si vous utilisez un accélérateur et comment il fonctionne exactement.
Pour vous déconnecter, tapez control-] et "quit" à l'invite telnet>.
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
telnet> quit
Figure 3 - Déconnexion d'une session connectée
La seule façon d'être absolument sûr d'avoir atteint le service correct fonctionnant sur l'hôte cible est si ce service répond à la demande de connexion par une sorte de bannière. Par exemple, une demande de connexion identifiant l'hôte. Si vous avez accès à l'hôte cible et que cet hôte a installé Perl, vous pouvez exécuter le script Perl tcplisten qui enverra un message bannière spécifique lorsqu'il acceptera une connexion.
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
Figure 4 : Exécution de tcplisten.pl sur le système Linux avec le client OpenVOS
Comme le client telnet d'OpenVOS efface la fenêtre du terminal à la fermeture de la connexion, vous devrez probablement régler votre type de terminal sur ascii pour voir le message de connexion.
Vous pouvez également exécuter tcplisten sur OpenVOS (en supposant que vous avez installé la gnu_library).
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 ~]$
Figure 5 : Exécution de tcplisten.pl sur le système OpenVOS avec le client Linux
Un message "refusé" indique que vous avez atteint l'hôte cible mais qu'il n'avait pas de service d'écoute sur ce port - probablement.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 12:31:28
Figure 6 - refus
Certains pare-feux peuvent envoyer une réinitialisation en réponse à une demande de connexion non approuvée. Il est très difficile, voire impossible, de savoir quel scénario se produit, du moins du côté du client.
Si telnet reçoit une indication que le réseau (figure 7) ou l'hôte (figure 8) est injoignable, il le signalera. Le message "network ... unreachable" indique que soit OpenVOS n'a pas de route vers le réseau cible, soit un routeur au milieu du réseau n'a pas pu atteindre le réseau de destination. Le message "No route to host" indique que le routeur connecté au réseau de destination n'a pas pu atteindre l'hôte cible. Cela signifie très probablement que l'hôte cible est hors service.
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
Figure 7 - Client telnet d'OpenVOS signalant que le réseau est injoignable.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: No route to host.
ready 12:55:44
Figure 8 - Client telnet OpenVOS signalant que l'hôte est injoignable
Telnet ne signalera pas la source de ces erreurs. Le script Perl tuc.pl (test de connexion UDP) dirigé vers la même adresse IP et le même numéro de port indiquera l'adresse IP source (voir la discussion suivante sur le test UDP)
Un délai d'attente indique que vous ne pouvez pas joindre l'hôte - probablement. La plupart des hôtes répondent soit par une connexion, soit par un refus, mais si un hôte dispose d'un pare-feu basé sur l'hôte, il peut simplement abandonner la demande sans répondre. De même, un pare-feu basé sur le réseau peut simplement rejeter la demande sans y répondre. Bien entendu, tout message ICMP envoyé par un routeur ou un hôte peut également être rejeté par un autre routeur ou pare-feu.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The operation timed out.
Figure 9 - Client telnet d'OpenVOS signalant un dépassement de délai
En résumé, il y a 5 résultats possibles
Message
Signification
Connecté (avec bannière)
Peut atteindre l'hôte et l'application
Connecté (pas de bannière)
Peut atteindre l'hôte et l'application - probablement
Refus
Peut atteindre l'hôte mais pas la demande - probablement
Injoignable
Impossible de joindre l'hôte
Timeout
Impossible d'atteindre l'hôte - probablement
Figure 10 - Résumé des résultats et des interprétations pour les connexions TCP
Si l'application utilise un port UDP, les choses sont plus compliquées. Premièrement, il n'existe pas d'utilitaires standard sur OpenVOS pour envoyer un datagramme UDP. Deuxièmement, une réponse peut revenir sous la forme d'un datagramme UDP ou d'un message ICMP. Le script Perl tuc.pl (test de connexion UDP) enverra un datagramme contenant la date et l'heure actuelles à l'hôte et au port spécifiés. Il attend ensuite un datagramme UDP ou un message ICMP. Idéalement, votre application retournera un message qui sera ensuite affiché. La figure 11 montre que l'application d'écoute fait écho au message envoyé par le 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
Figure 11 - L'application du serveur UDP fait écho au message reçu
Si le serveur n'écoute pas sur le port cible, il doit renvoyer un message "port de destination inaccessible". En supposant que le message est reçu à partir de l'adresse IP cible, cela signifie que vous avez atteint le serveur mais qu'aucune application n'était à l'écoute.
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
Figure 12 - Hôte cible envoyant un message de port inaccessible
Comme pour les tests telnet, vous pouvez obtenir des messages ICMP indiquant les problèmes de réseau et d'hôte et, comme je l'ai dit plus haut, vous obtenez l'adresse IP de l'expéditeur, ce qui vous donne un point de départ plus précis pour commencer vos investigations.
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
Figure 13 - Messages inaccessibles du réseau et de l'hôte
Les erreurs ci-dessus sont probablement deux des plus courantes. Une autre indique une boucle d'acheminement
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
Figure 14 - Message ICMP indiquant une boucle de routage
Il existe de nombreuses autres erreurs, dont certaines indiquent une action administrative visant à empêcher le flux de paquets. Vous pouvez être sûr que ces messages indiquent qu'un pare-feu bloque vos paquets.
Cependant, de nombreuses demandes attendent un message spécifiquement formaté. Dans ce cas, vous serez probablement accueilli avec un silence. Par défaut, le script s'arrête au bout de 5 secondes et signale "pas de réponse".
perl tuc.pl -i 172.16.1.116 -p 1830
No response was received from 172.16.1.116
ready 16:43:26
Figure 15 - pas de réponse
Si vous voulez attendre plus longtemps (ou moins longtemps), vous pouvez utiliser l'option "-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
Figure 16 - Modification du délai par défaut
Le silence n'est pas nécessairement mauvais. Il peut signifier que vous avez atteint l'hôte cible, qu'il écoute sur le port cible mais qu'il n'a pas aimé le message de test qui a été envoyé. Malheureusement, cela peut aussi signifier que le paquet de test n'est jamais parvenu à l'hôte cible et que tout message ICMP renvoyé pour indiquer qu'il était bloqué. Si vous avez accès au serveur, vous pouvez exécuter le script Perl udpecho.pl qui ajoutera son propre en-tête et fera ensuite l'écho de ce qui lui a été envoyé (figure 11).
En résumé
Message
Signification
Message de la bannière de candidature
Peut atteindre l'hôte et l'application
Message réseau/hôte de l'ICMP
Impossible de joindre l'hôte
Message du port ICMP de l'hôte
Peut atteindre l'hôte mais pas la candidature
Pas de réponse, l'application envoie un message de bannière
Impossible de joindre l'hôte
Pas de réponse, l'application n'envoie pas de message de bannière
Peut ou non être en mesure de joindre l'hôte
Figure 17 - Résumé des résultats et des interprétations pour les connexions UCP

tcplisten.pl

# tcplisten.pl begins here

#

# Version 1.00 10-07-30

# Ce script a été testé sur

# Open VOS 17.0.2ah fonctionnant avec Perl v5.8.0 construit pour i686-vos

# Microsoft Windows XP Service Pack 3 en cours d'exécution

# ActiveState Perl v5.10.0 conçu pour MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 en cours d'exécution

# Perl v5.8.5 construit pour x86_64-linux-thread-multi

#

# noah.davids@stratus.com

#

utiliser IO::Socket ;

utilisez Getopt::Long ;

utiliser Sys::Hostname ;

utilisation stricte ;

mon ($résultat) ;

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

mon ($newSock, $data) ;

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

message=s' => $message) ;

if (($result != 1) || !(defined($localPort))

{

imprimer "nnUsage:n" ;

imprimer "tperl tcplisten.pl -port PORT-NUMBER [-message MESSAGE]nn" ;

sortie ;

}

si (!défini ($message))

{

imprimer "Aucun message spécifié - création de messagen" ;

$message = "Connexion acceptée par tcplisten fonctionnant sur " . nom d'hôte ;

}

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

my $sock = IO::Socket::INET->new(

Proto => 'tcp',

LocalPort => $localPort,

LocalAddr => "0.0.0.0",

Écoute => 1,

) ou mourir "Impossible de créer une socket pour le port $localPort : $!n" ;

alors que (1)

{

mon $newSock = $sock->accepter () ;

print "Connected accepté de " . $newSock->peerhost .

" à " . heure locale ( ) . "“n” ;

imprimer $newSock $message . "“n” ;

$newSock -> shutdown(2) ;

$sock->read($data, 1024) ; # attendre pour avoir une indication précise */

$newSock->close() ;

}

#

# tcplisten.pl s'arrête ici

tuc.pl

# tuc.pl begins here

#

# Version 1.00 10-07-30

# Ce script a été testé sur

# Open VOS 17.0.2ah fonctionnant avec Perl v5.8.0 construit pour i686-vos

# Microsoft Windows XP Service Pack 3 en cours d'exécution

# ActiveState Perl v5.10.0 conçu pour MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 en cours d'exécution

# Perl v5.8.5 construit pour x86_64-linux-thread-multi

#

# noah.davids@stratus.com

#

utiliser IO::Socket ;

utiliser IO::Select ;

utilisez Getopt::Long ;

utilisation stricte ;

mon ($résultat) ;

my ($destIP, $destPort, $timeout, $result, $message, $flags) ;

mon ($ready, $socket) ;

my ($x, $c, $icmpAlready) ;

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

Port=s' => $destPort,

timeout=s' => $timeout) ;

if (($result != 1) || !(defined($destIP) && defined($destPort))

{

imprimer "nnUsage:n" ;

imprimer "tperl tuc.pl -ip DESTINATION-IP-ADDRESS " .

"-port DESTINATION-PORT-NUMBERN" ;

sortie ;

}

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

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

" semble déraisonnablement long.n" ; }

$message = "envoyé par tuc.pl à " . heure locale () ;

my $sock = IO::Socket::INET->new(

Proto => "udp",

PeerPort => $destPort,

PeerAddr => $destIP

) ou mourir "Impossible de créer une socket pour la destination $destIP : $!n" ;

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

Proto => 'icmp') ;

$sock->send($message) ou die "Send error : $!n" ;

$message = "" ;

my $read_set = new IO::Select() ;

$read_set->add($sock) ;

$read_set->add($isock) ;

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

$icmpAlready = 0 ;

$c = 0 ;

foreach $socket (@$ready)

{

$c = $c + 1 ;

si ($socket == $sock)

{

$x = "Réponse reçue sur la socket UDP de " ;

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

si ($icmpAlready == 0)

{

si (longueur ($message) > 0)

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

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

}

}

autre # message icmp reçu

{

$icmpAlready = 1 ;

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

si (longueur ($message) > 98)

{ print "Unexpectedly long (" . length ($message) .

") Message de l'ICMP provenant de " . $socket->peerhost .

Le message " : " ...message . "“n” ; }

elsif (length ($message) < 52)

{ print "Unexpecedly short (" . length ($message) .

") Message de l'ICMP provenant de " . $socket->peerhost . "“n” ; }

else # process icmp message

{

my $type = ord (substr ($message, 20, 1)) ;

mon $code = ord (substr ($message, 21, 1)) ;

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

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

si ($port != $destPort)

{ print "Unxpected ICMP message received from " .

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

"“n” ; }

else # le message de l'icmp est bon

{

si ($type == 3)

{

if ($code == 0) { print "ICMP Destination network " .

"message injoignable reçu de " .

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

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

"message injoignable reçu de " .

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

elsif ($code == 3) { print "ICMP Destination port " .

"message injoignable reçu de " .

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

elsif ($code == 6) { print "ICMP Destination network " .

"message inconnu reçu de " .

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

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

"message reçu de " . $socket->peerhost . "“n” ; }

elsif ($code == 8) { print "ICMP Source host isolated " .

"message reçu de" .

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

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

"message interdit reçu de " .

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

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

"message interdit reçu de " .

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

elsif ($code == 11) { print "ICMP Network unreachable for " .

"Message TOS reçu de " .

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

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

"Message TOS reçu de " .

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

elsif ($code == 13) { print "Communication ICMP " .

"message interdit administrativement reçu de " .

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

else { print "Unxpected ICMP message received type = " .

$type . ", code = " . $code . " de " .

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

} # si ($type == 3)

elsif (($type == 11) & ($code == 0))

{ print "ICMP Time exceeded , TTL expired in transit " .

"message reçu de " . $socket->peerhost . "“n” ; }

else { print "Unxpected ICMP message received type = " .

$type . ", code = " . $code . " de " .

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

} # else # icmp message is good

} # else # process icmp message

} # else #icmp message received

} # foreach $socket (@$ready)

if ($c == 0) { print "Aucune réponse n'a été reçue de " .

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

#

# tuc.pl s'arrête ici

udpecho.pl

# udpecho.pl begins here

#

# Version 1.00 10-07-30

# Ce script a été testé sur

# Open VOS 17.0.2ah fonctionnant avec Perl v5.8.0 construit pour i686-vos

# Microsoft Windows XP Service Pack 3 en cours d'exécution

# ActiveState Perl v5.10.0 conçu pour MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 en cours d'exécution

# Perl v5.8.5 construit pour x86_64-linux-thread-multi

#

# noah.davids@stratus.com

#

utiliser IO::Socket ;

utiliser IO::Select ;

utilisez Getopt::Long ;

utilisation stricte ;

mon ($résultat) ;

my ($localPort, $debug, $result, $message, $flags) ;

mon ($ready, $socket) ;

mon ($x, $c) ;

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

Débogage" => $debug) ;

if (($result != 1) || !(defined($localPort))

{

imprimer "nnUsage:n" ;

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

sortie ;

}

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

my $sock = IO::Socket::INET->new(

Proto => "udp",

LocalPort => $localPort

) ou mourir "Impossible de créer une prise $!n" ;

my $read_set = new IO::Select() ;

$read_set->add($sock) ;

$message = "" ;

alors que (1)

{

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

foreach $socket (@$ready)

{

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

if (defined ($debug)) { print "Message from " . $socket->peerhost .

Le message " : " ...message . "“n” ; }

$socket->send("echoed by udpecho.pl : " . $message) or die "Send error : $ !

+n” ;

}

}

#

# udpecho.pl s'arrête ici

2020 Stratus Technologies.