为了描述情况,我需要定义三台机器。 在本地networking上,我有一台机器(LAPTOP)和一台机器(SERVER)分别通过WAN和LAN连接到路由器。 第三台机器是一个外部vps(VPS)。
我正在尝试使用明确的IP地址从LAPTOP SSH到服务器。 为此,我设置了openssh服务器(所有的机器都运行Ubuntu),监听端口22.在路由器上,我给SERVER一个预留的IP地址,并且将端口22的端口转发规则添加到SERVER的22端口。
什么是工作: – 从VPS到SERVER的SSH – 从本地networking内部使用本地主机名从LAPTOP到SERVER的SSH
什么不工作: – 使用显式IP地址从LAPTOP到SERVER的SSH。
尝试和debugging我运行nmap来查看端口是否被过滤。 我在VPS和LAPTOP上都运行了以下命令
nmap -sS -p 22 xx.xx.xx.xx
其中x表示本地networking的路由器的文字外部IP。 结果如下:
VPS:22 / tcp打开ssh
LAPTOP:22 / tcp过滤的ssh
只是为了再次检查我是否使用LAPTOP中的本地主机名,端口是否应该打开。 为什么在使用显式外部IP时从LAPTOP进行SSH连接时会过滤端口? 传出的请求是否被路由器过滤了?
你的问题来自于你的路由器可能在NAT之前(iptables中的SNAT链)应用端口转发规则(iptables中的DNAT链)。
这个stackexchange文章详细解释了这个问题,并告诉你如何使用tcpdump来确认它。 基本上你应该看到你发送你的SYN数据包到你的外部IP,但是从SERVER的内部IP接收到SYN/ACK 。
编辑:如何解决它:不要从您的内部networking连接到您的外部IP。 直接使用SERVER的内部IP。