Pular para o conteúdo principal
Seu aplicativo está relatando problemas para acessar o servidor de banco de dados back-end em 172.16.1.116 ou talvez você esteja prestes a configurar um novo aplicativo e queira ter certeza de que ele pode acessar o servidor de banco de dados back-end. A primeira ferramenta que vem à mente é o ping, mas muitos hosts não respondem mais às solicitações de eco ICMP (ping) e, entre aqueles que respondem, há uma grande probabilidade de que seus firewalls de rede bloqueiem suas solicitações de ping ou suas respostas. Se o ping expirar (figura 1), existem outras maneiras de testar a conectividade da 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 limite do ping
Supondo que o host que você está tentando acessar esteja executando um serviço baseado em TCP (em oposição a UDP), você pode simplesmente fazer telnet para o host e especificar o número da porta do serviço. Existem quatro respostas possíveis: uma conexão (figura 2), uma recusa (figura 6), uma indicação de que algo está errado (figuras 7 e 8) ou um tempo limite (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 host – provavelmente. Alguns aceleradores WAN interceptam a conexão e a completam, atuando como um proxy. Se você se conectar e, alguns segundos depois, se desconectar, pode ser que você tenha se conectado ao acelerador e, em seguida, o acelerador não conseguiu se conectar ao destino final, então ele se desconectou de você. É claro que também pode ser que você tenha se conectado ao host real e o aplicativo tenha travado. Vale a pena saber se você está usando algum hardware acelerador e exatamente como ele funciona.
Para se desconectar, digite control-] e “quit” no prompt telnet>.
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ê acessou o serviço correto em execução no host de destino é se esse serviço responder à solicitação 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 de destino e esse host tiver o Perl instalado, você pode executar o script Perl tcplisten, que enviará uma mensagem de banner especificada quando 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 Executando o tcplisten.pl no sistema Linux com o cliente OpenVOS
Como o cliente telnet OpenVOS limpa a janela do terminal quando a conexão é encerrada, provavelmente será necessário definir o tipo de terminal como ascii para ver a mensagem de conexão.
Você também pode executar o tcplisten no OpenVOS (supondo que você tenha a biblioteca 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 Executando o tcplisten.pl no sistema OpenVOS com cliente Linux
Uma mensagem “recusado” indica que você alcançou o host de destino, mas que ele não tinha um serviço escutando nessa 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 uma reinicialização em resposta a uma solicitação de conexão não aprovada. É muito difícil, ou mesmo impossível, saber qual cenário está ocorrendo, pelo menos do lado do cliente.
Se o telnet receber uma indicação de que a rede (figura 7) ou o host (figura 8) estão inacessíveis, ele reportará isso. A mensagem “rede... inacessível” indica que o OpenVOS não tem uma rota para a rede de destino ou que algum roteador no meio da rede não conseguiu acessar a rede de destino. A mensagem “Sem rota para o host” indica que o roteador conectado à rede de destino não conseguiu acessar o host de destino. Provavelmente, isso significa que o host de destino está inoperante.
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 telnet OpenVOS informando que a rede está inacessí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 telnet OpenVOS informando que o host está inacessível
O Telnet não informará a origem desses erros. O script Perl tuc.pl (teste de conexão UDP) direcionado para o mesmo endereço IP e número de porta informará o endereço IP de origem (consulte a discussão a seguir sobre testes UDP).
Um tempo limite indica que você não consegue acessar o host – provavelmente. A maioria dos hosts responderá com uma conexão ou uma recusa, mas se um host tiver um firewall baseado em host, ele poderá simplesmente descartar a solicitação sem responder. Da mesma forma, um firewall baseado em rede pode simplesmente descartar a solicitação sem responder; e, é claro, quaisquer mensagens ICMP enviadas por um roteador ou host também podem ser descartadas 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 telnet OpenVOS relatando um tempo limite
Em resumo, há 5 resultados possíveis
Mensagem
Significado
Conectado (com banner)
Pode acessar o host e o aplicativo
Conectado (sem banner)
Pode acessar o host e o aplicativo – provavelmente
Recusado
Consegue acessar o host, mas não o aplicativo – provavelmente
Inacessível
Não é possível acessar o host
Tempo limite
Não é possível acessar o host – provavelmente
Figura 10 – resumo dos resultados e interpretações para conexões TCP
Se o aplicativo usa uma porta UDP, as coisas ficam mais complicadas. Primeiro, não há utilitários padrão no OpenVOS para enviar um datagrama UDP. Segundo, uma resposta pode retornar como um datagrama UDP ou uma mensagem ICMP. O script Perl tuc.pl (teste de conexão UDP) enviará um datagrama contendo a data e hora atuais para o host e a porta especificados. Em seguida, ele aguarda um datagrama UDP ou uma mensagem ICMP. Idealmente, seu aplicativo retornará uma mensagem que será exibida. A Figura 11 mostra que o aplicativo em escuta repetiu 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 – O aplicativo servidor UDP repete a mensagem recebida
Se o servidor não estiver escutando na porta de destino, ele deverá enviar uma mensagem de “porta de destino inacessível”. Supondo que a mensagem seja recebida do endereço IP de destino, isso significa que você alcançou o servidor, mas nenhum aplicativo 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 – host de destino enviando uma mensagem de porta inacessível
Assim como nos testes telnet, você pode receber mensagens ICMP indicando problemas de rede e host e, conforme mencionei acima, você obtém o endereço IP do remetente, o que lhe dá 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 – mensagens de rede e host 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 uma ação administrativa para impedir o fluxo de pacotes. Você pode ter certeza de que essas mensagens indicam que um firewall está bloqueando seus pacotes.
No entanto, muitos aplicativos esperam uma mensagem com formatação específica. Nesse caso, você provavelmente não obterá resposta. Por padrão, o script expirará após 5 segundos e informará “sem 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 tempo (ou menos tempo), 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ê alcançou o host de destino, que ele está escutando na porta de destino, mas simplesmente não gostou da mensagem de teste enviada. Infelizmente, também pode significar que o pacote de teste nunca chegou ao host de destino e que todas as mensagens ICMP enviadas de volta para indicar isso foram bloqueadas. Se você tiver acesso ao servidor, pode executar o script Perl udpecho.pl, que anexará seu próprio cabeçalho e, em seguida, repetirá tudo o que foi enviado a ele (figura 11).
Em resumo
Mensagem
Significado
Mensagem do banner do aplicativo
Pode acessar o host e o aplicativo
Mensagem de rede/host ICMP
Não é possível acessar o host
Mensagem da porta ICMP do host
Consegue acessar o host, mas não o aplicativo
Sem resposta, o aplicativo envia uma mensagem de banner
Não é possível acessar o host
Sem resposta, o aplicativo não envia mensagem de banner
Pode ou não ser possível acessar o host
Figura 17 – resumo dos resultados e interpretações para conexões UCP

tcplisten.pl

# tcplisten.pl begins here

#

# Versão 1.00 30-07-2010

# Este script foi testado em

# Abrir o VOS 17.0.2ah executando o Perl v5.8.0 compilado para i686-vos

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

# ActiveState Perl v5.10.0 compilado para MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 em execução

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

#

[email protected]

#

use IO::Socket;

use Getopt::Long;

use Sys::Hostname;

use strict;

meu ($resultado);

minha ($portaLocal, $mensagem, $endereçoDoParceiro);

minha ($novaMeia, $dados);

$result = GetOptions (‘port=s’ => $localPort,

'message=s' => $message);

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

{

imprimir “nnUtilização:n”;

imprimir “tperl tcplisten.pl -port NÚMERO-DA-PORTA [-message MENSAGEM]nn”;

sair;

}

se (!definido ($mensagem))

{

imprimir “Nenhuma mensagem especificada – criando mensagem”;

$message = “Conexão aceita pelo tcplisten em execução 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’,

Ouvir => 1,

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

enquanto (1)

{

minha $novaMeia = $meia->aceitar();

imprimir “Conexão aceita de ” . $newSock->peerhost .

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

imprimir $newSock $mensagem . “n”;

$newSock -> desligar(2);

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

$newSock->close();

}

#

# tcplisten.pl termina aqui

tuc.pl

# tuc.pl begins here

#

# Versão 1.00 30-07-2010

# Este script foi testado em

# Abrir o VOS 17.0.2ah executando o Perl v5.8.0 compilado para i686-vos

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

# ActiveState Perl v5.10.0 compilado para MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 em execução

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

#

[email protected]

#

use IO::Socket;

use IO::Select;

use Getopt::Long;

use strict;

meu ($resultado);

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

my ($pronto, $soquete);

my ($x, $c, $icmpJá);

$result = GetOptions (‘ip=s’ => $destIP,

'port=s' => $destPort,

'timeout=s' => $timeout);

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

{

imprimir “nnUtilização:n”;

imprimir “tperl tuc.pl -ip ENDEREÇO-IP-DE-DESTINO ” .

“-port DESTINO-NÚMERO-DA-PORTA”;

sair;

}

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

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

” parece excessivamente longo.n”; }

$message = “enviado por tuc.pl às ” . localtime();

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

Proto => ‘udp’,

Porta do par => $destPort,

PeerAddr => $destIP

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

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

Proto => 'icmp');

$sock->enviar($mensagem) ou morrer “Erro ao enviar: $!n”;

$mensagem = “”;

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

$read_set->adicionar($sock);

$read_set->add($isock);

($pronto) = IO::Select->selecionar($conjunto_de_leitura, indefinido, indefinido, $tempo_limite);

$icmpJá = 0;

$c = 0;

foreach $socket (@$pronto)

{

$c = $c + 1;

se ($socket == $sock)

{

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

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

se ($icmpAlready == 0)

{

se (comprimento ($mensagem) > 0)

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

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

}

}

caso contrário # mensagem icmp recebida

{

$icmpJá = 1;

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

se (comprimento ($mensagem) > 98)

{ imprimir “Inesperadamente longo (” . comprimento ($mensagem) .

“) Mensagem ICMP de ” . $socket->peerhost .

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

elsif (length ($message) < 52)

{ imprimir “Inesperadamente curto (” . comprimento ($mensagem) .

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

caso contrário, processar mensagem icmp

{

meu $tipo = ord (substr ($mensagem, 20, 1));

meu $código = ord (substr ($mensagem, 21, 1));

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

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

se ($porta != $portaDestino)

{ imprimir “Mensagem ICMP inesperada recebida de ” .

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

“n”; }

caso contrário, a mensagem icmp está correta

{

se ($tipo == 3)

{

if ($code == 0) { print “Rede de destino ICMP ” .

“mensagem inacessível recebida de ” .

$socket->peerhost . “n”; }

elsif ($code == 1) { imprimir “Host de destino ICMP ” .

“mensagem inacessível recebida de ” .

$socket->peerhost . “n”; }

elsif ($code == 3) { imprimir “Porta de destino ICMP ” .

“mensagem inacessível recebida de ” .

$socket->peerhost . “n”; }

elsif ($code == 6) { imprimir “Rede de destino ICMP ” .

“mensagem desconhecida recebida de ” .

$socket->peerhost . “n”; }

elsif ($code == 7) { imprimir “ICMP Destino host desconhecido ” .

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

elsif ($code == 8) { imprimir “Host de origem ICMP isolado ” .

“mensagem recebida de ” .

$socket->peerhost . “n”; }

elsif ($code == 9) { print “ICMP Rede administrativamente ” .

“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 “Rede ICMP inacessível para ” .

“Mensagem TOS recebida de ” .

$socket->peerhost . “n”; }

elsif ($code == 12) { print “Host ICMP inacessível para ” .

“Mensagem TOS recebida de ” .

$socket->peerhost . “n”; }

elsif ($code == 13) { print “Comunicação ICMP ” .

“mensagem administrativamente proibida recebida de ” .

$socket->peerhost . “n”; }

else { imprimir “Mensagem ICMP inesperada recebida tipo = ” .

$tipo . “, código = ” . $código . ” de ” .

$socket->peerhost . “n”; }

} # se ($tipo == 3)

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

{ imprimir “Tempo ICMP excedido, TTL expirou em trânsito”.

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

else { imprimir “Mensagem ICMP inesperada recebida tipo = ” .

$tipo . “, código = ” . $código . ” de ” .

$socket->peerhost . “n”; }

} # caso contrário # a mensagem icmp está correta

} # else # processar mensagem icmp

} # else #mensagem icmp recebida

} # para cada $socket (@$pronto)

if ($c == 0) { print “Nenhuma resposta foi recebida de ” .

$sock->peerhost . “n”; }

#

# tuc.pl termina aqui

udpecho.pl

# udpecho.pl begins here

#

# Versão 1.00 30-07-2010

# Este script foi testado em

# Abrir o VOS 17.0.2ah executando o Perl v5.8.0 compilado para i686-vos

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

# ActiveState Perl v5.10.0 compilado para MSWin32-x86-multi-thread

# Red Hat Linux 4AS-5.5 em execução

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

#

[email protected]

#

use IO::Socket;

use IO::Select;

use Getopt::Long;

use strict;

meu ($resultado);

my ($porta_local, $depuração, $resultado, $mensagem, $sinalizadores);

my ($pronto, $soquete);

meu ($x, $c);

$result = GetOptions (‘port=s’ => $localPort,

'debug' => $debug);

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

{

imprimir “nnUtilização:n”;

imprimir “tperl udpecho.pl -port NÚMERO-DA-PORTA-LOCAL [-debug]nn”;

sair;

}

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

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

Proto => ‘udp’,

PortaLocal => $portaLocal

) ou morrer “Não foi possível criar o soquete $!n”;

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

$read_set->adicionar($sock);

$mensagem = “”;

enquanto (1)

{

($pronto) = IO::Select->selecionar($conjunto_de_leitura, indefinido, indefinido, 300);

foreach $socket (@$pronto)

{

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

if (definido ($debug)) { imprimir “Mensagem de ” . $socket->peerhost .

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

$socket->send("ecoado por udpecho.pl: " . $message) ou morra "Erro de envio: $!"

+n”;

}

}

#

# udpecho.pl termina aqui

© 2024 Stratus Technologies.