1

我接到一个测试员的电话,说一台机器出现了我们的软件故障。当我检查问题机器时,我很快意识到问题是相当低级的:入站网络流量工作正常。像 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。

4

4 回答 4

2

我会检查那台机器上的防火墙配置。iptables(我猜你的 SUSE 有 iptables 防火墙)可以设置为只允许 ping ICMP 数据包。

于 2008-09-18T19:43:09.503 回答
1

防火墙是否关闭?

于 2008-09-18T19:42:40.787 回答
0

防火墙总是可以的,但它确实说 ssh 可以连接,所以这似乎不太可能。我想说看看路由(Linux 上的“路由”命令),并确保你没有两条默认路由,或者奇怪的路由或其他任何东西。总而言之,我会说在同一个远程 IP 上测试 ping 和 ssh 以及您的程序,如果它们都失败了,那么您就有了路由问题。如果只有您的程序失败,您可能有防火墙问题或程序问题 :)

于 2008-09-18T20:08:46.340 回答
0

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

于 2008-09-18T20:38:35.940 回答