SSH 到防火墙后面的服务器

Posted

技术标签:

【中文标题】SSH 到防火墙后面的服务器【英文标题】:SSH to server behind firewall 【发布时间】:2012-02-06 22:15:37 【问题描述】:

我目前正在尝试研究如何通过 SSH 连接到拒绝所有传入连接的防火墙后面的服务器。服务器可以 SSH 出去,所以我想知道是否有办法让防火墙后面的服务器创建到我的工作站的 SSH 隧道,然后允许我的工作站通过它将命令发送回服务器?

我研究过隧道/反向隧道,但这些似乎是端口转发解决方案,由于防火墙拒绝所有端口上的所有连接,因此无法正常工作。

理想情况下,我想在 Ruby 中执行此操作(使用 Net::SSH gem),而不是像这样打开新连接:

Net::SSH.start('host', 'user', :password => "password")

我可以以某种方式绑定到现有隧道。

谢谢!

【问题讨论】:

【参考方案1】:

如果您可以控制服务器,这相当简单。我将提供命令行版本,您可以将其用于您喜欢的任何框架:

server$ ssh -R 9091:localhost:22 client.example.egg

client$ ssh -p 9091 localhost

服务器首先建立与客户端的连接,该连接开始在端口 9091(我刚刚编造的)上的“R”emote 端(即客户端)上侦听,并将这些连接转发到localhost:22,即到ssh 服务器本身。

然后客户端只需要连接到自己的本地端口9091,透明地转发到服务器的ssh服务器。

这通常会对您的公钥检查(以及相关的安全性!)造成严重破坏,因为客户端的 ssh 客户端不知道 localhost:9091server:22 相同。如果您的客户端是 Putty,那么您可以选择在某处提供“真实”服务器名称,以便正确查找凭据。

【讨论】:

有没有办法可以通配该本地主机数字。我的 IP 地址发生了变化,我希望始终能够通过 ssh 连接到服务器。我已经设置了一个 dns 解析器 @MichaelH:我不确定我是否理解。如果其中一个对等方的 IP 地址发生变化,您将无法维持 TCP 连接... 我们也可以通过它来隧道 http 吗? @Will:当然,您可以通过隧道传输特定的 TCP 端口,或者您可以创建一个 SOCKS 代理来隧道任何个 TCP 连接(选项-D)。跨度> 【参考方案2】:

除非您可以从您首先尝试连接的主机创建(并维护)一条隧道(这将允许您随后通过该隧道进行连接),否则您不能。这就是防火墙的重点:防止未经授权访问网络。

但是,防火墙不应阻止隧道,尽管这完全取决于隧道的管理方式。使用ssh's tunneling features 设置的端口转发隧道会破坏防火墙。但是,这也可能让您与远程网络的管理员发生冲突。

因此,最终,您需要与网络管理员交谈以放宽防火墙规则,以便在不需要隧道的情况下执行此操作,或者至少获得拥有隧道的授权。

【讨论】:

以上是关于SSH 到防火墙后面的服务器的主要内容,如果未能解决你的问题,请参考以下文章

Git,SSH和ProxyCommand

将 gitlab ssh 公钥添加到公司防火墙后面 dockerfile 中的已知主机(无端口 22)

自动杀死损坏的反向 ssh 隧道

如何使用反向 SSH 隧道绕过防火墙和 NAT

需要在防火墙后面使用 git:尝试 ssh 隧道

通过外部服务器 SSH 防火墙后的两台计算机