与远程服务器的连接无限期挂起

与远程服务器的连接无限期挂起

我有一台运行 Fedora 23 的服务器。当我在其上运行一个简单的服务器应用程序时(给出的示例这里(仅更改了端口和 IP 地址)它会打开端口 3490 并监听客户端的连接。客户端连接后,它应该会响应并结束。但是,当客户端程序在远程计算机上运行时,它会无限期挂起并且永远不会连接。这是netstat -tuplen服务器端程序运行时服务器上的输出。这里的程序是“./server”。

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          581266095  139/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      0          581266893  178/sendmail: accep 
tcp        0      0 0.0.0.0:3490            0.0.0.0:*               LISTEN      0          1781896327 23696/./server      
tcp6       0      0 :::22                   :::*                    LISTEN      0          581266097  139/sshd            
tcp6       0      0 :::3306                 :::*                    LISTEN      27         1762178376 18622/mysqld        
tcp6       0      0 :::80                   :::*                    LISTEN      0          581266785  149/httpd 

当我在软件运行时尝试远程登录到端口时,我会一直等待,Trying [server IP]...直到超时。当我在同一台机器上运行服务器和客户端软件,并且仅通过 127.0.0.1 进行本地连接时,它们工作正常。

当服务器软件运行时,我使用 nmap 扫描了我的远程计算机,具体来说nmap -T4 -A -v [server IP]/3490。它从第三台计算机获取我当时连接的 ssh 端口“22”,但不是 3490 端口,也不是任何其他端口。如果这会影响任何事情,那么从我的本地计算机到服务器的跟踪路由长度为 12 跳。

在运行服务器应用程序之前,我运行了

/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3490 -j ACCEPT

进而

service iptables save

允许通过防火墙连接到端口。然而,虽然这可能打开了防火墙上的端口,但它不允许客户端和服务器程序连接。我做错了什么?我需要改变什么?我应该在哪里检查以了解有关问题的更多信息并更接近解决问题?

答案1

你可能还没有实际上允许连接通过防火墙。

iptables 目录规则已读从上到下,“第一个匹配获胜”,因此如果您的 INPUT 链在末尾有一个全局“阻止所有”规则,则在该规则下面添加的任何内容都不会被检查。运行iptables-saveiptables -L -v -n --line-numbers并从上到下阅读您的 INPUT 规则,看看对数据包进行了哪些检查。

命令中的-A表示“附加”,将新规则添加到末尾。相反的是-I,表示“插入”,将其放在顶部;两者都采用特定的位置编号来将规则放在前面/后面。例如,如果您想在位置 4 处添加新规则:

iptables -I INPUT 4 -p tcp ... -j ...

您还可以执行以下操作:

iptables-save > rules.txt
nano rules.txt
iptables-restore < rules.txt

请注意,防火墙可能存在于其他地方,例如数据包可能被服务器网络过滤。用于tcpdump确定数据包是否至少抵达服务器:

tcpdump -n -i eth0 "port 3490"

相关内容