如何在 Ubuntu 22.04 上通过 Docker 安装 Apache Guacamole
Apache Guacamole 是一个免费的开源远程桌面网关,允许您使用不同的协议(例如 SSH、RDP 和 VNC)远程连接到您的计算机/服务器。 Apache Guacamole 由 Apache Software Foundation 维护,并获得 Apache License 2.0 许可。
Apache Guacamole 是一个无客户端远程桌面网关。您可以随时随地仅使用 Web 浏览器访问 Apache Guacamole。如果您有多个具有不同协议的远程操作系统,例如具有 RDP 的 Windows 和具有 VNC 和 SSH 的 Linux 系统,建议使用 Apache Guacamole。
在本教程中,您将通过 Docker 在 Ubuntu 22.04 服务器上安装 Apache Guacamole - 远程桌面/服务器网关。这包括 Nginx 安装和配置作为 Apache Guacamole 的反向代理。最后,您将让 Apache Guacamole 作为 Docker 容器运行,并通过 Nginx 反向代理上的 SSL/TLS 证书来保护安装。
先决条件
要开始学习本教程,您必须满足以下要求:
- 运行 Ubuntu 22.04 服务器的 Linux 服务器。
- 具有 sudo/root 管理员权限的非 root 用户。
- 域名指向服务器IP地址。
就是这样。当要求准备就绪后,您现在可以开始安装 Apache Guacamole。
安装 Docker 引擎和 Docker Compose
在本教程中,您将通过 Docker 和 Docker compose 运行并安装 Apache Guacamole 作为容器服务。此示例使用全新通用的 Ubuntu 22.04 服务器,因此这包括 Docker 和 Docker compose 安装。
首先,运行以下 apt 命令来安装基本依赖项。出现提示时输入 y,然后按 ENTER 继续。
sudo apt install ca-certificates curl gnupg lsb-release
输出 :
接下来,运行以下命令来添加 Docker 包的 GPG 密钥和存储库。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
输出 :
之后,通过下面的 apt 命令更新并刷新您的 Ubuntu 软件包索引。
sudo apt update
输出 :
添加 Docker 存储库后,您现在可以使用以下 apt 命令安装 Docker 引擎和 Docker Compose 插件。出现提示时,输入 y,然后按 ENTER 继续。
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
输出 :
Docker 服务将自动启动并启用。您可以通过以下 systemctl 命令实用程序验证 Docker 服务。
sudo systemctl is-enabled docker
sudo systemctl status docker
您应该得到一个输出,表明 Docker 服务已启用并将在启动时自动运行。并且Docker服务的状态是运行中。
最后,要允许非 root 用户运行 Docker 容器,您必须将您的用户添加到“docker”组。运行下面的 usermod 命令将您的用户添加到“docker”组。另外,请务必更改您的用户的用户名。
sudo usermod -aG docker alice
您现在可以以您的用户身份登录并通过以下命令运行 Docker 容器。
su - alice
docker run hello-world
成功后,您应该从 Docker 容器中收到 hello-world 消息,如下图所示。
安装 Docker 和 Docker compose 后,接下来您将开始为 Apache Guacamole 部署创建项目目录。
设置项目目录
首先,通过运行以下命令确保您已以非 root 用户身份登录。
su - alice
创建一个新的项目目录“~/guacamole-server”并将工作目录移入其中。
mkdir -p guacamole-server; cd guacamole-server/
然后,在“~/guacamole-server”目录中创建一个新目录“init”和“docker-compose.yml” ' 文件。
mkdir -p init
touch docker-compose.yml
接下来,运行以下“docker pull”命令下载 Apache Guacamole 安装所需的 Docker 映像。您将下载三个不同的映像,guacd 作为代理管理器,guacamole 作为 Apache Guacamole 的前端,以及 postgres:13将用作 Apache Guacamole 容器的数据库后端。
docker pull guacamole/guacd
docker pull guacamole/guacamole
docker pull postgres:13
下载 guacd 映像。
下载鳄梨酱图像。
下载 PostgreSQL 13 映像。
下载必要的 Docker 映像后,执行以下命令来运行新的鳄梨酱容器并运行“initdb.sh”脚本来为您的部署生成数据库架构。这样,您将生成一个鳄梨酱数据库架构“init/initdb.sql”。
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgres > init/initdb.sql
通过下面的 cat 命令验证鳄梨酱数据库架构的内容。
cat init/initdb.sql
输出 :
设置 docker-compose.yml
现在已经下载了必要的 Docker 映像,您可以开始配置“docker-compose.yml”脚本并设置 Apache Guacamole 安装。
首先使用以下 nano 编辑器命令打开配置文件“docker-compose.yml”。
nano docker-compose.yml
将以下行添加到文件中。
version: '3.7'
networks
networks:
guacnet:
driver: bridge
services
services:
guacd:
container_name: guac_guacd
image: guacamole/guacd
networks:
guacnet:
restart: always
postgres:
container_name: guac_postgres
environment:
PGDATA: /var/lib/postgresql/data/guacamole
POSTGRES_DB: guacamole_db
POSTGRES_PASSWORD: 'ChangeThisPassword'
POSTGRES_USER: guacamole_user
image: postgres:13
networks:
guacnet:
restart: always
volumes:
- ./init:/docker-entrypoint-initdb.d:ro
- ./data:/var/lib/postgresql/data:rw
guacamole:
container_name: guac_guacamole
depends_on:
- guacd
- postgres
environment:
GUACD_HOSTNAME: guacd
POSTGRES_DATABASE: guacamole_db
POSTGRES_HOSTNAME: postgres
POSTGRES_PASSWORD: 'ChangeThisPassword'
POSTGRES_USER: guacamole_user
image: guacamole/guacamole
links:
- guacd
networks:
guacnet:
ports:
- 8080:8080/tcp
restart: always
完成后保存并关闭文件“docker-compose.yml”。
使用此“docker-compose.yml”脚本,您将创建三个容器/服务,如下所示:
- guacd - Apache Guacamole 的主要组件,用于代理多种协议,例如 SSH、RDP、VNC 等。
- postgres - Apache Guacamole 安装的数据库后端。您的数据将存储在该容器中。
- guacamole - 连接到 PostgreSQL 和 guacd 服务的 Apache Guacamole Web 应用程序。该容器将在您的主机上公开端口 8080。
启动 Apache 鳄梨酱
开始之前,请确保您位于“guacamole-server”项目目录中。然后,运行以下“docker compose”命令来创建并启动 Apache Guacamole 部署。
docker compose up -d
您应该收到如下输出 - 创建并启动了 3 个不同的容器 guac_postgres、guac_guacd 和 guac_guacamole。
通过以下命令验证 Apache Guacamole 项目上正在运行的服务/容器的列表。
docker compose ps
如果您看到“STATUS”为“Up”,则容器/服务正在运行。在“端口”部分,您应该看到容器向主机公开的端口。
“guac_guacamole”容器在容器和 Docker 主机上都公开了 TCP 端口 8080。这样,您就可以访问您的 Apache Guacamole 安装。
打开您的网络浏览器并访问您的服务器 IP 地址和端口 8080(即:http://192.168.5.100:8080/)。您将看到 Apache Guacamole 登录页面。
通过默认用户“guacadmin”和密码“guacadmin”登录。然后按登录确认。
成功后,您应该会获得 Apache Guacamole 用户仪表板。
至此,确认通过 Docker 和 Docker compose 进行的 Apache Guacamole 安装已完成并成功。但是,对于本教程,仍然需要执行一些操作来保护您的 Apache Guacamole 部署。
此外,当您在 Apache Guacamole 部署中遇到错误时,您可以通过下面的“docker compose”命令检查每个容器的日志。
用于检查日志的基本用法“docker compose”。
docker compose logs
docker compose logs SERVICE
通过“docker compose”命令检查特定容器/服务的日志。
docker compose logs guacamole
docker compose logs guacd
docker compose logs postgres
安装 Nginx Web 服务器
在本教程中,您将使用 Nginx 反向代理运行 Apache Guacamole。在本部分中,您将安装 Nginx Web 服务器和 Certbot 工具来生成 SSL/TLS 证书。然后,您将验证 Nginx 服务以确保该服务已启用并正在运行。
运行以下 apt 命令安装 Nginx、Certbot 和 Certbot Nginx 插件。当提示确认时输入 y,然后按 ENTER 继续。
sudo apt install nginx certbot python3-certbot-nginx
Nginx和Certbot安装完成后,运行以下命令验证Nginx服务状态。这将确保 Nginx 服务已启用并在您的系统上运行。
sudo systemctl is-enabled nginx
sudo systemctl status nginx
输出“enabled”确认 Nginx 服务已启用,并将在系统启动时自动运行。输出“活动(正在运行)”确认 Nginx 服务正在运行。
设置 UFW 防火墙
安装 Nginx 后,接下来您将设置默认安装在 Ubuntu 系统上的 UFW 防火墙。在本部分中,您将添加 OpenSSH 服务以打开端口 22,并添加“Nginx Full”服务以在 ufw 上打开 HTTP 和 HTTPS 端口。然后,您将启动并启用 ufw。最后,您将验证 ufw 防火墙的状态。
输入以下命令将 OpenSSH 和“Nginx Full”服务添加到 ufw 防火墙。输出“规则已更新”确认新规则已添加到 ufw。
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
接下来,输入以下命令启动并启用 ufw 防火墙。出现提示时输入 y,然后按 ENTER 继续。
sudo ufw enable
您现在应该得到诸如“防火墙处于活动状态并在系统启动时启用”之类的输出,这意味着 ufw 防火墙正在运行且已启用,并将在系统启动时自动启动。
输入以下命令验证 ufw 防火墙的状态。
sudo ufw status
您应该获得 ufw 防火墙“活动”的状态,并启用将打开 SSH 端口 22 的服务“OpenSSH”和“Nginx Full” ' 将打开 HTTP 和 HTTPS 端口的服务。
设置 Nginx 作为反向代理
为了保护您的 Apache Guacamole 部署,您将使用 Nginx 作为反向代理并在其上启用 HTTPS 安全连接。
在本部分中,您将创建一个新的 Nginx 服务器块配置,该配置将用作 Apache Guacamole 的反向代理,然后通过 Certbot 和 Letsencrypt 生成 SSL/TLS 证书以保护 Apache Guacamole 部署。
使用以下 nano 编辑器命令创建新的 Nginx 服务器块配置“/etc/nginx/sites-available/guacamole.conf”。
sudo nano /etc/nginx/sites-available/guacamole.conf
将以下行添加到文件中,并确保更改下面配置中的域名。这样,您就可以将 Nginx 设置为 Apache Guacamole 容器的反向代理,该容器在 Docker 主机上公开端口 8080。
server {
listen 80;
server_name guacamole.hwdomain.io;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
access_log /var/log/nginx/guac_access.log;
error_log /var/log/nginx/guac_error.log;
location / {
proxy_pass http://127.0.0.1:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_cookie_path /guacamole/ /;
}
}
完成后保存并关闭文件。
接下来,运行以下命令激活 Nginx 服务器块文件“/etc/nginx/sites-available/guacamole.conf”。然后,验证 Nginx 配置以确保设置正确。
sudo ln -s /etc/nginx/sites-available/guacamole.conf /etc/nginx/sites-enabled/
sudo nginx -t
如果成功,您应该得到诸如“测试成功 - 语法正常”之类的输出。
现在运行以下 systemctl 命令实用程序以重新启动 Nginx 服务并应用更改。
sudo systemctl restart nginx
输出 :
此时,Apache Guacamole 正在使用 Nginx 作为您的域名的反向代理运行 - 本示例使用域“guacamole.hwdomain.io”。现在,为了保护您的 Apache Guacamole 部署,您需要通过 Certbot 和 Letsencrypt 生成 SSL/TLS 证书。
输入以下 certbot 命令为您的 Nginx 虚拟主机生成新的 SSL 证书。请务必在以下命令中更改详细域名和电子邮件地址。
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email -d guacamole.hwdomain.io
生成后,您的 SSL 证书将在“/etc/letsencrypt/live/guacamole.hwdomain.io/”目录中可用。此外,您的 Nginx 服务器块将在启用 SSL 的情况下自动更改,并自动从 HTTP 重定向到 HTTPS。
访问 Apache 鳄梨酱
打开 Web 浏览器并访问 Apache Guacamole 安装的域名(即:https://guacamole.hwdomain.io/)。
使用默认用户和密码“guacadmin”登录。
成功后,您应该会获得 Apache Guacamole 用户仪表板。
至此,您已经通过 Docker 和 Docker compose 完成了 Apache Guacamole 安装。此外,您已将 Nginx 配置为 Apache Guacamole 的反向代理,并通过 Letsencrypt 的 SSL/TLS 证书对其进行保护。
在下一步中,您将学习 Apache Guacamole 的基本用法。
Apache Guacamole 的基本用法
在这一步中,您将学习 Apache Guacamole 的基本用法。您将删除默认的 guacadmin 用户以保护您的部署,为 Apache Guacamole 设置新的管理员用户,设置连接组,最后设置新的 SSH 连接。
最后,您还将通过 Apache Guacamole 连接到 SSH 服务器来验证新连接。
创建新用户
单击右上角的“guacadmin”菜单,然后选择“设置”。
选择“用户”选项卡,您应该会看到默认的“guacadmin”用户。单击“新用户”按钮创建新的 Apache Guacamole 用户。
输入将用于登录的详细用户名,然后输入密码并重复。
在“个人资料”部分,输入用户详细信息,例如全名、电子邮件地址和组织名称。
在“权限”部分,选择所有选项以使该用户成为 Apache Guacamole 安装的管理员。
单击保存确认并创建新用户。然后,从默认的“guacadmin”用户注销。
接下来,使用新用户登录并验证用户配置。
如果成功,您应该会看到 Apache Guacamole 用户仪表板。
现在点击您的用户并选择“设置”。然后单击“用户”选项卡以验证 Apache Guacamole 上的用户列表。您应该看到新用户已创建。
单击默认用户“guacadmin”以获取有关默认用户的详细信息。滚动到底部页面并单击“删除”按钮以删除默认的“guacadmin”用户。
再次点击删除进行确认。
删除默认的“guacadmin”用户后,Apache Guacamole 上唯一剩余的用户就是您的新用户。
现在,您已经在 Apache Guacamole 上创建了一个新的管理员用户,并删除了默认的“guacadmin”用户。删除默认用户“guacadmin”将减轻密码猜测攻击。
创建新连接
确保您已进入 Apache Guacamole“设置”页面。
选择“连接”选项卡,然后单击“新建组”按钮创建新的连接组。
输入群组名称和位置,然后选择类型。在此示例中,您将创建一个新组“SSH-SERVER”。您还可以在“并发限制”部分中为此组中的每个连接设置连接限制。
单击保存进行确认。
现在您应该在连接列表中找到组“SSH-SERVER”。
接下来,单击“新建连接”按钮在 Apache Guacamole 上创建新连接。
输入连接名称,选择默认位置,然后选择该连接的协议。在此示例中,您将创建一个可在“SSH-SERVER”组中使用的SSH连接“Test SSH”。
在“参数”部分,输入主机或 IP 地址、端口、用户名、密码和 SSH 密钥(启用时)的详细信息。
滚动到底部页面并单击保存进行确认。
这样,您现在应该在“SSH-SERVER”组上获得可用的新连接“Test SSH”。
要连接到新的“测试 SSH”连接,请返回到 Apache Guacamole 家庭用户仪表板,您应该会看到连接列表。
单击“测试 SSH”连接进行连接。
如果您未在详细信息连接上提供密码,系统将提示您输入 SSH 服务器的密码。
考虑到这一点,您现在已经创建了一个新用户,删除了默认用户 guacadmin,设置了一个连接组,并在 Apache Guacamole 上创建了一个连接。
结论
在本教程中,您学习了如何通过 Docker 和 Docker Compose 在 Ubuntu 22.04 服务器上部署 Apache Guacamole。您已经部署了 Apache Guacamole,其中 PostgreSQL 作为数据库后端,Nginx 作为前端的反向代理。除此之外,您还使用 Letsencrypt 的 SSL/TLS 证书保护 Apache Guacamole 部署并配置了 ufw 防火墙。
最后,您还学习了 Apache Guacamole 的基本管理。从创建用户、删除用户、设置连接组以及在 Apache Guacamole 上创建新连接。
完成所有这些后,您就完成了基本的 Apache Guacamole 部署。要了解更多信息,请查看 Apache Guacamole 的官方文档。您可以添加第三方集成,例如 LDAP 身份验证、Radius 身份验证、TOTP 二因素身份验证、SAML 等等。