Unix-Befehle wie ping, ssh, funktionieren gut, aber Socket-basierte Programme schlagen fehl

Ich erhielt einen Anruf von einem Tester über eine Maschine, die unsere Software nicht funktionierte. Als ich das Problemgerät untersuchte, erkannte ich schnell, dass das Problem ziemlich niedrig war: Eingehender Netzwerkverkehr funktioniert gut. Grundlegende ausgehende Befehle wie ping und ssh funktionieren einwandfrei, aber alles, was den Aufruf connect() betrifft, schlägt mit "No route to host" fehl.

Zum Beispiel - auf dieser bestimmten Maschine scheitert dieses Programm in der connect() -Anweisung für eine andere IP-Adresse als 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 = )) {
    print $line;
}

close (SOCK)        || die "close: $!";
exit;

Irgendwelche Vorschläge, wo diese Maschine kaputt ist? Es läuft SUSE-10.2.

0
hinzugefügt bearbeitet
Ansichten: 8

4 Antworten

Ich würde die Firewall-Konfiguration auf diesem Computer überprüfen. Es ist möglich, dass iptables (ich nehme an, dass Ihre SUSE die iptables-Firewall hat) so eingerichtet ist, dass nur ICMP-Pakete gepingt werden.

0
hinzugefügt
Jau! Ich denke du hast es richtig - aber auf der falschen Maschine. Nachdem ich darüber nachgedacht hatte, versuchte ich, die iptables auf der Maschine zu deaktivieren, die ich "funktionierte" und die Maschine, die "kaputt" war, begann zu arbeiten! Vielen Dank!
hinzugefügt der Autor Mike Heinz, Quelle

Ist die Firewall ausgeschaltet?

0
hinzugefügt
Die Firewall auf der anderen Maschine scheint das Problem gewesen zu sein. Danke für die Vorschläge!
hinzugefügt der Autor Mike Heinz, Quelle

Firewall ist immer möglich, aber es sagt, dass ssh eine Verbindung herstellen kann, so dass dies unwahrscheinlich erscheint. Ich würde sagen, schauen Sie sich die Routen an (Befehl "route" unter Linux) und stellen Sie sicher, dass Sie nicht wie zwei Standardrouten oder seltsame oder was auch immer haben. Alles in allem würde ich Test Ping und SSH und Ihr Programm auf der gleichen entfernten IP sagen, und wenn sie alle fehlschlagen, haben Sie eine Route Problem. Wenn nur Ihr Programm fehlschlägt, haben Sie wahrscheinlich entweder ein Firewall-Problem oder ein Programmproblem :)

0
hinzugefügt

Versuchen Sie, connect() auf denselben Host zu zeigen: Port, an dem Ihr SSH-Befehl ausgeführt wird. Bedenken Sie auch, dass einige Firewalls unterschiedliche Regeln für verschiedene Benutzerkonten (und manchmal für verschiedene ausführbare Dateien) anwenden können. Stellen Sie daher sicher, dass Sie ssh und Ihre Test-App unter demselben Benutzerkonto ausführen und dass SUID nicht für SSH festgelegt ist.

0
hinzugefügt