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