我遇到过这种情况:我想连接到运行 VNC 的 Linux 机器(我们称之为 VNCServer),该机器位于两台连续的 Linux 机器后面,也就是说,要 ssh 进入 VNCServer,我必须从我的笔记本电脑 ssh 进入 Gateway1,然后从 Gateway1 shell ssh 进入 Gateway2,最后从该 shell ssh 进入 VNCServer。我无法更改网络设计和访问流程:笔记本电脑-->Gateway1-->Gateway2-->Server。我在 Gateway1 上没有 root 权限,并且除 22 和 5901 之外的所有端口都已关闭。
有没有办法让我在笔记本电脑上启动 VNC 查看器并访问 VNCServer?我知道可以使用 ssh 隧道功能来完成,并且我的 Windows 笔记本电脑上有 Putty(抱歉,工作笔记本电脑上不能安装 Linux 或 Cygwin 等)。任何帮助都将不胜感激,因为这将使我的生活变得轻松很多!
答案1
Putty 确实支持 ssh 隧道,如果您展开连接、SSH 树,您将看到隧道的条目。
本地隧道会在您的 Windows 计算机上打开一个本地主机端口,该端口远程连接到您指定的 IP 地址和端口。例如,当我尝试通过 RDP 连接到我家里的桌面时,我通常会选择一个随机的本地端口,例如 7789,然后将桌面的本地 IP 地址 (1.2.3.4:3389) 作为远程主机。请务必单击“添加”,然后单击“应用”。此时,当您通过 RDP 连接到 127.0.0.1:7789 时,您将通过 Putty 会话连接到 1.2.3.4:3389。
这就是乐趣所在。如果您随后在中间盒上设置端口隧道,设置您在 Putty 中指定为远程端口的本地端口,然后您可以通过 Putty 反弹,通过中间盒到达最终目的地。您仍然需要进行一些 ssh 连接,但一旦设置完成,您就可以直接从 Windows 系统跨越 vnc 或 rdp,我相信这正是您想要做的。
例子
- 前往 Putty 中的隧道面板(如果 ssh 会话已处于活动状态,则从上下文菜单访问连接->SSH->隧道,或者在刚启动 putty 时在开始连接屏幕中访问)
- 创建本地源为 15900,远程源为 127.0.0.1:15900 的隧道
- 连接(如果尚未连接)至网关 1。
- 在 Gateway1 上,ssh -L 127.0.0.1:15900:VNCServerIP:5900 user@Gateway2
- 一旦 Gateway2 的 ssh 启动,尝试通过 vnc 连接到 127.0.0.1:15900 —— 您现在应该可以在远端看到 VNC 屏幕!
额外奖励-- 很多人不知道这一点,但这个过程也可用于代理 IPv6/IPv4 流量。SSH 不关心它使用什么协议进行隧道传输,因此理论上您可以从仅 IPv4 系统访问仅 IPv6 主机,前提是 ssh 服务器是双栈的(同时具有 IPv4 和 IPv6 地址)。
答案2
如果您想使用 PuTTY 进行两次跳转,还有另一种方法。在此示例中,我们从网关 #1 (10.0.1.123) 跳转到网关 #2 (10.0.1.456),再跳转到 10.0.1.789 上的端口 80。
首先创建到网关 #1 的跳转。首先设置到第一台服务器的连接。在连接>SSH>隧道中设置到第二个网关的隧道。在此示例中,我们将端口 2222 转发到第二个网关。
现在我们将设置第二跳。我们将通过第一个网关建立隧道到达下一个网关,并在第二个网关上设置端口转发。连接是到端口 2222 上的本地主机。这将通过正在运行的 ssh 连接建立隧道到达第二跳。在此连接上,我们设置了从端口 3333 到 10.0.1.789 的端口转发。
现在打开浏览器并导航到 127.0.0.1:3333,您将通过两个 SSH 连接隧道到达 10.0.1.789:80