设置 ssh 一种特殊的 ssh 隧道

设置 ssh 一种特殊的 ssh 隧道

好吧,我遇到了麻烦。我有一个 Web 应用程序,这个周末我真的需要演示一下。除非我的系统管理员(他下班了)取消客户端 SSL 身份验证,否则我无法演示它。但是,信息可以通过一条路径流动。Web 应用程序位于服务器 A 上。我有另一台服务器 B,可以通过 ssh 进入服务器 A。服务器 B 也是公开可访问的。我可以在本地(即在本地主机上)在服务器 A 上运行该应用程序,但我根本无法在服务器 B 上运行该应用程序。我的想法是以某种方式使用 SSH 允许服务器 B 将请求代理到服务器 A 上的 localhost:8000。但是我不知道如何做到这一点。有什么想法吗?请注意,我在这两台机器上都没有 root 权限。

更新:我们的系统管理员真是一位圣人,他利用周末的时间从家里通过 VPN 来帮助了我们。

编辑:我还可以从服务器 A 通过 ssh 进入服务器 B,因此可能可以设置某种反向 SSH 隧道。

编辑2:而且只有 1 个客户端需要能够使用该应用程序,并且该客户端是值得信赖的,并且可以在某种程度上与我合作。

答案1

由于您没有说明您使用的是哪个 SSH 客户端,因此我假设是 OpenSSH。原则上,您可以使用 PuTTY 执行相同操作,尽管具体细节会有所不同。

有三种可能的方法可以做到这一点,取决于哪种方法对您来说更容易。

方法 1:通过服务器 B 建立一条 SSH 隧道

最直接的方法是,如果您可以让服务器 A 上的 Web 应用以服务器 B 可以访问的方式进行监听,例如,不绑定到本地主机,而是绑定到网卡的内部 IP 地址。在此示例中,服务器监听端口 8000,并且服务器 A 具有内部主机名“serverA.internal.example.com”,然后您可以执行以下操作:

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

然后,运行 ssh 的机器将能够访问 webapphttp://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 隧道,让你可以从客户端访问 Web 应用http://localhost:12345

此方法要求客户端能够访问服务器 B 和 A。您可以提前自行设置隧道的另一半,这样只允许客户端访问服务器 B。

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

如果你实在无法给客户端一个 SSH 账户,即使锁定客户端以仅允许 SSH 隧道,还剩下方法3。

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

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

因此,从本质上讲,客户端将连接到路由器的 WAN IP,然后将其 DNAT 到您机器的 LAN IP,这将让客户端与您机器上的 OpenSSH 对话,这将把它推入一个绑定到服务器 B 的 localhost:12345 的 SSH 隧道,它将把它推入另一个 SSH 隧道到服务器 A 的 localhost:23456,您就完成了。

请记住,这会将您的 web 应用程序暴露给任何知道您的路由器 IP 地址和端口号的人。

希望这可以帮助!

相关内容