Pular para o conteúdo principal
Sua aplicação está relatando problemas para chegar ao servidor de banco de dados back end em 172.16.1.116 ou talvez você esteja prestes a configurar uma nova aplicação e quer ter certeza de que ela pode chegar ao servidor de banco de dados back end. A primeira ferramenta que vem à mente é o ping, mas muitos hosts não responderão mais aos pedidos ICMP echo (ping) e daqueles que o fazem há uma alta probabilidade de que suas firewalls de rede bloqueiem seus pedidos de ping ou suas respostas. Se o ping times out (figura 1), há outras maneiras de testar a conectividade de rede.
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 - tempo de ping out
Assumindo que o host que você está tentando alcançar está executando um serviço baseado em TCP (em oposição ao UDP), você pode simplesmente indicar ao host e especificar o número da porta do serviço. Há 4 respostas possíveis, uma conexão (figura 2) uma recusa (figura 6), uma indicação de algo errado (figuras 7 e 8) ou um timeout (figura 9).
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
Figura 2 - conexão
Uma mensagem "Conectado" indica que você está conectado ao anfitrião - provavelmente. Alguns aceleradores WAN irão interceptar a conexão e completá-la, atuando como um proxy. Se você for conectado e, alguns segundos depois, desconectado, pode ser que você tenha se conectado ao acelerador e, em seguida, o acelerador não tenha conseguido se conectar ao destino final, então ele se desconectou de você. É claro que também pode ser que você se conecte ao host real e o aplicativo tenha falhado. Vale a pena saber se você está usando algum hardware do acelerador e exatamente como ele funciona.
Para desconectar o controle de tipo -] e "desistir" no telnet> prompt.
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
telnet> quit
Figura 3 - desconectando uma sessão conectada
A única maneira de ter certeza absoluta de que você atingiu o serviço correto executado no host alvo é se esse serviço responder ao pedido de conexão com algum tipo de mensagem de banner. Por exemplo, um prompt de login identificando o host. Se você tiver acesso ao host alvo e esse host tiver o Perl instalado, você pode executar o script tcplisten Perl que enviará uma mensagem de banner especificada quando ele aceitar uma conexão.
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 rodando o tcplisten.pl no sistema Linux com o cliente OpenVOS
Porque o cliente OpenVOS telnet limpará a janela do terminal quando a conexão fechar, você provavelmente precisará ajustar seu tipo de terminal para ascii para ver a mensagem de conexão.
Você também pode executar tcplisten no OpenVOS (assumindo que você tenha a 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 rodando tcplisten.pl no sistema OpenVOS com cliente Linux
Uma mensagem "recusada" indica que você alcançou o anfitrião alvo, mas que ele não tinha um serviço de escuta naquela porta - provavelmente.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 12:31:28
Figura 6 - recusa
Alguns firewalls podem enviar um reset em resposta a um pedido de conexão não aprovado. É muito difícil dizer qual cenário está ocorrendo, pelo menos do lado do cliente.
Se a telnet receber uma indicação de que a rede (figura 7) ou o host (figura 8) é inalcançável, ela relatará isso. A mensagem "rede ... inalcançável" indica que ou a OpenVOS não tem uma rota para a rede alvo ou algum roteador no meio da rede não pôde alcançar a rede de destino. A mensagem "No route to host" indica que o roteador anexado à rede de destino não pôde alcançar o host de destino. É mais do que provável que isto signifique que o host alvo está em baixo.
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 OpenVOS telnet relatando que a rede é inatingível.
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 OpenVOS telnet relatando que o host é inalcançável
A Telnet não relatará a fonte desses erros. O tuc.pl (testar conexão UDP) script Perl direcionado para o mesmo endereço IP e número de porta irá relatar o endereço IP de origem (veja a seguinte discussão sobre o teste UDP)
Um timeout indica que você não pode chegar ao anfitrião - provavelmente. A maioria dos anfitriões responderá com uma conexão ou uma recusa, mas se um anfitrião tiver um firewall baseado no anfitrião, ele pode simplesmente abandonar a solicitação sem responder. Da mesma forma, um firewall baseado na rede pode simplesmente abandonar a solicitação sem responder; e, claro, qualquer mensagem ICMP enviada por um roteador ou um host pode também ser abandonada por outro roteador ou firewall.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The operation timed out.
Figura 9 - Cliente OpenVOS telnet reportando um timeout
Em resumo, há 5 resultados possíveis
Mensagem
Significado
Conectado (com banner)
Pode alcançar o anfitrião e a aplicação
Conectado (sem banner)
Pode chegar ao hospedeiro e à aplicação - provavelmente
Recusado
Pode chegar ao hospedeiro, mas não à aplicação - provavelmente
Inacessível
Não é possível chegar ao anfitrião
Desconto de tempo
Não é possível chegar ao anfitrião - provavelmente
Figura 10 - resumo dos resultados e interpretações das conexões TCP
Se a aplicação utiliza um porto UDP, as coisas são mais complicadas. Primeiro, não há utilitários padrão no OpenVOS para o envio de um datagrama UDP. Segundo, uma resposta pode voltar como um datagrama UDP ou como uma mensagem ICMP. O tuc.pl (test UDP connection) Perl script enviará um datagrama contendo a data/hora atual para o host e porta especificados. Em seguida, ele aguarda um datagrama UDP ou uma mensagem ICMP. O ideal é que seu aplicativo retorne uma mensagem que será então exibida. A Figura 11 mostra que a aplicação de escuta ecoou a mensagem enviada pelo 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 - Mensagem de eco de aplicação de servidor UDP recebida
Se o servidor não estiver ouvindo na porta de destino, ele deve enviar de volta uma mensagem "porto de destino inalcançável". Assumindo que a mensagem seja recebida do endereço IP de destino, isto significa que você alcançou o servidor, mas nenhuma aplicação estava escutando.
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 - hospedeiro alvo enviando uma mensagem de porto inalcançável
Como os testes telnet, você pode obter mensagens ICMP indicando problemas de rede e de host e, como discuti acima, você obtém o endereço IP dos remetentes para que tenha um ponto de partida mais definido para iniciar suas investigações.
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 - rede e hospedar mensagens inacessíveis
Os erros acima são provavelmente dois dos mais comuns. Outro indica um loop de roteamento
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 - Mensagem ICMP indicando um loop de roteamento
Existem muitos outros erros, alguns que indicam ações administrativas para evitar o fluxo de pacotes. Você pode ter certeza de que estas mensagens indicam um firewall bloqueando seus pacotes.
Entretanto, muitas aplicações esperam uma mensagem especificamente formatada. Nesse caso, você provavelmente me encontrará com o silêncio. Por padrão, o script irá parar após 5 segundos e reportar "nenhuma resposta".
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 - sem resposta
Se você quiser esperar mais (ou menos), você pode usar a opção "-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 - alterando o tempo limite padrão
O silêncio não é necessariamente ruim. Pode significar que você atingiu o anfitrião alvo, ele está escutando na porta alvo mas simplesmente não gostou da mensagem de teste que foi enviada. Infelizmente, isso também pode significar que o pacote de teste nunca chegou ao hospedeiro alvo e que qualquer mensagem ICMP enviada de volta para indicar que estava bloqueada. Se você tiver acesso ao servidor você pode executar o script udpecho.pl Perl que anexará seu próprio cabeçalho e então ecoará o que quer que tenha sido enviado a ele (figura 11).
Em resumo
Mensagem
Significado
Mensagem em banner de aplicação
Pode alcançar o anfitrião e a aplicação
Rede ICMP/mensagem do anfitrião
Não é possível chegar ao anfitrião
Mensagem de porta ICMP do anfitrião
Pode chegar ao host mas não à aplicação
Sem resposta, aplicação envia mensagem de banner
Não é possível chegar ao anfitrião
Sem resposta, a aplicação não envia mensagem de banner
Pode ou não ser capaz de alcançar o anfitrião
Figura 17 - resumo dos resultados e interpretações para conexões UCP

tcplisten.pl

# tcplisten.pl begins here

#

# Versão 1.00 10-07-30

# Este roteiro foi testado em

# Aberto VOS 17.0.2ah rodando Perl v5.8.0 construído para i686-vos

# Microsoft Windows XP Service Pack 3 em execução

# ActiveState Perl v5.10.0 construído para MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 rodando

# Perl v5.8.5 construído para x86_64-linux-fios-multi

#

# noah.davids@stratus.com

#

use IO::Socket;

use Getopt::Long;

usar Sys::Hostname;

usar rigorosamente;

meu ($resultado);

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

meus ($newSock, $data);

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

message=s' => $message);

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

{

imprimir "nnUsage:n";

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

saída;

}

se (!defined ($message))

{

imprimir "Nenhuma mensagem especificada - criação de mensagem";

$message = "Conexão aceita por tcplisten correndo em " . hostname;

}

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

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

Proto => 'tcp',

LocalPort => $localPort,

LocalAddr => '0.0.0.0.0',

Ouça => 1,

) ou morrer "Não foi possível criar soquete para porta $localPort: $!n";

enquanto (1)

{

minha meia-nova = $sock->accept ();

imprimir "Connected accepted from " . $newSock->peerhost .

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

imprimir $newSock $message . "“n”;

$newSock -> shutdown(2);

$sock->read($data, 1024); # esperar para obter uma indicação próxima */

$newSock->close();

}

#

# tcplisten.pl termina aqui

tuc.pl

# tuc.pl begins here

#

# Versão 1.00 10-07-30

# Este roteiro foi testado em

# Aberto VOS 17.0.2ah rodando Perl v5.8.0 construído para i686-vos

# Microsoft Windows XP Service Pack 3 em execução

# ActiveState Perl v5.10.0 construído para MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 rodando

# Perl v5.8.5 construído para x86_64-linux-fios-multi

#

# noah.davids@stratus.com

#

use IO::Socket;

use IO::Selecionar;

use Getopt::Long;

usar rigorosamente;

meu ($resultado);

meu ($destIP, $destPort, $timeout, $resultado, $message, $flags);

meu ($ready, $socket);

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

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

port=s' => $destPort,

timeout=s' => $timeout);

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

{

imprimir "nnUsage:n";

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

"-port DESTINO-PORT-PORT-NUMBERnn";

saída;

}

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

elsif ($timeout > 15) { imprimir "OK, mas" . $timeout .

" parece exageradamente longo.n"; }

$message = "enviado por tuc.pl at " . local time ();

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

Proto => 'udp',

PeerPort => $destPort,

PeerAddr => $destIP

) ou morrer "Não foi possível criar soquete para o destino $destIP: $!n";

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

Proto => 'icmp');

$sock->send($message) ou die "Enviar erro: $!n";

$message = "";

meu $read_set = novo 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;

se ($socket == $sock)

{

$x = "Resposta recebida no soquete UDP de";

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

se ($icmpAlready == 0)

{

se (comprimento ($message) > 0)

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

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

}

}

outra mensagem # icmp recebida

{

$icmpAlready = 1;

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

se (comprimento ($message) > 98)

{ imprimir "Unexpectedly long (" . comprimento ($message) .

"Mensagem ICMP de " . $socket->peerhost .

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

elsif (length ($message) < 52)

{ imprimir "Unexpecedly short (" . comprimento ($message) .

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

outra # mensagem de processo icmp

{

meu tipo $ = ord (substrato ($message, 20, 1));

meu código $code = ord (substrato ($message, 21, 1));

meu porto de $ = ord (substrato ($message, 50, 1)) * 256 +

ord (sub-mensagem ($message, 51, 1));

se ($port != $destPort)

{ imprimir "Mensagem inesperada do ICMP recebida de" .

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

"“n”; }

senão # a mensagem icmp é boa

{

se ($type == 3)

{

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

"mensagem inalcançável recebida de" .

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

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

"mensagem inalcançável recebida de" .

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

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

"mensagem inalcançável recebida de" .

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

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

"mensagem desconhecida recebida de" .

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

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

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

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

"mensagem recebida de" .

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

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

"mensagem proibida recebida de" .

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

elsif ($code == 10) { imprimir "ICMP Host administrativamente" .

"mensagem proibida recebida de" .

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

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

"Mensagem TOS recebida de" .

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

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

"Mensagem TOS recebida de" .

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

elsif ($code == 13) { imprimir "ICMP Comunicação" .

"mensagem administrativamente proibida recebida de" .

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

senão { imprimir "Unexpected ICMP message received type = " .

Tipo $ . "código = " . $código . " de " .

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

} # se ($type == 3)

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

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

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

senão { imprimir "Unexpected ICMP message received type = " .

Tipo $ . "código = " . $código . " de " .

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

} # else # a mensagem icmp é boa

} # else # processar mensagem icmp

} # outra mensagem #icmp recebida

} # foreach $socket (@$ready)

if ($c == 0) { print "No response was received from " .

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

#

# tuc.pl termina aqui

udpecho.pl

# udpecho.pl begins here

#

# Versão 1.00 10-07-30

# Este roteiro foi testado em

# Aberto VOS 17.0.2ah rodando Perl v5.8.0 construído para i686-vos

# Microsoft Windows XP Service Pack 3 em execução

# ActiveState Perl v5.10.0 construído para MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 rodando

# Perl v5.8.5 construído para x86_64-linux-fios-multi

#

# noah.davids@stratus.com

#

use IO::Socket;

use IO::Selecionar;

use Getopt::Long;

usar rigorosamente;

meu ($resultado);

meu ($localPort, $debug, $resultado, $message, $flags);

meu ($ready, $socket);

meu ($x, $c);

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

debug' => $debug);

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

{

imprimir "nnUsage:n";

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

saída;

}

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

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

Proto => 'udp',

LocalPort => $localPort

) ou morrer "Não pôde criar soquete $!n";

meu $read_set = novo IO::Select();

$read_set->add($sock);

$message = "";

enquanto (1)

{

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

foreach $socket (@$ready)

{

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

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

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

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

+n”;

}

}

#

# udpecho.pl termina aqui

© 2020 Stratus Technologies.