如何通过 ssh 连接到我无法直接访问的服务器?

blu*_*ast 17 firewall ssh port-forwarding

语境

我正在运行 Ubuntu Desktop 作为我的主要机器,我将其称为 D。我想通过 ssh 连接到服务器 S,但防火墙阻止了我。

我可以通过非常繁琐的路径访问服务器 S,涉及 Windows 虚拟机和PuTTY。这使得使用此服务器非常烦人:完全不同的环境,复制/粘贴不起作用,连接到桌面时我无法正确使用桌面(Alt-Tab 被虚拟机破坏)等

我已经验证我可以从服务器 S ssh 到我的台式机 D(与我需要的相反)。

我能否以某种方式从服务器启动“端口转发”或类似功能,以便我可以从我的桌面 ssh 到服务器?

Kha*_*led 32

您可以使用以下命令设置从远程服务器到本地计算机的 SSH 隧道:

$ ssh -f -N -R 1234:localhost:22 user@your_machine_ip
Run Code Online (Sandbox Code Playgroud)

设置隧道后,您可以使用以下命令简单地通过 ssh 连接到远程服务器:

$ ssh -p 1234 user@localhost
Run Code Online (Sandbox Code Playgroud)

请注意,您需要设置 ssh 密钥以进行自动登录(无密码提示)。如果要以交互方式创建 SSH 隧道,可以删除 options -f -N。欲了解更多信息,man ssh


Bor*_*der 5

如果您运行的是较新版本的 OpenSSH (7.3+),那么您可以使用ProxyJump它神奇地将所有内容组合在一起:

ssh -J windows_machine remote_server
Run Code Online (Sandbox Code Playgroud)

你的~/.ssh/config样子:

Host remote_server
        HostName remote_server
        ProxyJump windows_machine
        User myname
Run Code Online (Sandbox Code Playgroud)

ProxyJump支持完整的 SSH 语法,因此如果您jim打开windows_server并且它使用端口2222进行 ssh。remote_server在IP192.168.0.110距离windows_server,那么你可以这样写:

Host remote_server
        HostName 192.168.0.110
        ProxyJump jim@windows_machine:2222
        User myname
Run Code Online (Sandbox Code Playgroud)

仍然只是运行ssh remote_server到那里。


如果您运行的是旧版本的 SSH,请使用ProxyCommand - 这允许您告诉 SSH 在运行实际 SSH 命令之前先运行命令以建立代理连接。

ssh -o ProxyCommand='ssh -W %h:%p windows_machine' remote_server
Run Code Online (Sandbox Code Playgroud)

这使用了 SSH -W选项,这是更神秘的netcat 语法的简写。

请注意,当您运行时,ssh remote_server您现在windows_machine需要确保使用remove_server 来自跳转盒的 IP,而不是来自您机器的 IP - 这些很可能是相同的。

然后,您可以将此指令添加到您的~/.ssh/config文件中:

Host remote_server
  HostName remote_server
  User myname
  ProxyCommand ssh -W %h:%p windows_machine
Run Code Online (Sandbox Code Playgroud)

这意味着如果remote_server 一台不同的机器,windows_machine那么你可以把它放在配置中,仍然只使用ssh remote_server.