我正在开发一个位于远程 Ubuntu 14.x 服务器上的服务器应用程序。该应用程序正在监听远程机器上的端口 8000。我有一个正确的 SSH 会话,因此我已进入该机器,并且我也有 sudo 功能。
我办公室的本地 Linux 系统上安装了 IntelliJ,它也运行着 ubuntu 14.x。我需要让它连接到远程机器上的端口 8000,以进行 IntelliJ 远程调试会话。远程机器上的端口 8080 不对外开放。
是否有一个实用程序、IP 表技巧(在远程设备上)或 SSH 技巧等,可以为我的系统提供一个本地端口供 IntelliJ 连接,然后通过 SSH 隧道将往返于该端口的流量代理/转发到远程系统上的端口 8000?换句话说,它会让我本地设备上的 IntelliJ 认为它正在直接与远程设备上的服务器应用程序通信,而实际上它们之间的连接是通过活动的 SSH 隧道进行的?
我记得很久以前做过类似的事情,但我完全忘记了怎么做,当时远程客户端是 Windows 机器,所以解决方案是针对 Windows 系统的。这次本地系统和远程系统都是 Ubuntu 14.x 服务器。
答案1
在本地机器上设置转发隧道
autossh -f -N -L 0.0.0.0:8000:localhost:8000 username@remotebox
0.0.0.0:8000
是 IntelliJ 将要连接的,它会认为 Web 应用程序正在本地机器上运行,绑定到每个本地接口并在端口 8000 上运行。
localhost:8000
是隧道将连接到的位置,在 remotebox 的上下文中。localhost
不再是localhost
您正在处理的,而是localhost
remotebox 机器内的接口。在那里,它将从用户上下文连接到端口 8000,这实际上是您的 Web 应用程序username
。
autossh
是一个包装器ssh
,当连接断开时,它负责自动重新连接。
如果您在 remotebox 上使用非标准 ssh 端口,请使用参数-P <PORT>
来连接它。
如果上述内容不能满足您的要求,则值得看一下这个答案:https://unix.stackexchange.com/a/118650/61956
从那里我刚刚向你解释了第一张图。我在本地端口前面加上了接口0.0.0.0
,我认为localhost
当你省略它时它会默认为,如果你愿意的话你可以这样做。删除该0.0.0.0:
部分可能更安全,因为如果localhost
是默认值,那么网络上的任何人都不能使用你的机器来使用该 ssh 隧道。否则对他们来说,如果是您正在使用的机器的 IP,那么192.168.10.10:8000
它将是远程 Web 应用程序的入口点。192.168.10.10