Zum Hauptinhalt springen
Ihre Anwendung meldet Probleme beim Erreichen des Backend-Datenbankservers unter 172.16.1.116 oder Sie sind dabei, eine neue Anwendung einzurichten und möchten sicherstellen, dass diese den Backend-Datenbankserver erreichen kann. Das erste Tool, das Ihnen in den Sinn kommt, ist ping, aber viele Hosts antworten nicht mehr auf ICMP-Echo-Anfragen (ping), und bei denjenigen, die dies tun, ist die Wahrscheinlichkeit groß, dass ihre Netzwerk-Firewalls entweder Ihre ping-Anfragen oder deren Antworten blockieren. Wenn der Ping nicht funktioniert (Abbildung 1), gibt es andere Möglichkeiten, die Netzwerkkonnektivität zu testen.
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
Abbildung 1 - Ping-Zeitüberschreitung
Unter der Annahme, dass der Host, den Sie erreichen wollen, einen TCP-basierten Dienst (im Gegensatz zu einem UDP-basierten) betreibt, können Sie sich einfach per Telnet mit dem Host verbinden und die Portnummer des Dienstes angeben. Es gibt 4 mögliche Antworten: eine Verbindung (Abbildung 2), eine Ablehnung (Abbildung 6), ein Hinweis auf einen Fehler (Abbildungen 7 und 8) oder eine Zeitüberschreitung (Abbildung 9).
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
Abbildung 2 - Anschluss
Eine "Connected"-Meldung zeigt an, dass Sie mit dem Host verbunden sind - wahrscheinlich. Einige WAN-Beschleuniger fangen die Verbindung ab und schließen sie ab, indem sie als Proxy fungieren. Wenn die Verbindung hergestellt und einige Sekunden später wieder unterbrochen wird, kann es sein, dass Sie sich mit dem Beschleuniger verbunden haben und dieser die Verbindung zum endgültigen Ziel nicht herstellen konnte, so dass er die Verbindung zu Ihnen getrennt hat. Es kann natürlich auch sein, dass Sie sich mit dem eigentlichen Host verbunden haben und die Anwendung abgestürzt ist. Es zahlt sich aus, wenn Sie wissen, ob Sie eine Beschleunigerhardware verwenden und wie diese genau funktioniert.
Zum Trennen der Verbindung geben Sie an der Eingabeaufforderung telnet> [control-] und "quit" ein.
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
telnet> quit
Abbildung 3 - Trennen einer verbundenen Sitzung
Die einzige Möglichkeit, absolut sicher zu sein, dass Sie den richtigen Dienst auf dem Zielhost erreicht haben, ist, wenn dieser Dienst auf die Verbindungsanfrage mit einer Art Bannermeldung antwortet. Zum Beispiel eine Anmeldeaufforderung, die den Host identifiziert. Wenn Sie Zugriff auf den Zielhost haben und auf diesem Host Perl installiert ist, können Sie das Perl-Skript tcplisten ausführen, das eine bestimmte Bannermeldung sendet, wenn es eine Verbindung annimmt.
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
Abbildung 4: Ausführung von tcplisten.pl auf einem Linux-System mit OpenVOS-Client
Da der OpenVOS-Telnet-Client das Terminalfenster löscht, wenn die Verbindung geschlossen wird, müssen Sie wahrscheinlich den Terminaltyp auf ascii setzen, um die Verbindungsnachricht zu sehen.
Sie können tcplisten auch unter OpenVOS ausführen (vorausgesetzt, Sie haben die gnu_library installiert).
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 ~]$
Abbildung 5: Ausführung von tcplisten.pl auf einem OpenVOS-System mit Linux-Client
Eine "refused"-Meldung zeigt an, dass Sie den Zielhost erreicht haben, aber dass er keinen Dienst hat, der auf diesen Port wartet - wahrscheinlich.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 12:31:28
Abbildung 6 - Ablehnung
Einige Firewalls können als Antwort auf eine nicht genehmigte Verbindungsanfrage einen Reset senden. Es ist sehr schwierig bis unmöglich festzustellen, welches Szenario vorliegt, zumindest auf der Client-Seite.
Wenn telnet eine Meldung erhält, dass das Netzwerk (Abbildung 7) oder der Host (Abbildung 8) unerreichbar ist, wird dies gemeldet. Die Meldung "network ... unreachable" zeigt an, dass entweder OpenVOS keine Route zum Zielnetzwerk hat oder ein Router in der Mitte des Netzwerks das Zielnetzwerk nicht erreichen konnte. Die Meldung "No route to host" zeigt an, dass der Router, der an das Zielnetzwerk angeschlossen ist, den Zielhost nicht erreichen konnte. Höchstwahrscheinlich bedeutet dies, dass der Zielhost nicht erreichbar ist.
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
Abbildung 7 - OpenVOS Telnet-Client meldet, dass das Netzwerk nicht erreichbar ist.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: No route to host.
ready 12:55:44
Abbildung 8 - OpenVOS-Telnet-Client meldet, dass der Host unerreichbar ist
Telnet meldet die Quelle dieser Fehler nicht. Das Perl-Skript tuc.pl (test UDP connection), das an dieselbe IP-Adresse und Portnummer gerichtet ist, meldet die Quell-IP-Adresse (siehe die folgende Diskussion über UDP-Tests)
Eine Zeitüberschreitung bedeutet, dass Sie den Host nicht erreichen können - wahrscheinlich. Die meisten Hosts werden entweder mit einer Verbindung oder einer Ablehnung antworten, aber wenn ein Host eine hostbasierte Firewall hat, kann es sein, dass er die Anfrage einfach fallen lässt, ohne zu antworten. Ebenso kann eine netzwerkbasierte Firewall die Anfrage einfach verwerfen, ohne zu antworten; und natürlich kann jede ICMP-Meldung, die von einem Router oder einem Host gesendet wird, auch von einem anderen Router oder einer Firewall verworfen werden.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The operation timed out.
Abbildung 9 - OpenVOS-Telnet-Client meldet eine Zeitüberschreitung
Zusammengefasst gibt es 5 mögliche Ergebnisse
Nachricht
Bedeutung
Verbunden (mit Banner)
Kann Host und Anwendung erreichen
Verbunden (kein Banner)
Kann Host und Anwendung erreichen - wahrscheinlich
Verweigert
Kann den Host erreichen, aber nicht die Anwendung - wahrscheinlich
Unerreichbar
Host kann nicht erreicht werden
Zeitüberschreitung
Host kann nicht erreicht werden - wahrscheinlich
Abbildung 10 - Zusammenfassung der Ergebnisse und Interpretationen für TCP-Verbindungen
Wenn die Anwendung einen UDP-Port verwendet, sind die Dinge komplizierter. Erstens gibt es unter OpenVOS keine Standard-Dienstprogramme für das Senden eines UDP-Datagramms. Zweitens kann eine Antwort entweder als UDP-Datagramm oder als ICMP-Nachricht zurückkommen. Das Perl-Skript tuc.pl (test UDP connection) sendet ein Datagramm mit der aktuellen Datumszeit an den angegebenen Host und Port. Es wartet dann entweder auf ein UDP-Datagramm oder eine ICMP-Nachricht. Im Idealfall gibt Ihre Anwendung eine Meldung zurück, die dann angezeigt wird. Abbildung 11 zeigt, dass die zuhörende Anwendung die vom Skript gesendete Nachricht als Echo wiedergibt.
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
Abbildung 11 - UDP-Server-Anwendung echot die empfangene Nachricht
Wenn der Server den Zielport nicht abhört, sollte er die Meldung "Zielport unerreichbar" zurücksenden. Wenn die Meldung von der Ziel-IP-Adresse empfangen wird, bedeutet dies, dass Sie den Server erreicht haben, aber keine Anwendung auf ihn wartet.
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
Abbildung 12 - Zielhost sendet eine Nachricht über einen nicht erreichbaren Port
Wie bei den Telnet-Tests können Sie ICMP-Meldungen erhalten, die auf Netzwerk- und Host-Probleme hinweisen, und wie bereits erwähnt, erhalten Sie die IP-Adresse des Absenders, so dass Sie einen eindeutigen Ausgangspunkt für Ihre Untersuchungen haben.
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
Abbildung 13 - Netzwerk- und Host-Unerreichbarkeitsmeldungen
Die oben genannten Fehler sind wahrscheinlich zwei der häufigsten. Ein anderer weist auf eine Routing-Schleife hin
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
Abbildung 14 - ICMP-Meldung, die eine Routing-Schleife anzeigt
Es gibt viele andere Fehler, von denen einige auf administrative Maßnahmen zur Verhinderung des Paketflusses hinweisen. Sie können ziemlich sicher sein, dass diese Meldungen auf eine Firewall hinweisen, die Ihre Pakete blockiert.
Viele Anwendungen erwarten jedoch eine speziell formatierte Nachricht. In diesem Fall werden Sie wahrscheinlich mit Schweigen konfrontiert werden. Standardmäßig wird das Skript nach 5 Sekunden eine Zeitüberschreitung verursachen und "keine Antwort" melden.
perl tuc.pl -i 172.16.1.116 -p 1830
No response was received from 172.16.1.116
ready 16:43:26
Abbildung 15 - keine Antwort
Wenn Sie länger (oder kürzer) warten wollen, können Sie die Option "-t" verwenden.
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
Abbildung 16 - Ändern des Standard-Timeouts
Stille ist nicht unbedingt schlecht. Es könnte bedeuten, dass Sie den Zielhost erreicht haben, dass er den Zielport abhört, aber dass er die gesendete Testnachricht nicht mochte. Leider kann es auch bedeuten, dass das Testpaket den Zielhost nie erreicht hat und dass alle ICMP-Nachrichten, die zurückgeschickt wurden, um dies anzuzeigen, blockiert wurden. Wenn Sie Zugriff auf den Server haben, können Sie das Perl-Skript udpecho.pl ausführen, das seinen eigenen Header anfügt und dann ein Echo der gesendeten Nachricht ausgibt (Abbildung 11).
Zusammengefasst
Nachricht
Bedeutung
Meldung im Anwendungsbanner
Kann Host und Anwendung erreichen
ICMP-Netz/Host-Meldung
Host kann nicht erreicht werden
ICMP-Port-Meldung vom Host
Kann den Host erreichen, aber nicht die Anwendung
Keine Antwort, Anwendung sendet Bannermeldung
Host kann nicht erreicht werden
Keine Antwort, die Anwendung sendet keine Bannernachricht
Kann den Host erreichen, muss es aber nicht
Abbildung 17 - Zusammenfassung der Ergebnisse und Interpretationen für UCP-Verbindungen

tcplisten.pl

# tcplisten.pl begins here

#

Version 1.00 10-07-30

# Dieses Skript wurde getestet auf

Öffnen Sie VOS 17.0.2ah mit Perl v5.8.0, das für i686-vos gebaut wurde.

Microsoft Windows XP Service Pack 3 läuft

ActiveState Perl v5.10.0 gebaut für MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 läuft

Perl v5.8.5 gebaut für x86_64-linux-thread-multi

#

[email protected]

#

IO::Socket verwenden;

verwenden Sie Getopt::Long;

Sys::Hostname verwenden;

streng verwenden;

my ($Ergebnis);

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

my ($newSock, $data);

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

message=s' => $message);

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

{

print "nnUsage:n";

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

Ausgang;

}

if (!defined ($message))

{

print "Keine Nachricht angegeben - Nachricht erstellen";

$message = "Verbindung akzeptiert von tcplisten, das auf " . hostname;

}

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

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

Proto => 'tcp',

LocalPort => $localPort,

LocalAddr => '0.0.0.0',

Hören => 1,

) oder die "Could not create socket for port $localPort: $!n";

während (1)

{

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

print "Verbunden akzeptiert von " . $newSock->peerhost .

" um " . localtime () . “n”;

print $newSock $message . “n”;

$newSock -> shutdown(2);

$sock->read($data, 1024); # warten, um eine Abschlussanzeige zu erhalten */

$newSock->close();

}

#

# tcplisten.pl endet hier

tuc.pl

# tuc.pl begins here

#

Version 1.00 10-07-30

# Dieses Skript wurde getestet auf

Öffnen Sie VOS 17.0.2ah mit Perl v5.8.0, das für i686-vos gebaut wurde.

Microsoft Windows XP Service Pack 3 läuft

ActiveState Perl v5.10.0 gebaut für MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 läuft

Perl v5.8.5 gebaut für x86_64-linux-thread-multi

#

[email protected]

#

IO::Socket verwenden;

IO::Select verwenden;

verwenden Sie Getopt::Long;

streng verwenden;

my ($Ergebnis);

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

my ($ready, $socket);

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

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

port=s' => $destPort,

'timeout=s' => $timeout);

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

{

print "nnUsage:n";

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

"-Port DESTINATION-PORT-NUMBERnn";

Ausgang;

}

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

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

" erscheint unangemessen lang.n"; }

$message = "gesendet von tuc.pl um " . localtime ();

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

Proto => 'udp',

PeerPort => $destPort,

PeerAddr => $destIP

) oder die "Could not create socket for destination $destIP: $!n";

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

Proto => 'icmp');

$sock->send($message) oder die "Sendefehler: $!n";

$Nachricht = "";

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;

if ($socket == $sock)

{

$x = "Antwort auf UDP-Socket empfangen von ";

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

if ($icmpAlready == 0)

{

if (Länge ($Nachricht) > 0)

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

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

}

}

else # icmp-Nachricht erhalten

{

$icmpAlready = 1;

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

if (Länge ($Nachricht) > 98)

{ print "Unerwartet lang (" . length ($message) .

") ICMP-Nachricht von " . $socket->peerhost .

" Nachricht: " . $message . “n”; }

elsif (length ($message) < 52)

{ print "Unerhört kurz (" . length ($message) .

") ICMP-Nachricht von " . $socket->peerhost . “n”; }

else # icmp-Nachricht verarbeiten

{

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

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

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

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

if ($port != $destPort)

{ print "Unerwartete ICMP-Nachricht erhalten von " .

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

“n”; }

else # icmp-Nachricht ist gut

{

if ($type == 3)

{

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

"Unerreichbare Nachricht erhalten von " .

$socket->peerhost . “n”; }

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

"Unerreichbare Nachricht erhalten von " .

$socket->peerhost . “n”; }

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

"Unerreichbare Nachricht erhalten von " .

$socket->peerhost . “n”; }

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

"Unbekannte Nachricht erhalten von " .

$socket->peerhost . “n”; }

elsif ($code == 7) { print "ICMP Zielhost unbekannt " .

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

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

"Nachricht erhalten von " .

$socket->peerhost . “n”; }

elsif ($code == 9) { print "ICMP Netzwerk administrativ " .

"verbotene Nachricht erhalten von " .

$socket->peerhost . “n”; }

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

"verbotene Nachricht erhalten von " .

$socket->peerhost . “n”; }

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

"TOS-Nachricht erhalten von " .

$socket->peerhost . “n”; }

elsif ($code == 12) { print "ICMP Host unerreichbar für " .

"TOS-Nachricht erhalten von " .

$socket->peerhost . “n”; }

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

"administrativ verbotene Nachricht erhalten von " .

$socket->peerhost . “n”; }

else { print "Unerwartete ICMP-Nachricht empfangen Typ = " .

$type . ", code = " . $code . " von " .

$socket->peerhost . “n”; }

} # if ($type == 3)

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

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

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

else { print "Unerwartete ICMP-Nachricht empfangen Typ = " .

$type . ", code = " . $code . " von " .

$socket->peerhost . “n”; }

} # else # icmp-Nachricht ist gut

} # else # icmp-Nachricht verarbeiten

} # else #icmp Nachricht erhalten

} # foreach $socket (@$ready)

if ($c == 0) { print "Es wurde keine Antwort empfangen von " .

$sock->peerhost . “n”; }

#

# tuc.pl endet hier

udpecho.pl

# udpecho.pl begins here

#

Version 1.00 10-07-30

# Dieses Skript wurde getestet auf

Öffnen Sie VOS 17.0.2ah mit Perl v5.8.0, das für i686-vos gebaut wurde.

Microsoft Windows XP Service Pack 3 läuft

ActiveState Perl v5.10.0 gebaut für MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 läuft

Perl v5.8.5 gebaut für x86_64-linux-thread-multi

#

[email protected]

#

IO::Socket verwenden;

IO::Select verwenden;

verwenden Sie Getopt::Long;

streng verwenden;

my ($Ergebnis);

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

my ($ready, $socket);

my ($x, $c);

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

debug' => $debug);

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

{

print "nnUsage:n";

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

Ausgang;

}

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

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

Proto => 'udp',

LocalPort => $localPort

) oder sterben Sie "Could not create socket $!n";

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

$read_set->add($sock);

$Nachricht = "";

während (1)

{

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

foreach $socket (@$ready)

{

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

if (defined ($debug)) { print "Nachricht von " . $socket->peerhost .

" Nachricht: " . $message . “n”; }

$socket->send("echoed by udpecho.pl: " . $message) oder die "Sendefehler: $!

+n”;

}

}

#

# udpecho.pl endet hier

© 2024 Stratus Technologies.