Passa al contenuto principale
La vostra applicazione sta segnalando problemi per raggiungere il server di database di back end a 172.16.1.116 o forse state per impostare una nuova applicazione e volete essere sicuri che possa raggiungere il server di database di back end. Il primo strumento che viene in mente è il ping ma molti host non risponderanno più alle richieste ICMP echo (ping) e di quelli che lo fanno c'è un'alta probabilità che i loro firewall di rete blocchino le vostre richieste di ping o le loro risposte. Se il ping si interrompe (figura 1) ci sono altri modi per testare la connettività di rete.
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 - temporizzazione del ping out
Supponendo che l'host che si sta cercando di raggiungere stia eseguendo un servizio basato su TCP (in contrapposizione a UDP) si può semplicemente telnet all'host e specificare il numero di porta del servizio. Ci sono 4 possibili risposte, una connessione (figura 2), un rifiuto (figura 6), un'indicazione di qualcosa di sbagliato (figure 7 e 8) o un timeout (figura 9).
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
Figura 2 - collegamento
Un messaggio "Connected" indica che siete collegati all'host - probabilmente. Alcuni acceleratori WAN intercetteranno la connessione e la completeranno, fungendo da proxy. Se vi connettete e poi qualche secondo dopo vi disconnettete, è possibile che vi siate connessi all'acceleratore e che l'acceleratore non riesca a connettersi alla destinazione finale e quindi si scolleghi da voi. Naturalmente potrebbe anche essere che vi siete connessi all'host effettivo e l'applicazione si è bloccata. È utile sapere se si sta utilizzando un qualsiasi hardware per l'acceleratore e come funziona esattamente.
Per scollegare il tipo di controllo-] e "quit" al prompt telnet>.
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
telnet> quit
Figura 3 - Scollegamento di una sessione collegata
L'unico modo per essere assolutamente sicuri di aver raggiunto il servizio corretto in esecuzione sull'host di destinazione è che quel servizio risponda alla richiesta di connessione con un qualche tipo di messaggio banner. Ad esempio, un prompt di login che identifica l'host. Se si ha accesso all'host di destinazione e tale host ha installato il Perl, è possibile eseguire lo script tcplisten Perl che invierà un messaggio banner specificato quando accetta una connessione.
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 che esegue tcplisten.pl su sistema Linux con client OpenVOS
Poiché il client telnet di OpenVOS cancellerà la finestra del terminale quando la connessione si chiude, sarà probabilmente necessario impostare il tipo di terminale su ascii per vedere il messaggio di connessione.
Si può anche eseguire tcplisten su OpenVOS (supponendo di avere installato 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 ~]$
Figura 5 che esegue tcplisten.pl su sistema OpenVOS con client Linux
Un messaggio "rifiutato" indica che avete raggiunto l'host di destinazione ma che non aveva un servizio in ascolto su quella porta - probabilmente.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 12:31:28
Figura 6 - rifiuto
Alcuni firewall possono inviare un reset in risposta ad una richiesta di connessione non approvata. È molto difficile capire quale scenario si sta verificando, almeno dal lato del cliente.
Se telnet riceve un'indicazione che la rete (figura 7) o l'host (figura 8) non è raggiungibile, lo segnalerà. Il messaggio "rete ... irraggiungibile" indica che OpenVOS non ha un percorso verso la rete di destinazione o che qualche router nel mezzo della rete non può raggiungere la rete di destinazione. Il messaggio "Nessun percorso per l'host" indica che il router collegato alla rete di destinazione non ha potuto raggiungere l'host di destinazione. Molto probabilmente ciò significa che l'host di destinazione è fuori servizio.
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 - OpenVOS telnet client che segnala che la rete è irraggiungibile.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: No route to host.
ready 12:55:44
Figura 8 - OpenVOS telnet client che segnala che l'host è irraggiungibile
Telnet non segnalerà la fonte di questi errori. Lo script tuc.pl (test UDP connection) Perl diretto allo stesso indirizzo IP e allo stesso numero di porta riporterà l'indirizzo IP di origine (vedi la seguente discussione sui test UDP)
Un timeout indica che non è possibile raggiungere l'host - probabilmente. La maggior parte degli host risponderà con una connessione o con un rifiuto, ma se un host ha un firewall basato su host, potrebbe semplicemente abbandonare la richiesta senza rispondere. Allo stesso modo un firewall basato su rete può semplicemente abbandonare la richiesta senza rispondere; e naturalmente qualsiasi messaggio ICMP inviato da un router o da un host può anche essere abbandonato da un altro router o firewall.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The operation timed out.
Figura 9 - OpenVOS telnet client che segnala un timeout
In sintesi ci sono 5 possibili risultati
Messaggio
Significato
Collegato (con banner)
Può raggiungere l'host e l'applicazione
Collegato (senza banner)
Può raggiungere l'host e l'applicazione - probabilmente
Rifiutato
Può raggiungere l'host ma non l'applicazione - probabilmente
Raggiungibile
Impossibile raggiungere l'host
Timeout
Impossibile raggiungere l'host - probabilmente
Figura 10 - riepilogo dei risultati e delle interpretazioni per le connessioni TCP
Se l'applicazione utilizza una porta UDP le cose sono più complicate. Innanzitutto non ci sono utility standard su OpenVOS per l'invio di un datagramma UDP. Secondo, una risposta può tornare sia come datagramma UDP che come messaggio ICMP. Lo script Perl tuc.pl (test UDP connection) invierà un datagramma contenente la data e l'ora corrente all'host e alla porta specificati. Attende quindi un datagramma UDP o un messaggio ICMP. Idealmente l'applicazione restituirà un messaggio che verrà poi visualizzato. La Figura 11 mostra che l'applicazione in ascolto fa eco al messaggio inviato dallo 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 - L'applicazione del server UDP echeggia il messaggio ricevuto
Se il server non è in ascolto sulla porta di destinazione, dovrebbe inviare un messaggio di "porta di destinazione irraggiungibile". Supponendo che il messaggio sia ricevuto dall'indirizzo IP di destinazione, ciò significa che si è raggiunto il server ma nessuna applicazione era in ascolto.
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 - host di destinazione che invia un messaggio di porta non raggiungibile
Come per i test telnet, è possibile ottenere messaggi ICMP che indicano problemi di rete e di host e, come ho discusso sopra, si ottiene l'indirizzo IP del mittente in modo da avere un punto di partenza più preciso per iniziare le indagini.
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 - messaggi non raggiungibili dalla rete e dall'host
Gli errori di cui sopra sono probabilmente due dei più comuni. Un altro indica un ciclo di routing
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 - Messaggio ICMP che indica un loop di routing
Ci sono molti altri errori, alcuni dei quali indicano un'azione amministrativa per impedire il flusso dei pacchetti. Potete essere abbastanza sicuri che questi messaggi indicano un firewall che blocca i vostri pacchetti.
Tuttavia, molte applicazioni si aspettano un messaggio specificamente formattato. In questo caso, probabilmente mi farete incontrare con il silenzio. Per impostazione predefinita lo script si interrompe dopo 5 secondi e segnala "nessuna risposta".
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 - nessuna risposta
Se si desidera attendere più a lungo (o più brevemente) è possibile utilizzare l'opzione "-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 - modifica del timeout di default
Il silenzio non è necessariamente un male. Potrebbe significare che avete raggiunto l'host di destinazione, che è in ascolto sulla porta di destinazione, ma non gli è piaciuto il messaggio di prova che è stato inviato. Purtroppo, potrebbe anche significare che il pacchetto di test non è mai arrivato all'host di destinazione e che tutti i messaggi ICMP inviati per indicare che sono stati bloccati. Se si ha accesso al server si può eseguire lo script udpecho.pl Perl che aggiungerà la propria intestazione e poi farà l'eco a qualsiasi cosa gli sia stata inviata (figura 11).
In sintesi
Messaggio
Significato
Applicazione messaggio banner
Può raggiungere l'host e l'applicazione
Rete ICMP/messaggio host
Impossibile raggiungere l'host
Messaggio della porta ICMP dall'host
Può raggiungere l'host ma non l'applicazione
Nessuna risposta, l'applicazione invia un messaggio banner
Impossibile raggiungere l'host
Nessuna risposta, l'applicazione non invia il messaggio del banner
Può o non può essere in grado di raggiungere l'host
Figura 17 - sintesi dei risultati e delle interpretazioni per le connessioni UCP

tcplisten.pl

# tcplisten.pl begins here

#

# Versione 1.00 10-07-30

# Questo script è stato testato su

# Open VOS 17.0.2ah con Perl v5.8.0 costruito per i686-vos

# Microsoft Windows XP Service Pack 3 in esecuzione

# ActiveState Perl v5.10.0 costruito per MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 in esecuzione

# Perl v5.8.5 costruito per x86_64-linux-thread-multi

#

# noah.davids@stratus.com

#

utilizzare IO::Socket;

utilizzare Getopt::Long;

utilizzare Sys::Hostname;

usare il rigoroso;

mio (risultato di $);

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

mio ($newSock, $data);

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

message=s' => $message);

se (($risultato != 1) ||| !(definito($localPort)))

{

stampa "nnUsage:n";

stampa "tperl tcplisten.pl -port PORT-NUMBER [-messaggio MESSAGGIO]nn";

uscire;

}

se (!definito (messaggio di $))

{

stampare "Nessun messaggio specificato - creazione di messagen";

$messaggio = "Connessione accettata da tcplisten in esecuzione su " . hostname;

}

stampa "perl tcplisten.pl -port $localPort -messaggio '" . $messaggio . "“‘n”;

il mio $sock = IO::Socket::INET->new(

Proto => 'tcp',

LocalPort => $localPort,

LocalAddr => '0.0.0.0.0',

Ascolta => 1,

) o morire "Impossibile creare presa per porta $localPort: $!n";

mentre (1)

{

my $newSock = $sock->accetta ();

stampa "Connesso accettato da " . $newSock->peerhost .

" a " . ora locale () . "“n”;

stampa $newSock $messaggio . "“n”;

$newSock -> spegnimento(2);

$sock->read($data, 1024); # aspetta di avere un'indicazione di chiusura */

$newSock->close();

}

#

# tcplisten.pl finisce qui

tuc.pl

# tuc.pl begins here

#

# Versione 1.00 10-07-30

# Questo script è stato testato su

# Open VOS 17.0.2ah con Perl v5.8.0 costruito per i686-vos

# Microsoft Windows XP Service Pack 3 in esecuzione

# ActiveState Perl v5.10.0 costruito per MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 in esecuzione

# Perl v5.8.5 costruito per x86_64-linux-thread-multi

#

# noah.davids@stratus.com

#

utilizzare IO::Socket;

utilizzare IO::Selezionare;

utilizzare Getopt::Long;

usare il rigoroso;

mio (risultato di $);

my ($destIP, $destPort, $timeout, $risultato, $messaggio, $bandiere);

mio ($ready, $socket);

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

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

port=s' => $destPort,

timeout=s' => $timeout);

se (($risultato != 1) ||| !(definito($destIP) && definito($destPort))))

{

stampa "nnUsage:n";

stampa "tperl tuc.pl -ip DESTINAZIONE-IP-ADDRESS " .

"-porto DESTINAZIONE-PORTO-NUMBERNO";

uscire;

}

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

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

"sembra irragionevolmente lungo.n"; }

$messaggio = "inviato da tuc.pl a " . localtime ();

il mio $sock = IO::Socket::INET->new(

Proto => 'udp',

PeerPort => $destPort,

PeerAddr => $destIP

) o morire "Impossibile creare presa per destinazione $destIP: $!n";

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

Proto => 'icmp');

$sock->send($messaggio) o morire "Invia errore: $!n";

$messaggio = "";

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

$read_set->add($sock);

$read_set->add($isock);

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

$icmpAlready = 0;

$c = 0;

foreach $socket (@$ready)

{

$c = $c + 1;

se ($socket == $sock)

{

$x = "Risposta ricevuta sulla presa UDP da";

$socket->recv($messaggio, 100, $bandiere);

se ($icmpAlready == 0)

{

se (lunghezza ($messaggio) > 0)

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

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

}

}

altro # messaggio icmp ricevuto

{

$icmpAlready = 1;

$socket->recv($messaggio, 100, $bandiere);

se (lunghezza ($messaggio) > 98)

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

") Messaggio ICMP da " . $socket->peerhost .

"messaggio": . messaggio: " . $messaggio . "“n”; }

elsif (length ($message) < 52)

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

") Messaggio ICMP da " . $socket->peerhost . "“n”; }

altro # elabora il messaggio icmp

{

my $type = ord (substrato ($messaggio, 20, 1));

my $code = ord (substr ($messaggio, 21, 1));

my $port = ord (substrato ($messaggio, 50, 1)) * 256 +

ord (substrato ($messaggio, 51, 1));

se ($port != $destPort)

{ print "Unexpected ICMP message received from " .

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

"“n”; }

altrimenti il messaggio icmp è buono

{

se ($type == 3)

{

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

"messaggio irraggiungibile ricevuto da" .

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

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

"messaggio irraggiungibile ricevuto da" .

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

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

"messaggio irraggiungibile ricevuto da" .

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

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

"messaggio sconosciuto ricevuto da" .

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

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

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

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

"messaggio ricevuto da" .

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

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

"messaggio proibito ricevuto da" .

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

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

"messaggio proibito ricevuto da" .

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

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

"Messaggio TOS ricevuto da" .

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

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

"Messaggio TOS ricevuto da" .

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

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

"Messaggio vietato dal punto di vista amministrativo ricevuto da" .

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

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

Tipo $ . ", codice = " . $codice . " da " .

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

} # se ($type == 3)

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

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

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

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

Tipo $ . ", codice = " . $codice . " da " .

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

} # altrimenti il messaggio icmp è buono

} # Altrimenti, elabora il messaggio icmp

} #altro # messaggio icmp ricevuto

} # foreach $socket (@$ready)

if ($c == 0) { print "Nessuna risposta è stata ricevuta da " .

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

#

# tuc.pl finisce qui

udpecho.pl

# udpecho.pl begins here

#

# Versione 1.00 10-07-30

# Questo script è stato testato su

# Open VOS 17.0.2ah con Perl v5.8.0 costruito per i686-vos

# Microsoft Windows XP Service Pack 3 in esecuzione

# ActiveState Perl v5.10.0 costruito per MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 in esecuzione

# Perl v5.8.5 costruito per x86_64-linux-thread-multi

#

# noah.davids@stratus.com

#

utilizzare IO::Socket;

utilizzare IO::Selezionare;

utilizzare Getopt::Long;

usare il rigoroso;

mio (risultato di $);

my ($localPort, $debug, $risultato, $messaggio, $bandiere);

mio ($ready, $socket);

mio ($x, $c);

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

debug => $debug);

se (($risultato != 1) ||| !(definito($localPort)))

{

stampa "nnUsage:n";

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

uscire;

}

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

il mio $sock = IO::Socket::INET->new(

Proto => 'udp',

LocalPort => $localPort

) o morire "Impossibile creare presa $!n";

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

$read_set->add($sock);

$messaggio = "";

mentre (1)

{

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

foreach $socket (@$ready)

{

$socket->recv($messaggio, 100, $bandiere);

if (defined ($debug))) { print "Messaggio da " . $socket->peerhost .

"messaggio": . messaggio: " . $messaggio . "“n”; }

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

+n”;

}

}

#

# udpecho.pl finisce qui

© 2020 Stratus Tecnologie.