1: 介绍:
Guacamole可以同HTML5来代理远程桌面协议(如: VNC, RDP, Telnet, SSH)
官网: http://guac-dev.org/
2: 架构:
架构图:
架构解释:
用户通过浏览器连接到Guacamole的服务端, Guacamole通过JS写的客户端是为用户提供服务, 服务端和客户端的通信是基于HTTP的私有协议; web应用就是将浏览器客户端的内容接受处理并转发guacd, 就是一个本地代理, Guacamole的协议和提供给guacd的协议是无关的, Guacamole的客户端和web应用不需要知道具体运行的什么协议.
2.1关于Guacamole协议:
web应用完全不需要理解远程桌面协议, 但必须要理解Guacamole的协议(远程显示渲染和事件传输),
而作为一个远程显示和交互协议, Guacamole是现有远程连接协议的集合. 想让Guacamole支持一个新的协议 只需要下一个"翻译"协议的中间层即可. 这个中间件就是guacd
2.2关于guacd
guacd是Guacamole动态支持多种远程桌面协议(这里统称为客户端插件)和基于web连接远程桌面协议的核心.
guacd是一个安装在Guacamole上后台运行的守护进程, 等待来自web的连接. guacd也不需要理解特定的远程桌面协议, 一旦客户端插件开始启动, 他和guacd独立运行, 并且拥有和web应用完全的同学权限.
2.3关于web应用
web应用是直接和用户交付的组件.web应用不理解远程桌面协议, 但依赖guacd; web应用的唯一左右就是提供一个漂亮的web界面和认证.
我们目前用java来写的web应用, 但他可以基于任何语言重写; Guacamole的重点在于API.
2.4关于RealMint
Guacamole现在是一个通用的远程桌面网关, 但并不绝对. Guacamole开始于一个纯净的基于文本的JS写的名字叫做ReaMint的telnet客户端, 这个主意起源于演示, 之所以出名主要是由于他是纯JS写的.
RealMint的隧道主要是用PHP写的, 相对于Guacamole的HTTP的隧道, RealMint的隧道只是简单的长轮询, 并且效率低下. 但是RealMint的键盘部分实现的很好, 目前吸收到了Guacamole中, 但也仅此而已了.
2.5关于VNC客户端
一旦开发者掌握了HTML5的canvas标签, 并且看到他已经被Firefox和Chrome支持了, 就有人想做个JS的的VNC客户端的POC.
这个客户端是纯JS实现的,客户端用的JAVA, 通过将VNC翻译为XML版的. 该客户端的开发是基于VNC本身功能驱动的, 开发范围限制于将一个单独的连接转发给一组用户. 虽然看法速度不是很快,但是足够POC和项目需求了. 在SourceForge上通过Guacamole可以找到
2.6 关于远程桌面网关
开发一个基于文本协议的快速协议即可代表多个远程管理协议. 整个系统以后台运行形式重新构建了, 项目的范围扩展到相对于一个快速的HTML5的远程桌面协议功能足够的VNC客户端和通用API. 现在Guacamole可以用作一个中心网关来连接多个运行不同协议的桌面. 同时也提供可扩展的认证, 当然这里就需要可以通过HTML5访问的一个通用API.
3: 安装:
Guacamole有2个部分:
Guacamole-server: 提供代理和相关依赖库
guacamole-client: 提供服务端容器(如Tomcat)运行的客户端
Guacamole-client可以直接使用二进制程序, 但Guacamole-server就需要通过源码按照了(不要灰心, 很简单的, 并且编译过程也是自动化的)
以下以CentOS为例介绍按照过程:
3.1 服务端安装:
必选依赖:
yum install libjpeg-turbo-devel cairo-devel libjpeg-devel libpng-devel uuid-devel autoconf automake libtool xmvn
可选依赖:
不同的远程连接协议需要的依赖也不一样:
VNC: libVNCServer,
RDP: FreeRDP - 1.0 or higher,
SSH: libssh2, Pango
telnet: libtelnet,Pango
这里以vnc为例:
yum install libvncserver-devel
安装Guacamole-server:
git clone https://github.com/glyptodon/guacamole-server.git
cd guacamole-server/
autoreconf -fi
./configure --with-init-dir=/etc/init.d
make
make install
ldconfig
3.2 安装客户端
yum install tomcat
git clone git://github.com/glyptodon/guacamole-client.git
cd guacamole-client
mvn package
cp guacamole/target/guacamole-0.9.9.war
tomcat监听地址:
在开启IPV6的情况下, tomcat默认只会监听IPV6, 需要手工调整下tomcat的配置/etc/tomcat/server.xml
<Connector port="8080" address="192.168.10.11" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
制定监听地址: address="192.168.10.11" #192.168.10.11为本机IP地址
启动服务:
# service tomcat restart
Redirecting to /bin/systemctl restart tomcat.service
# service guacd restart
Stopping guacd: SUCCESS (not running)
Starting guacd: guacd[112397]: INFO: Guacamole proxy daemon (guacd) version 0.9.9 started
SUCCESS
虽然现在服务都已经启动, 单身现在的Guacamole并不是完全可用的状态
4 Guacamole配置
Guacamole默认从user-mapping.xml读取所有的用户和连接.
目的如下:
最小化部署方便
验证方便
不论认证方式如何, Guacamole的配置主要有2部分组成:
1: 变量GUACAMOLE_HOME所指向的目录: 默认主要从这里寻找配置文件
2: gugcamole.properties: GUacamole和扩展所的主要配置文件
4.1 GUACAMOLE_HOME
Guacamole默认从以以下顺序, 从配置目录中读取配置文件:
1: 系统的guacamole.home属性
2: 系统的GUACAMOLE_HOME变量
3: 运行程序用户的.guacamole目录
Guacamole从$GUACAMOLE_HOME目录中寻找guacamole.properties文件
4.2 guacamole.properties
$GUACAMOLE_HOME目录中包含如下文件:
guacamole.properties:
决定Guacamole如何连接到guacd, 也可以定义插件
api-session-timeout:
单位: 分钟
默认: 60
Guacamole会话的空连接时间
guacd-host:
Guacamole代理的监听地址, 默认localhost
guacd-port:
Guacamole代理的监听端口, 默认4822
guacd-ssl:
Web应用和guacd之间是否使用SSL/TLS, 默认false
logback.xml:
Guacamole使用Logabck来记录日志, 默认记录到console, 也可以指定自己的Logback配置文件
服务代理程序默认会记录日志.
extensions/:
存放Guacamole的插件, 启动时默认会加载所有已.jar结尾的文件
lib/
Guacamole会在这里寻找插件所需要的依赖, 改目录下的.jar文件对所有插件可读
4.3 使用默认认证
默认认证的优先级最低,
配置文件优先级:
1: guacamole.properties:
user-mapping: /path/to/user-mapping.xml
2: GUACAMOLE_HOME/user-mapping.xml
内容类似如下:
<user-mapping>
<!-- Per-user authentication and config information -->
<authorize username="USERNAME" password="PASSWORD">
<protocol>vnc</protocol>
<param name="hostname">localhost</param>
<param name="port">5900</param>
<param name="password">VNCPASS</param>
</authorize>
<!-- Another user, but using md5 to hash the password
(example below uses the md5 hash of "PASSWORD") -->
<authorize
username="USERNAME2"
password="319f4d26e3c536b5dd871bb2c52e3178"
encoding="md5">
<!-- First authorized connection -->
<connection name="localhost">
<protocol>vnc</protocol>
<param name="hostname">localhost</param>
<param name="port">5901</param>
<param name="password">VNCPASS</param>
</connection>
<!-- Second authorized connection -->
<connection name="otherhost">
<protocol>vnc</protocol>
<param name="hostname">otherhost</param>
<param name="port">5900</param>
<param name="password">VNCPASS</param>
</connection>
</authorize>
</user-mapping>
每一个<authorize></authorize> 就是一个独立的用户
可以通过<connection></connection>对特定的主机和协议授权, 默认只能使用DEFAULT的connection
4.3.1协议配置
* vnc:
* hostname: VNC服务器的主机名
* port: vnc端口
* autoretry: 重试次数
* password: vnc密码
* color-depth: 必须是2的次方数
* read-only: 是否只读
* clipboard-encoding: 剪切板编码 ISO8859-1/UTF-8/UTF-16/CP1252
vnc也可以做到支持文件传输和音频传输, 具体可以参考: http://guac-dev.org/doc/gug/configuring-guacamole.html
RDP/PDU相关参数参考: http://guac-dev.org/doc/gug/configuring-guacamole.html
添加用户不需要重启服务. 该文件的修改会立即生效.
4.4认证配置:
以下使用mysql作为认证后端, Guacamole使用mysql需要如下2个文件:
# tree /etc/guacamole/
/etc/guacamole/
├── extensions
│ └── guacamole-auth-jdbc-mysql-0.9.8.jar
└── lib
└── mysql-connector-java-5.1.37-bin.jar
mysql的依赖可以通过http://dev.mysql.com/downloads/connector/j/ 下载
Guacamole-auth的jar 可以从编译目录下查找
创建mysql配置:
MariaDB [(none)]> CREATE DATABASE guacamole_db;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> CREATE USER 'guacamole_user'@'localhost' IDENTIFIED BY 'guacd_password';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
数据库创建完毕后就需要对数据库针对Guacamole做基本的配置, 这里可以直接加载sql,
# locate 001-create-schema.sql | grep mysql
/root/guacamole-client/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/001-create-schema.sql
# cd /root/guacamole-client/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/
# ls
001-create-schema.sql 002-create-admin-user.sql upgrade
# cat *.sql | mysql guacamole_db
注意: 如果版本升级了 还需要执行upgrade目录下的sql
如: mysql guacamole_db < schema/upgrade/upgrade-pre-0.9.6.sql
确认执行成功:
MariaDB [(none)]> use guacamole_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [guacamole_db]> show tables;l
+---------------------------------------+
| Tables_in_guacamole_db |
+---------------------------------------+
| guacamole_connection |
| guacamole_connection_group |
| guacamole_connection_group_permission |
| guacamole_connection_history |
| guacamole_connection_parameter |
| guacamole_connection_permission |
| guacamole_system_permission |
| guacamole_user |
| guacamole_user_permission |
+---------------------------------------+
9 rows in set (0.00 sec)
关于各个表的具体解释参加: http://guac-dev.org/doc/gug/jdbc-auth.html
配置Guacamole使用mysql:
cat /etc/guacamole/guacamole.properties | grep mysql
mysql-hostname: 192.168.10.11
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: guacd_password
mysql-default-max-connections-per-user: 0
mysql-default-max-group-connections-per-user: 0
默认会有一个账号为:guacadmin, 密码也为:guacadmin的用户存在
手工添加用户:
SET @salt = UNHEX(SHA2(UUID(), 256));
INSERT INTO guacamole_user (username, password_salt, password_hash) VALUES ('myuser', @salt, UNHEX(SHA2(CONCAT('mypassword', HEX(@salt)), 256)));
手工添加链接:
INSERT INTO guacamole_connection (connection_name, protocol) VALUES ('test', 'vnc');
SELECT * FROM guacamole_connection WHERE connection_name = 'test' AND parent_id IS NULL;
INSERT INTO guacamole_connection_parameter VALUES (1, 'hostname', 'localhost');
5: 使用Guacamole
通过上面, 我们服务安装好了, 也知道配置文件的目录和意义了, 也知道如何使用数据库作为后端认证和存储了; 下面就开始使用Guacamole.
5.1 配置Guacamole
虽然Guacamole文档上说可以直接通过环境变量引用来获取配置文件, 但我这里并没有成功, 最终还是通过在tomcat目录下软连接才通过, 不过依然设置相应的环境变量:
我们将Guacamole的配置目录设置为/etc/guacamole
1: 将如下内容添加到~/.bashrc 或者 /etc/profile中
GUACAMOLE_HOME=/etc/guacamole
export GUACAMOLE_HOME
2: 软连接
ln -s /etc/guacamole /usr/share/tomcat/.guacamole
最终目录如下:
# tree /etc/guacamole/
/etc/guacamole/
├── extensions
│ └── guacamole-auth-jdbc-mysql-0.9.9.jar
├── guacamole.properties
└── lib
└── mysql-connector-java-5.1.37-bin.jar
重启tomcat,
通过浏览器连接到 http://$IP:8080/$guacamole_dir
$IP: 为Guacamole服务器IP
$guacamole_dir: 为Guacamole的web目录
# ls /var/lib/tomcat/webapps/
guacamole-0.9.9 guacamole-0.9.9.war
如上: $guacamole_dir 为 guacamole-0.9.9
即可看到Guacamole的web界面如下图:
通过默认的账号密码 即可登录,
在数据库中添加链接, 既可以在web中使用.