我接到一位测试人员的电话,询问我们软件出现故障的机器。当我检查问题机器时,我很快意识到问题是相当低的水平:入站网络流量工作正常。像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。
答案 0 :(得分:2)
我会检查该机器上的防火墙配置。 iptables(我想你的SUSE有iptables防火墙)可以设置为只通过ping ICMP数据包。
答案 1 :(得分:1)
防火墙是否已关闭?
答案 2 :(得分:0)
防火墙总是可行的,但确实说ssh可以连接,所以这似乎不太可能。 我想看一下路由(Linux上的“route”命令),并确保你没有两个默认路由,或者奇怪的路由或其他什么。总而言之,我会说同一个远程IP上的测试ping和ssh以及你的程序,如果它们都失败了,你就会遇到路由问题。如果只有你的程序失败,你可能有防火墙问题或程序问题:)
答案 3 :(得分:0)
尝试将connect()指向同一主机:SSH命令工作的端口。此外,请记住,某些防火墙可以为不同的用户帐户(有时为不同的可执行文件)应用不同的规则。因此,请确保在同一用户帐户下运行ssh和测试应用程序,并且没有为SSH设置SUID。