Команды Unix, такие как ping, ssh, работают нормально, но программы на основе сокетов терпят неудачу в подключении

Я получил звонок от тестера о машине, которая терпела неудачу в нашем программном обеспечении. Когда я изучил проблемную машину, я быстро понял, что проблема была довольно низкого уровня: входящий сетевой трафик работает нормально. Основная исходящая команда, такая как ping и ssh, работает нормально, но все, что связано с вызовом connect() , терпит неудачу с «Нет маршрута к хосту».

Например, в этой конкретной машине эта программа завершится неудачей в инструкции connect() для любого IP-адреса, кроме 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;

Любые предложения о том, где эта машина сломана? Он запускает SUSE-10.2.

0
добавлено отредактировано
Просмотры: 171

4 ответы

Я бы проверял конфигурацию брандмауэра на этой машине. Это возможно для iptables (я думаю, ваш SUSE имеет брандмауэр iptables), чтобы настроить, чтобы разрешить только ping ICMP-пакеты.

0
добавлено
Йоу! Я думаю, что у вас все в порядке, но на неправильной машине. Подумав об этом, я попытался отключить iptables на машине, что я, хотя и «работал», и машина, которая была «сломана», начала работать! Благодаря!
добавлено автор Mike Heinz, источник

Брандмауэр отключен?

0
добавлено
Брандмауэр на другой машине, похоже, был проблемой. Спасибо за предложения!
добавлено автор Mike Heinz, источник

Брандмауэр всегда возможен, но он говорит, что ssh может подключаться, так что кажется маловероятным. Я бы сказал, взгляните на маршруты (команда «route» в Linux) и убедитесь, что у вас нет двух маршрутов по умолчанию, или странных, или чего-то еще. В общем, я бы сказал, что тестовый ping и ssh и ваша программа находятся на одном удаленном IP-адресе, и если все они терпят неудачу, у вас есть проблема с маршрутом. Если только ваша программа выходит из строя, у вас, вероятно, есть проблема с файерволом или проблема с программой :)

0
добавлено

Попробуйте указать connect() на тот же хост: порт, где работает ваша команда SSH. Кроме того, имейте в виду, что некоторые брандмауэры могут применять разные правила для разных учетных записей пользователей (а иногда и для разных исполняемых файлов). Поэтому убедитесь, что вы запускаете ssh и тестовое приложение под одной учетной записью пользователя и что SUID не установлен для SSH.

0
добавлено