部署Guacamole跳板机平台
Apache Guacamole是一个可以通过浏览器访问远程桌面的应用,它无需在访问者界面部署任何软件(clientless),且支持主流的VNC,RDP,SSH等协议。本文主要介绍如何通过华为云stack部署一个Guacamole平台,支持云外的用户进行远程访问。
部署和架构
Guacamole不是一个完全独立的(self-contained)网络应用,它由一个简单轻量的网络应用搭配主要的底层组件构成的。
当用户通过浏览器连接一个Guacamole服务器时,Guacamole client组件通过内置于Guacamole 服务器的webserver提供给用户(servered to users by a webserver within the Guacamole server)。继而这个client使用Guacamole协议通过HTTP连接回Guacamole服务器。
部署着Guacamole server的网络应用(e.g. apache nginx)读取Guacamole 协议并转发给Guacamole原生代理guacd。 这个代理解析请求并代表用户访问远程桌面服务。
Guacamole协议结合guacd服务共同保证了:无论是Guacamole client还是网络应用都无需感知远程桌面的传输协议。
Guacamole协议
网络应用并不明白任何的远程桌面协议,它只需要理解Guacmole协议。这个协议支持远程显示的渲染和事件的传输工作。
作为一个远程展示和交互的协议,Guacmole整合了当前很多的远程桌面协议。向Guacmole添加一个远程桌面协议可以理解为在远程桌面协议(如RDP)和Guacmole协议直接写入一个中介传输层。操作这个中间层和直接操作本地服务并无太大区别。
这个中介层就是guacd
guacd
guacd是Guacamole的核心,它动态的载入对远程桌面协议的支持,并且接受网络应用的指示连接远程桌面。
guacd是一个守护进程,它与Guacmole一起安装并在后台运行并监听网络应用的TCP连接请求。guacd同样不理解具体的远程桌面协议,但是它通过Guacamole协议知道需要调用并且加载相应的协议插件,当客户端插件(client plugin)被加载,它就可以独立于guacd运行并拥有全部的控制权限直到被关闭。
guacd以及所有的客户端插件都依赖于一个公共包libguac,它使得通过Guacamole协议的交流更加的普适化(abstract)。
网络应用
在Guacamole中,用户直接进行交互的部分是网络应用。它依赖于guacd且仅仅提供认证和网络转发等。
安装Guacamole
Guacamole主要分为2个部分:
guacamole-server提供guacd代理以及相关的依赖。
guacamole-client提供servlent容器(通常为Tomcat)需要的client。
安装guacamole-server
guacamole-server包含所有Guacamole所需的原生的,服务器端的组件。libguac是其中一个公共的C包,它包含了所有基础组件的依赖。
安装guacd会创建一个guacd的守护进程,一般推荐设置为开机自动启动。
在安装之前确保预装了C编译器(e.g. gcc)。
这里我们以CentOS7.6来安装部署一个Guacmole服务。
安装依赖
a. 必选依赖
依赖包名称
说明
Cairo是用语图形化渲染的
libguac依赖它来写PNG图片
安装过程中创建编译包
yum install -y cairo-devel libjpeg-turbo-devel libpng-devel libtool uuid-devel
b. 可选依赖
主要是远程桌面协议的一些依赖包
Library name
Features
操作录屏等功能依赖这个包,如果不需要可以跳过
支持RDP连接,一般这个必选
支持文字布局的包,SSH, telnet,kubernetes必选
支持SSH连接
支持telnet连接
支持kubernetes必选
VNC的语音支持,对于云上服务器非必要
ssh,kubernetes必选,加密guacd的通信,支撑ssh的密钥管理
支持WebP,处理图像的扩展
yum install -y ffmpeg-devel freerdp-devel pango-devel libssh2-devel libtelnet-devel libvncserver-devel libwebsockets-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel
# 有些linux版本可能没有相应的包,可以选择跳过
下载源代码
安装Guacamole-server
从下载1.1.0或以上版本。解压
$ tar -xzf guacamole-server-1.2.0.tar.gz
$ cd guacamole-server-1.2.0/
$./configure --with-init-dir=/etc/init.d
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
...
------------------------------------------------
guacamole-server version 1.2.0
------------------------------------------------
Library status:
freerdp2 ............ yes
pango ............... yes
libavcodec .......... yes
libavformat ......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... yes
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebsockets ....... yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
Kubernetes .... yes
RDP ........... yes
SSH ........... yes
Telnet ........ yes
VNC ........... yes
Services / tools:
guacd ...... yes
guacenc .... yes
guaclog .... yes
Init scripts: /etc/init.d
Systemd units: no
Type "make" to compile guacamole-server.
$ make # 使用make进行编译
Making all in src/libguac
make[1]: Entering directory `/home/zhz/guacamole/guacamole-server/src/libguac'
...
make[1]: Leaving directory `/home/zhz/guacamole/guacamole-server/src/protocols/vnc'
make[1]: Entering directory `/home/zhz/guacamole/guacamole-server'
make[1]: Nothing to be done for `all-am'.
make[1]: Leaving directory `/home/zhz/guacamole/guacamole-server'
$ make install # 安装
Making install in src/libguac
make[1]: Entering directory `/home/zhz/guacamole/guacamole-server/src/libguac'
make[2]: Entering directory `/home/zhz/guacamole/guacamole-server/src/libguac'
...
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/zhz/guacamole/guacamole-server/src/protocols/vnc'
make[1]: Leaving directory `/home/zhz/guacamole/guacamole-server/src/protocols/vnc'
make[1]: Entering directory `/home/zhz/guacamole/guacamole-server'
make[2]: Entering directory `/home/zhz/guacamole/guacamole-server'
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/zhz/guacamole/guacamole-server'
make[1]: Leaving directory `/home/zhz/guacamole/guacamole-server'
$ ldconfig # 更新系统缓存
到此安装结束,但是guacd还没有运行,我们需要在Guacamole client安装后运行guacd。
部署Guacamole
直接从下载guacamole.war包,将war包拷贝到/var/lib/tomcat/webapps, 并重启guacd和tomcat服务。
# cp guacamole/target/guacamole-1.2.0.war /var/lib/tomcat/webapps/guacamole.war
#
# /etc/init.d/tomcat7 restart
Stopping Tomcat... OK
Starting Tomcat... OK
# /etc/init.d/guacd start
Starting guacd: SUCCESS
guacd[6229]: INFO: Guacamole proxy daemon (guacd) version 1.2.0 started
Guacamole配置
Guacamole服务的位置(GUACAMOLE_HOME)一般在/etc/guacamole下,这里包含了所有的配置文件和扩展包。
guacamole.properties
主要的Guacamole服务的配置文件,有关Guacamole服务认证、连接等的配置都在这个文件定义。
logback.xml
日志配置,可以选择日志等级。
extensions/
放置Guacamole扩展.jar包的位置
lib/
有些Guacamole扩展.jar包的依赖包的放置位置
数据库认证的配置
首先要在系统预装数据库,Guacamole支持MariaDB,MySQL,PostgreSQL,SQL Server这里以mysql来举例。
同样的到下载guacamole-auth-jdbc-1.2.0.tar.gz包。其中guacamole-auth-jdbc-mysql-1.2.0.jar需要放在extensions/下。访问MySQL官网下载JDBC driver(mysql-connector-java-5.1.47-bin.jar)并放入lib下。
创建Guacamole数据库
首先在mysql中创建数据库
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.20
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_root_password';
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE DATABASE guacamole_db;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER 'guacamole_user'@'localhost' IDENTIFIED BY 'guacamole_user_password';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
# 使用初始化脚本为数据库创建数据表
$ ls schema/
001-create-schema.sql 002-create-admin-user.sql upgrade
$ cat schema/*.sql | mysql -u root -p guacamole_db
Enter password: new_root_password
接下来配置数据库认证文件
vim guacamole.properties
# 贴入下面几行
# MySQL properties
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: some_password
到此安装配置结束,之后就可以通过guacamole平台进行管理了,默认用户密码为guacadmin/guacadmin.