浏览器支持 HTTP(S) 协议和 Websocket 协议,部分浏览器支持 FTP 协议。通过浏览器无法直接使用 RDP 协议与 Windows 主机相连,需要构建一个 Web 端到目标主机的网关。这个网关,需要承载 RDP 客户端的功能用以连接 RDP 服务器也就是真正的主机,也需要承载 HTTP/Websocket 服务器的功能以同用户的浏览器相连,同时需要将 RDP 协议内容回流给 Web 端以渲染,将 Web 端的指令动作转译为 RDP 参数。

Guacamole

Guacamole [ˌɡwækəˈməʊleɪ] 是一个基于 HTML 5 和 JavaScript 的 远程桌面网关,支持 VNC、RDP、SSH 标准协议。目前该项目是 Apache 基金会的孵化项目,采用 Apache-2.0 开源协议。

Guacamole主要包含以下项目,分别是:

guacamole-server 包括了一系列 Guacamole 最基础的软件包,包括 guacd、libguac 与多个协议支持库。

guacd 是 Guacamole web 应用程序与框架使用的 Gauacamole 代理守护进程。因为 Javascript 无法处理二进制协议(例如 VNC 和 RDP),一个新的基于文本的协议(Guacamole 协议)被开发来包括一个通用的有效率的远程桌面操作的超集,并且易于被 Javascript 程序访问。guacd 是在任意协议和 Guacamole 协议之间转换的代理。

guacamole-client 包括了一系列的 Guacamole 需要的 基于 Maven 包的项目(Java 版的 web 应用),提供了一个 HTML5 web应用,提供对远程桌面协议桌面的访问。guacamole-client 包含了多个子项目,每个子项目之间互相独立可以独立编译。如果所有子项目均使用 guacamole-client 编译,Maven 将会控制编译顺序。

guacamole-website 包含了 Guacamole 官网的代码,是由 Jekyll 生成的静态网站,包含了 Guacamole 相关的使用文档和更新日志。

guacamole-manual 是整个 Guacamole 技术堆栈的基础文档。

guacamole

Guacamole 架构

guacamole_inner

Guacamole 的主要组成部分:

  • guacd:远程协议连接网关,由 C/C++ 开发的网关库,目前只有 Linux 版本,因此 guacd 必须部署在 Linux 系统中。

  • guacamole-common(Java API):这是 Java 实现的与 guacd 通信的 Java API,它基于 Servlet2.5+,是项目集成的主要API,所以它必须在 Servlet 容器中运行,比如 Tomcat,据官方使用的 API 情况,必须使用 Tomcat8.5 以上 Tomcat。

  • guacamole-common-js(JS API):是 H5 中显示远程桌面连接的API。

  • guacamole(官方网页端和容器实现):是官方基于 RestAPI 实现的 Web 管理端,包括认证、扩展、前端界面等,基于 Servlet2.5+,必须在 Tomcat8.5+ 等 Servlet 容器中运行。

  • guacamole-common-ext:是官方实现的网页登录认证、连接管理模块,基于 Java RestAPI。

对 RDP 的支持

libguac-client-rdp 库为 Guacamole 提供了对 RDP 协议的支持,如果构建过程中存在所需的依赖项,则该库将作为 guacamole-server 的一部分安装。

除了 RDP 特定参数外,Guacamole 还支持:

Myrtille

Myrtille [mirtij] 通过 Web 浏览器提供对远程桌面、应用程序和 SSH 服务器的简单快速访问,无需任何插件、扩展或配置。Myrtille 基于 C# 开发,采用 Apache-2.0 开源协议。Myrtille 源代码地址

工作方式

用户输入(键盘、鼠标、触摸屏)从 Web 浏览器转发到 HTTP(S) 网关(即 Myrtille),然后转发到 RDP(或 SSH)客户端,该客户端与 RDP(或 SSH)服务器保持会话。操作的显示结果(或不显示)从 RDP(或 SSH)客户端并通过网关流回浏览器。

性能与资源要求

Myrtille 支持多个连接/选项卡。除了 RDP(或 SSH)服务器可以处理的(CAL 数量、CPU、RAM)之外,最大并发用户数没有限制。关于 Myrtille 网关,具有 4 GB RAM 的简单双核 CPU 最多可以同时处理 50 个会话(RDP 客户端进程大约占用 50MB RAM,SSH 甚至更少)。一个会话平均使用大约 200 KB/s 的带宽。对于大多数情况,每个用户 1 MB/s 是一个很好的规定。对 Myrtille 来说真正重要的是传出带宽,因为显示更新将占用大部分流量。

编译需要 Microsoft Visual Studio 2017 或更高版本。从 2.8.0 版本开始,Myrtille 可作为 Docker 映像使用。

FreeRDP-WebConnect

FreeRDP-WebConnect 是一个可以通过 Web 访问 RDP 会话的网关。FreeRDP-WebConnect 采用了 Websocket 协议与浏览器端进行通信,通过 Canvas 绘制画面,服务器端使用 C++ 编写,提供 HTTPS 服务并通过 FreeRDP 与主机通信。
FreeRDP-WebConnect 在 Github 中已被标注为 archived。

FreeRDP

FreeRDP 是一个 RDP 协议的开源实现,基于 C 语言,采用 Apache-2.0 开源协议发布。源代码地址

Guacamole、Myrtille、FreeRDP-WebConnect 的 RDP 部分均采用 FreeRDP 与主机连接。

mstsc.js

Mstsc.js 是一个纯 Javascript Microsoft RDP(远程桌面客户端)客户端,使用了 nodejs、node-rdpjs 和 socket.io。它允许用户通过 web 浏览器连接到任何终端服务器兼容的应用程序。mstsc.js 采用 GPL-3.0 协议发布。

方案对比

- Guacamole Myrtille FreeRDP-WebConnect mstsc.js FreeRDP
支持协议 VNC,RDP,SSH SSH,RDP RDP RDP RDP
开发语言 Java C# C++ Javascript C
star数量 2.3k 1.4k 463 645 7.5k
最近更新 6 days ago 15 months ago 5 years ago(archived) 2 years ago 3 hours ago

最近更新参考时间 2022-10-24 17:10:00

Guacamole:功能强大,文档(英文)丰富,社区活跃更新频繁,被多个开源堡垒机采用
Myrtille:小众,似乎不再更新,不推荐
FreeRDP-WebConnect:已停止更新,不推荐使用,可参考实现
mstsc.js:似乎不再更新,协议不友好,不推荐
FreeRDP:文档(英文)健全,社区活跃,需要自己开发 HTTP/Websocket 客户端,制定沟通协议

比较推荐方案:

  1. 采用 Guacamole。后端需要部署 guacd 服务,用 golang 实现 guacamole-client 中的 guacamole-common 以及 guacamole 中的 RestAPI 部分。前端实现 guacamole 中的前端页面部分,调用 guacamole-common-js 渲染。

好处在于 Guacamole 文档丰富,且被多数开源堡垒机接受,说明在一定程度上质量有保证。难点在于需要学习 Guacamole 协议及配置方法。

  1. 采用 FreeRDP。后端已经比较熟悉 FreeRDP,前后端可定义 wss 接口,参考 web ssh 实现部分,自主实现。

好处在于自定义程度高。难点在于前后端协议定义,按照支持功能的丰富程度,可能需要进一步解析 RDP 协议,定义包括音频支持、剪切板支持等多种 action,需要自己处理预连接 PDU 和负载均衡。