诸如ping,ssh之类的Unix命令可以正常工作,但是基于套接字的程序在连接中失败

时间:2020-03-06 14:23:08  来源:igfitidea点击:

我接到测试人员打来的电话,询问某台计算机发生了软件故障。当我检查问题机器时,我很快意识到问题是相当低的水平:入站网络通信正常。像ping和ssh这样的基本出站命令都可以正常工作,但是涉及到connect()调用的任何操作都将失败,并显示" No route to host"。

例如,在这台特定的机器上,该程序将在connect()语句中针对除127.0.0.1之外的任何IP地址失败:

#!/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防火墙)设置为仅允许ping ICMP数据包通过。

防火墙总是可能的,但是它确实说ssh可以连接,所以这似乎不太可能。
我想说一下路由(在Linux上是" route"命令),并确保我们没有两个默认路由,或者一个奇怪的路由或者其他。总而言之,我要说的是在相同的远程IP上测试ping和ssh以及程序,如果它们全部失败,则说明我们存在路由问题。如果只有程序失败,则可能是防火墙问题或者程序问题:)

尝试将connect()指向SSH命令起作用的同一host:port。另外,请记住,某些防火墙可以对不同的用户帐户(有时对不同的可执行文件)应用不同的规则。因此,请确保在同一用户帐户下运行ssh和测试应用程序,并且未为SSH设置SUID。