30

我遇到了这个很棒的库xterm.js,它也是 Visual Studio Code 终端的基础。我有一个非常笼统的问题。

我想通过基于 Web 的终端(在网络外,可能在 aws 服务器上)访问本地网络上的机器(ssh 进入机器)。我能够在本地网络中成功地做到这一点,但我无法从 Internet-->local network 得出结论。

举个例子 -An aws server running the application on ip 54.123.11.98 which has a GUI with a button to open terminal. I want to open terminal of a local machine which is in a local network somewhere behind some public ip on local ip 192.168.1.7.

上面的例子可以使用某种解决方案来实现,我可以使用 xterm.js,这样我就不必去构建基于 Web 的终端了吗?以这种方式暴露终端时,我应该记住哪些主要的安全问题?

我正在考虑在 AWS 和本地网络 ip 之间使用固定的中间服务器并使用某种反向 ssh 隧道过程来执行此操作,但我不确定这是否是正确的方法或者是否有更简单/更好的方法为达到这个。

我知道数字海洋,谷歌云,他们都这样做,但是当我在本地网络中有一台机器时,他们必须连接到具有公共 IP 的计算机。我真的不想将路由器配置为进行任何类型的设置。

4

2 回答 2

19

经过一番研究,这里是工作代码。

图书馆:

1) https://socket.io/

该库用于将包从客户端传输到服务器。

2) https://github.com/staltz/xstream

该库用于终端视图。

3) https://github.com/mscdex/ssh2

这是用于与远程服务器建立连接的主库。

第 1 步:将 Library 3 安装到您的项目文件夹中

第2步:从节点端开始server.js为打开的套接字创建一个文件

第 3 步:将客户端套接字连接到节点服务器(都在本地机器上)

棘手的逻辑是如何使用套接字和 ssh2。

在发出套接字时,您需要使用 ssh2 库触发 SSH 命令。在 ssh2 库(来自服务器)的响应中,您需要将套接字包传输到客户端。而已。

单击此处查找示例。

该示例将包含以下文件和文件夹:

Type    Name
------------
FILE    server.js
FILE    package.json
FOLDER  src
FOLDER  xtream

首先,您需要在 server.js 上配置您的服务器 IP、用户和密码或证书文件,然后运行node server.js​​.

PS:别忘了跑npm install

如果您有任何问题,请告诉我!

于 2017-09-01T06:14:14.240 回答
2

后来经过一些研究,我遇到了这项服务:https ://tmate.io/ ,它完美地完成了这项工作。虽然如果你需要一个基于 Web 的 tmate 终端,你必须使用他们的 ssh 服务器作为反向代理,理想情况下我对此并不满意。但是,它们提供了 tmate-server,可用于托管您自己的反向代理服务器,但缺少 Web UI。但是要构建一个系统,您必须通过 web 上的 ssh 访问 NAT 后面的客户端,以下是步骤。

  • 在某些云机器上安装和配置tmate-server 。
  • 客户端安装tmate,配置连接云机。
  • 使用 xterm.js(因为基于 WebSocket 的通信很容易)创建一个 nodejs 应用程序,它连接到您的 tmate-server 并将命令传递给相应的客户端。(请注意公开此应用程序的安全问题,因为您将传递 Linux 命令)。
  • 根据您的用例,您可能需要在客户端围绕 tmate 客户端进行小包装,以自动或通过某些 UI/手动操作启动/停止它。

注意:我还在客户端编写了一个小包装器来启动/停止并将所需信息传递给 API 服务器(用 nodejs 编写),然后将信息传递给另一个 API,该 API 将浏览器连接到相应的客户端会话. 由于我们编写了这个应用程序,它包括身份验证以及可以在终端上运行的命令限制。你可以自定义很多。

于 2019-07-30T07:30:03.637 回答