1、实验概述
Apache Guacamole 是个无客户端的开源远程桌面网关,支持 VNC、RDP 和 SSH 等标准协议,开源协议类型是 Apache License Version 2.0。Guacamole Client 是 HTML5 Web 应用,用户可以在不需要任何插件或者客户端软件的情况下,通过 Web 浏览器访问远程桌面。
# Apache Guacamole 官网
https://guacamole.apache.org/
官方提供的架构图:
Apache Guacamole 由两部分组成,guacamole-server 和 guacamole-client,详细的信息建议查看官方文档。
本次实验的目标:
- 使用源码完成 Guacamole 的部署
- 使用 Docker 完成 Guacamole 的部署
- 验证 SSH 连接
- 验证 VNC 连接
- 验证 RDP 连接
2、安装&部署
接下来我们按照官方使用手册中 Installing Guacamole natively 和 Installing Guacamole with Docker 安装两种方式进行实践操作。
2.1、本地安装方式
服务器:华为 Kunpeng 裸金属服务器
配置项 | 配置值 |
服务器类型 | ARM BMS |
操作系统 | CentOS 7.6 |
CPU | 128 cores |
内存 | 256 GB |
部署分成两部分:
- guacamole-server:提供 guacd 代理和相关库,需要使用源码进行构建
- guacamole-client:运行在 Serlvet 容器(例如 Tomcat)中的客户端,以二进制形式提供
2.1.1、构建 guacamole-server
2.1.1.1、安装必须的依赖
安装命令:
# 使用 yum 进行依赖安装
yum install -y cairo-devel \
libjpeg-turbo-devel \
libjpeg-devel \
libpng-devel \
libtool \
libuuid-devel \
uuid-devel
2.1.1.2、安装可选的依赖
Guacamole 的可选依赖项决定了 guacamole-server 的哪些部分将被构建。这包括对各种远程桌面协议的支持,以及这些协议的任何附加功能:
- FFmpeg 支持将屏幕录制转换为视频,至少安装了 FFmpeg 提供的 libavcodec、libavformat、libavutil 和 libswscale 库后才能构建
- VNC 支持依赖于 libvncclient 库,它是 libVNCServer 的一部分
- RDP 支持取决于最新版本的 FreeRDP(2.0.0 或更高版本,但请不要使用 git 的非发布版本)
- SSH 支持依赖于 libssh2、OpenSSL 和 Pango(字体渲染和文本布局库,由 Guacamole 的内置终端模拟器使用)
- Telnet 依赖于 libtelnet 和 Pango
- Kubernetes 支持依赖于 libwebsockets、OpenSSL 和 Pango
安装命令:
# 使用 yum 进行依赖安装
yum install -y ffmpeg-devel \
freerdp-devel \
libssh2-devel \
pango-devel \
libtelnet-devel \
libvncserver-devel \
libwebsockets-devel \
pulseaudio-libs-devel \
openssl-devel \
libvorbis-devel \
libwebp-devel
由于 ARM 生态实在太差了,ffmpeg-devel、libtelnet-devel、libwebsockets-devel 无法直接使用 yum 安装,我们至少需要手动把 FFmpeg 用源码安装起来。
2.1.2、源码构建 FFmpeg
使用的是 FFmpeg-n4.3.1 版本,安装到 /opt/FFmpeg-n4.3.1 目录。
# 已下载源码包到指定目录
tar -zxf FFmpeg-n4.3.1.tar.gz
cd FFmpeg-n4.3.1
# 编译 & 安装
# --enable-shared 是必须的
# --prefix 是安装到指定目录
./configure --enable-shared --prefix=/opt/FFmpeg-n4.3.1
make
make install
2.1.3、安装 guacamole-server
使用的是 guacamole-server-1.3.0 版本,安装到 /opt/guacamole-server-1.3.0 目录。
# 已下载源码包到指定目录
tar -zxf guacamole-server-1.3.0.tar.gz
cd guacamole-server-1.3.0
# 设置关于 FFmpeg 的依赖
# 可设置的依赖属性可以通过 ./configure --help 查看
export PKG_CONFIG_PATH=/opt/FFmpeg-n4.3.1/lib/pkgconfig/
export LD_LIBRARY_PATH=/opt/FFmpeg-n4.3.1/lib
# 编译 & 安装
./configure --prefix=/opt/guacamole-server-1.3.0
make
make install
./configure 后可以看到依赖库和协议支持的情况。
2.1.4、配置 & 启动 guacamole-server
主要配置 guacd 进程需要监听的 IP 和 Port,配置方式请参考官方使用手册。
# 启动 guacd
# 默认会启动在 127.0.0.1:4822
cd /opt/guacamole-server-1.3.0
./sbin/guacd
启动并查看端口占用情况。
2.1.5、部署 guacamole-client
官方提供了 guacamole-client 的 war 包,可以直接部署在 Tomcat 上进行部署。
使用的是 guacamole-1.3.0 版本。
# 拷贝 guacamole-1.3.0.war 到 Tomcat/webapps 目录
# /path/to/ 需要替换成用户的实际路径
cp /path/to/guacamole-1.3.0.war /path/to/tomcat/webapps
# 启动 Tomcat
cd /path/to/tomcat
./bin/start.sh
启动并查看启动日志。
浏览器打开 http://localhost:8080/guacamole-1.3.0/ 已经可以看到登录页面。还需要在 /etc/guacamole 目录完成用户和连接的配置,才能正常开始使用,不过我们先继续往下看看使用 Docker 方式的部署。
2.2、Docker 方式安装
服务器:弹性云服务器
配置项 | 配置值 |
服务器类型 | x86 ECS |
操作系统 | CentOS 7.6 |
CPU | 2 vCPU |
内存 | 4 G |
使用 Docker 部署,无需从源代码构建 guacamole-server 或手动配置 Web 应用程序。
官方使用手册中典型 Docker 部署涉及三个独立容器,在创建时链接在一起:
- guacamole/guacd:提供 guacd 守护进程,由已发布的 guacamole-server 源构建,支持 VNC、RDP、SSH、telnet 和 Kubernetes
- guacamole/guacamole:提供在 Tomcat 8 中运行并支持 WebSocket 的 Guacamole Web 应用程序。连接 guacd、MySQL、PostgreSQL、LDAP 等所需的配置将在镜像启动时根据 Docker 链接或环境变量自动生成
- mysql 或者 postgresql:提供 Guacamole 将用于身份验证和存储连接配置数据的数据库
为了简化身份验证的操作,我们只部署 guacamole/guacd 和 guacamole/guacamole,身份验证使用配置文件的方式完成。
2.2.1、部署 guacamole/guacd
guacd 和 guacamole 在同一台机器上,所以不设置端口暴露。另外需要注意,guacd 是个被动代理,本身不具备身份认证的能力,如果对不可信任网络暴露端口的话,恶意用户可能使用 guacd 跳转到其他系统。
docker run --name some-guacd -d guacamole/guacd
2.2.2、部署 guacamole/guacamole
由于不使用数据库来作为身份验证,需要在启动时指定本地的配置文件目录。
docker run --name some-guacamole \
--link some-guacd:guacd \
-v /local/path:/etc/guacamole \
-e GUACAMOLE_HOME=/etc/guacamole \
-p 8080:8080 \
-d guacamole/guacamole
浏览器打开 http://localhost:8080/guacamole/ 已经可以看到登录页面,不过也需要在 /etc/guacamole/ 目录完成用户和连接的配置,才能正常开始使用。
3、配置 & 验证
Guacamole 的默认身份验证模块很简单,由用户名到配置的映射组成。这个身份验证模块始终处于启用状态,但只会从 XML 文件中读取(如果存在),并且相对于任何其他身份验证扩展,优先级始终位于最后。
默认的身份验证 XML 文件位于 GUACAMOLE_HOME/user-mapping.xml,如果没有重新设置 GUACAMOLE_HOME 的话,默认指向的就是 /etc/guacamole/user-mapping.xml 文件。
3.1、SSH 连接
修改 /etc/guacamole/user-mapping.xml 添加 SSH 连接。这里没有直接把 SSH 连接的账号密码配置进去,所以登录的时候需要再输一遍。
由于服务器本身开启了 SSHD 服务,我们直接用本地服务器进行验证即可。
浏览器打开 http://localhost:8080/guacamole-1.3.0/,使用 authorize 中配置的账号密码进行登录。
再次输入本地服务器的 SSH 账号密码进行登录,连接成功。
可以看到字体出现了问题,我们可以通过 yum 安装字体解决这个问题。
# yum 查询字体
yum search font
# yum 安装字体
yum install -y thai-scalable-*
重新启动后,可以看到界面字体显示正常。
3.2、VNC 连接
系统没有安装图形化桌面和 VNC Server,所以需要先完成安装,才能使用 VNC 进行连接。
# 安装 GNOME 图形化界面
yum groupinstall "GNOME Desktop"
# 安装 VNC Server
yum install -y tigervnc-server tigervnc vnc vnc-server
VNC Server 一般会设置成系统服务的形式启动,不过这次我们没必要这么复杂。首次使用的话,先使用命令设置登录密码:
vncpasswd
使用命令启动 VNC Server:
# 指定5901端口启动服务
vncserver :1
# 查看
vncserver -list
使用 VNC Viewer 验证服务是否OK。
修改 /etc/guacamole/user-mapping.xml 添加 VNC 连接。这里也是没有直接把 VNC 连接的账号密码配置进去,所以登录的时候需要再输一遍。
浏览器打开 http://localhost:8080/guacamole-1.3.0/ 登录后,可以看到我们多了一个 VNC 的连接配置。
使用新配置的 VNC 进行连接,输入密码后可以和 VNC Viewer 一样进入到图形化界面。
3.3、RDP 连接
RDP 连接的方式没有记录详细的过程,不过基本连接的配置基本和 SSH、VNC 一样。
大致步骤是:
- 安装 xrdp
- 使用 Windows 系统自带的 `mstsc` 服务进行验证连接
- 修改 guacamole 配置文件,增加 RDP 连接配置
安装 xrdp 方法:
# 配置源
yum install -y epel-release
yum clean all
yum makecache
# 安装 xrdp
yum install -y xrdp tigervnc-server
# 启动 xrdp,默认的启动端口是 3389
systemctl start xrdp.service
4、总结
以上就是本次 Apache Guacamole 的上手实验过程,把 Guacamole 的安装部署和 SSH、VNC 基础的连接功能验证了一遍,不过 SSH、VNC 的连接配置上还有很多可选的配置项待验证。更多的信息请见官方的使用手册。