I comandi Unix come ping, ssh funzionano bene ma i programmi basati su socket non riescono a connettersi

StackOverflow https://stackoverflow.com/questions/96113

  •  01-07-2019
  •  | 
  •  

Domanda

Ho ricevuto una chiamata da un tester riguardo a una macchina che non funzionava con il nostro software.Quando ho esaminato la macchina problematica, ho subito capito che il problema era di livello piuttosto basso:Il traffico di rete in entrata funziona correttamente.I comandi in uscita di base come ping e ssh funzionano bene, ma qualsiasi cosa coinvolga il file connect() la chiamata non riesce con "Nessun percorso verso l'host".

Ad esempio, su questa particolare macchina questo programma fallirà su connect() dichiarazione per qualsiasi indirizzo IP diverso da 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;

Qualche suggerimento su dove è rotta questa macchina?È in esecuzione SUSE-10.2.

È stato utile?

Soluzione

Vorrei controllare la configurazione del firewall su quella macchina.È possibile che iptables (immagino che il tuo SUSE abbia un firewall iptables) sia configurato per consentire solo il ping dei pacchetti ICMP.

Altri suggerimenti

Il firewall è disattivato?

Il firewall è sempre possibile, ma dice che ssh può connettersi, quindi sembra improbabile.Direi di dare un'occhiata ai percorsi (comando "route" su Linux) e di assicurarti di non avere due percorsi predefiniti, o strani o altro.Tutto sommato direi di testare ping e ssh e il tuo programma sullo stesso IP distante e, se falliscono tutti, hai un problema di percorso.Se solo il tuo programma fallisce, probabilmente hai un problema con il firewall o con il programma :)

Prova a puntare connect() allo stesso host:port su cui funziona il tuo comando SSH.Inoltre, tieni presente che alcuni firewall possono applicare regole diverse per account utente diversi (e talvolta per eseguibili diversi).Pertanto, assicurati di eseguire ssh e la tua app di prova con lo stesso account utente e che SUID non sia impostato per SSH.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top