正如问题所述,我目前正在尝试从 NAT 后面的 Windows 服务器到托管的 Ubuntu VPS 建立反向 SSH 连接。我几乎是 Linux 和 SSH 的初学者。
我正在使用以下命令从 Windows 机器运行 PLink 连接:
plink.exe -ssh -R 3005:localhost:1433 [email protected] -pw password
在 VPS 上,我已将以下几行添加到 sshd_config:
Match User deploy
GatewayPorts yes
并重新启动 SSH。Netstat -an | grep 3005 返回以下响应:
tcp 0 0 0.0.0.0:3005 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3005 127.0.0.1:47578 ESTABLISHED
tcp6 0 0 :::3005 :::* LISTEN
tcp6 0 0 127.0.0.1:47578 127.0.0.1:3005 ESTABLISHED
对我来说,这看起来是对的,但这纯粹是因为我试图解读给出的信息。但我的 ruby webapp(在 Padrino、Mizuno 和 Nginx 上运行)拒绝连接到本地主机上此端口上的 SQL 服务器。我遗漏了什么吗?
希望这些信息足够继续下去。如果还有其他信息,我会尽力提供。
答案1
根据您提供的信息(主要是的输出netstat
),看起来您的端口转发没有问题。
您可以通过尝试从 Ubuntu 计算机打开到此端口的连接来确保这一点。尝试以下操作:
telnet localhost 3005
那么你应该属于以下三种情况之一:
您收到一条消息,
telnet: Unable to connect to remote host: Connection refused
提示端口转发不起作用,Ubuntu 服务器上的 3005 端口仍然处于关闭状态。您收到带有和的消息
connect_to localhost port 1433: failed.
,Connected to localhost.
但直接用它关闭Connection closed by foreign host.
意味着端口转发正常(第一次连接),但 SQL 服务器上的监听端口不接受连接(第二次连接,即使错误消息首先出现)。您收到来自 SQL Server 的邀请,然后连接可能会关闭。如果是这种情况,则意味着端口转发工作正常。但问题在于您的 SQL 服务器或您的应用程序连接它的方式。
我认为你应该在2.或3。
答案2
反向隧道?您是指远程端口转发吗?我认为您正在尝试将本地端口(SQL 服务器正在运行的位置)转发到远程 Ubuntu 服务器。如果是这样,那么您需要改为执行本地端口转发(-L 而不是 -R)
答案3
您无法这样做,因为客户端位于 NAT 路由器后面。如果没有 NAT,您可以使用:
plink -ssh -R 3005:client-ip-addr:1433 deploy@ubuntu-ip-addr -pw passwd
不幸的是,ubuntu 服务器无法访问客户端 IP 地址。也许将端口转发到 sql server host:port 可能会有所帮助,但我想这正是您想要避免的事情。