22

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

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

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

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

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

谢谢!

4

2 回答 2

37

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

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

client$ ssh -p 9091 localhost

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

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

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

于 2012-01-10T14:01:31.910 回答
1

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

然而,防火墙不应该阻止隧道,尽管它完全取决于隧道的管理方式。使用ssh 的隧道功能设置的端口转发隧道会破坏防火墙。但是,它也可能使您与远程网络的管理员有麻烦。

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

于 2012-01-10T13:56:40.150 回答