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


上下文

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

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

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

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


17
2018-02-21 10:23




跳主机......得爱他们! - RonJohn
可能重复 从A-> B-> C隧道SSH - muru
@muru这是一个不同的场景,但当然是相关的(毕竟它是关于隧道的!)。在这种情况下,我想假装 D->S 通过滥用 S->D - dangonfast


答案:


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

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

设置隧道后,您只需使用以下命令ssh到远程服务器:

$ ssh -p 1234 user@localhost

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


32
2018-02-21 10:29



这如何通过Windows VM进行隧道传输? (我工作的地方有多层防火墙,只打开几个端口。) - RonJohn
@RonJohn我相信这使用了(从OP)ssh-ing从服务器到桌面的工作,因此这建立了从服务器(端口22)直接到桌面机器(端口1234)的隧道,可以使用连接到服务器上的ssh(使用端口22)。 Windows VM仅用于设置隧道。 (如果我错了,请纠正我) - pizzapants184
@dangonfast除了答案,您可能会发现以下有价文件: spencerstirling.com/computergeek/sshtunnel.html - Pryftan
@RonJohn我刚刚链接到的文档可能也有助于回答这个问题,至少就多层防火墙等而言(如果内存对我来说是正确的 - 我已经读了很长时间了......我只是记得多年前的链接)。 - Pryftan
确实,@ pizzapants184,这是我的出发点:ssh来自S - > D,所以我想滥用这个来有效地做D - > S,即使这不是直接的工作。为什么网络配置如此,这是我逃避的事情。它可能是故意的或配置错误,但只要它对我有用...... - dangonfast


如果您运行的是较新版本的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语法,所以如果你是 jim 上 windows_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 你需要确保你使用的IP remove_server  从跳箱 而不是你的机器的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


5
2018-02-22 09:33



这是一个更好的答案。 - Robert Riedl
虽然有用,但这并不能回答被问到的问题。 OP声明他们不能从D-> S(他们想要的东西)进行SSH,但是他们可以从S-> D进行SSH。中间没有ssh代理(而不是Windows虚拟机,可能是由R​​DP访问)。 - mbrig
@mbrig确实。我没有尝试过这个解决方案,但是如果它有效我会感到惊讶:我从D - > S防火墙 - dangonfast
但是你说你可以进入Windows机器 - 我明白它可以作为你和其他机器之间的跳跃盒。 - Boris the Spider
我可以使用专有工具(VMWare Horizo​​n)登录Windows机器。我从来没有说过我能说的。我甚至在通过安装Putty伴侣ssh服务器(我忘记了名字)发布这个问题之前测试了这个,但我的测试失败了。我假设ssh也被防火墙打到了windows子网。 - dangonfast


而不是试图绕过事物并创建一个复杂的路径,你不能只是要求从桌面到服务器的SSH被允许吗?如果您需要它并且您应该访问服务器,我无法理解您拒绝请求的原因。


1
2018-02-22 09:00



关注downvote?问题是“如何ssh到我无法直接到达的服务器?”所以我的答案是有一个防火墙规则,以允许它是有效的。根据良好的安全措施,这也是绕过它的正确方法。 - Solarflare
我是一个大公司客户的三个月合同的第一周。我没有得到一台笔记本电脑(我使用我的笔记本电脑),几乎没有办公桌。我获得了数十个凭据来使用不同的服务,而我几乎无法处理整个问题。我想做的不是执行我的工作的艰难要求:我可以在虚拟机中工作,如果我开始提出有趣的问题,这就是我老板会告诉我的。或者他会指引我到服务台,在接下来的几个星期/几个月里,他们会在路上开罐。 - dangonfast
对我来说,在VM中工作很容易意味着50%的生产力损失,所以我想尽可能地避免它。不过,我喜欢这个演出! - dangonfast
我能理解。根据我的经验,当承包商绕过防火墙和政策来完成他们的工作时,“大企业客户”往往会感到非常不安,即使这是出于无私的目的。您可以从服务器SSH到桌面的事实告诉我,要么您无法做到反向,要么是疏忽,要么是出于特定目的而实施的。 - Solarflare
如果您想避免因规避政策而被解雇的风险,这是唯一真正的解决方案......至少, 谈论 在使用Khaleds解决方案之前向负责人解释他们知道你在做什么。 - Sven♦