comandos Unix como de ping, ssh, funcionam bem, mas os programas baseados em soquete estão falhando em conexão
Pergunta
Eu recebi um telefonema de um testador de cerca de uma máquina que estava falhando o nosso software. Quando examinei a máquina problema, logo percebi que o problema era bastante baixo nível: o tráfego de rede de entrada funciona bem. comando básico de saída como de ping e ssh estão funcionando bem, mas qualquer coisa que envolva a chamada connect()
está falhando com "No route to host".
Por exemplo - em essa máquina em particular este programa irá falhar na declaração connect()
para qualquer endereço IP diferente do 127.0.0.1
:
#!/usr/bin/perl -w
use strict;
use Socket;
my ($remote,$port, $iaddr, $paddr, $proto, $line);
$remote = shift || 'localhost';
$port = shift || 2345; # random port
if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
die "No port" unless $port;
$iaddr = inet_aton($remote) || die "no host: $remote";
$paddr = sockaddr_in($port, $iaddr);
$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
connect(SOCK, $paddr) || die "connect: $!";
while (defined($line = <SOCK>)) {
print $line;
}
close (SOCK) || die "close: $!";
exit;
Todas as sugestões sobre onde esta máquina está quebrada? Está funcionando SUSE-10.2.
Solução
Gostaria de verificar a configuração de firewall nessa máquina. É possível para iptables (acho que o seu SUSE tem iptables firewall) para ser configurado para permitir que trough única pacotes ping ICMP.
Outras dicas
É o firewall desativado?
Firewall é sempre possível, mas não dizer que ssh pode se conectar, de modo que parece improvável. Eu diria que ter um olhar para as rotas (comando "route" no Linux), e certifique-se que você não tem como duas rotas padrão, ou aqueles estranhos ou qualquer outra coisa. Apesar de tudo, diria que de ping de teste e ssh e seu programa no mesmo IP distante, e se todos eles falham, você tem um problema de rota. Se apenas o seu programa falhar, você provavelmente tem tanto um problema de firewall ou problema programa :)
Tente apontando connect () para o mesmo host: porta onde a obras de comando SSH. Além disso, mantenha em mente que alguns firewalls podem aplicar regras diferentes para diferentes contas de usuário (e às vezes para diferentes executáveis). Portanto, certifique-se de executar ssh e seu aplicativo de teste sob a mesma conta de usuário e que SUID não está definido para SSH.