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

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

  •  01-07-2019
  •  | 
  •  

Вопрос

Мне позвонил тестировщик по поводу машины, на которой вышло из строя наше программное обеспечение.Когда я изучил проблемную машину, я быстро понял, что проблема была довольно низкого уровня:Входящий сетевой трафик работает нормально.Базовые исходящие команды, такие как 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 = <SOCK>)) {
    print $line;
}

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

Есть какие-нибудь предложения о том, где сломана эта машина?Он работает под управлением SUSE-10.2.

Это было полезно?

Решение

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

Другие советы

Выключен ли брандмауэр?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top