设置ssh一个特殊的ssh隧道

好吧,所以我碰到了一个泡菜。 我有一个Web应用程序,我真的需要在这个周末进行演示。 我不能演示它,除非我的系统pipe理员(谁下class)取消客户端SSL身份validation。 然而,有一条信息可以stream过的path。 Web应用程序在服务器A上。我有另一个服务器B,可以SSH入服务器A.服务器B也是公共访问。 我可以在服务器A上本地运行应用程序(在本地主机上),但是我根本无法在服务器B上运行应用程序。 我的想法是以某种方式使用SSH来允许服务器B代理请求localhost:8000在服务器A.我不知道如何做到这一点。 有任何想法吗? 我对这些机器都没有任何关注。

更新:我们的系统pipe理员是一个圣人,并从他的周末花费时间VPN从他家帮我们。

编辑:我也可以SSH从服务器到服务器B,所以它可能会build立一个反向的SSH隧道somesort。

编辑2:也只有一个客户端需要能够使用该应用程序,这个客户端是值得信赖的,可以在一定程度上与我合作。

既然你还没有说你正在使用什么SSH客户端,我会假设OpenSSH。 尽pipe细节可能会有所不同,但原则上可以使用PuTTY。

有三种可能的方式来做到这一点,这取决于什么会对你更容易。

方法1:通过服务器B的一个SSH隧道

最简单的方法是,如果可以让服务器A上的Web应用程序以服务器B可访问的方式进行侦听,例如不绑定到本地主机,而是绑定到网卡的内部IP地址。 在这个例子中,服务器在端口8000上侦听,而ServerA的内部主机名为“serverA.internal.example.com”,然后你可以这样做:

client$ ssh -L 12345:serverA.internal.example.com:8000 serverB.external.example.com 

然后,运行ssh的机器将能够访问http://localhost:12345/

此方法要求客户端具有SSH到服务器B.

方法2:菊花链两个SSH隧道

如果你不能改变你的web应用程序来听取任何东西,但本地主机,你将不得不这样做:

 client$ ssh -L 12345:localhost:23456 serverB.external.example.com serverB$ ssh -L 23456:localhost:8000 serverA.internal.example.com 

这将菊花链两个SSH隧道,让你从http://localhost:12345上的客户端访问Web应用程序

这种方法需要客户端访问服务器B和A.你可以通过事先自己设置隧道的后半部分来让客户端访问服务器B。

方法3:两个SSH隧道和一个端口转发

如果绝对不能给客户端一个SSH帐户,即使locking客户端到只允许SSH隧道 ,仍然有方法3。

 yourbox$ ssh -L '*:12345:localhost:23456' serverB.external.example.com serverB$ ssh -L 23456:localhost:8000 serverA.internal.example.com 

注意*:添加到第一个隧道。 这使得从你的机器(而不是客户端机器)运行的第一个SSH隧道绑定一个监听端口到任何networking接口,这可能是一个LAN IP地址在你的情况。 然后,您可以让您的路由器端口转发到您的计算机上的此端口。

所以,本质上,客户端将连接到路由器的WAN IP,它将DNAT到您的计算机的LAN IP,这将让客户端对您的盒子上的OpenSSH说话,这将推倒在服务器B的本地主机的SSH隧道:12345,这将推倒在另一个SSH隧道下到服务器A的localhost:23456,你就完成了。

请记住,这将您的web应用程序存放在任何碰巧知道您的路由器的IP地址和端口号的人身上。

希望这可以帮助!