我有一台运行 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-save
或iptables -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"