如何ssh到我无法直接到达的服务器?


17

语境

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

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

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

我可以以某种方式从服务器启动“端口转发”或类似操作,以便可以从台式机SSH到服务器吗?


2
跳主机...得爱他们!!!
罗恩·约翰


@muru这是一个不同的场景,但是当然相关(毕竟是关于隧道!)。在这种情况下,我想D->S通过滥用来伪造S->D
dangonfast

Answers:


32

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

$ ssh -f -N -R 1234:localhost:22 user@your_machine_ip

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

$ ssh -p 1234 user@localhost

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


该通道如何通过Windows VM?(在我工作的地方,有多层防火墙,并且只打开了几个端口。)
RonJohn

@RonJohn我相信这使用了这样的事实:(对于OP)从服务器到桌面的ssh-sing起作用,因此这建立了从服务器(端口22)直接到可以使用的台式机(端口1234)的隧道。连接到服务器(使用端口22)上的ssh。Windows VM仅用于设置隧道。(如果我错了,请纠正我)
pizzapant184 '18

@dangonfast除了答案,您还可以找到以下有价值的文件:spencerstirling.com/computergeek/sshtunnel.html
Pryftan

@RonJohn我刚刚链接到的文档也可能会回答这个问题,至少就多层防火墙等而言(如果内存对我有用-我已经读了很长时间了。)记得年前有链接)。
Pryftan

1
@ pizzapants184确实是,这是我的出发点:S-> D的ssh,所以我想滥用此方法有效地执行D-> S,即使这样做并不出色。为什么要像这样配置网络,这是我无法理解的事情。它可能是故意的或配置错误的,但只要对我
有用

5

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

ssh -J windows_machine remote_server

您的~/.ssh/config外观如下:

Host remote_server
        HostName remote_server
        ProxyJump windows_machine
        User myname

ProxyJump支持全SSH语法,所以如果你是jimwindows_server和它使用的端口2222为SSH。remote_server从IP 192.168.0.110开始,windows_server您可以这样写:

Host remote_server
        HostName 192.168.0.110
        ProxyJump jim@windows_machine:2222
        User myname

而且仍然只是跑到ssh remote_server那里。


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

ssh -o ProxyCommand='ssh -W %h:%p windows_machine' remote_server

这使用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

这意味着如果您看到的remote_server 是另外一台机器,windows_machine则可以将其放入配置中并仍然使用ssh remote_server


1
这是一个更好的答案。
罗伯特·里德尔

虽然有用,但这不能回答所提出的问题。OP声明他们无法从D-> S(他们想要的)进行SSH,但可以从S-> D进行SSH。两者之间没有ssh代理(而是存在Windows虚拟机,可能由RDP访问)。
mbrig '18

确实是@mbrig。我没有尝试过此解决方案,但是如果它起作用,我会感到惊讶:我从D-> S
dangonfast

但是您说您可以使用Windows机器-据我了解,它可以充当您和另一台机器之间的跳箱。
蜘蛛鲍里斯(Boris the Spider)'18年

1
我可以使用专有工具(VMWare Horizo​​n)登录Windows机器。我从未说过我可以接受它。在发布此问题之前,我什至通过安装Putty伴侣ssh服务器(我忘记了名称)进行了测试,但是我的测试失败了。我假设ssh也被防火墙连接到Windows子网。
dangonfast

1

您是否只是在要求从桌面到服务器的SSH,而不是试图绕过事物并创建复杂的路径,否则就不希望这样做吗?如果您有需要,并且应该访问服务器,我看不到为什么您的请求被拒绝。


关心解释下降投票吗?问题是“如何SSH到我无法直接访问的服务器?” 因此,我的答案是制定防火墙规则以使其有效。根据良好的安全实践,这也是解决该问题的正确方法。
Solarflare

我正处于一个大公司客户三个月合同的第一周。我没有得到笔记本电脑(我用的是我的),几乎没有桌子。我获得了数十种使用不同服务的凭据,并且我几乎无法设法处理整个事情。我要做的并不是执行工作的硬性要求:我可以在VM中工作,如果我开始提出有趣的问题,这就是老板会告诉我的。否则他会把我指向帮助台,它将在接下来的几周/几个月内将罐子推开。
dangonfast

对我来说,在VM中工作很容易意味着50%的生产力损失,因此我想尽可能避免这种情况。不过,我喜欢这场演出!
dangonfast

1
我能理解 以我的经验,即使承包商出于无私的目的而绕过防火墙和策略来执行其工作,“大公司客户”也往往会感到非常沮丧。您可以从服务器SSH到台式机的事实告诉我,要么您无法执行相反操作,要么是疏忽,或者是出于特定目的而进行的操作。
Solarflare

4
如果您想避免因规避政策而被解雇的风险,这是唯一的真正解决方案...至少,在使用Khaleds解决方案之前,请与负责人员进行交谈,以使他们知道您的打算。
斯文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.