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 防火墙)可以设置为只允许 ping ICMP 数据包。

其他提示

防火墙是否关闭?

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top