Apache Guacamole 远程桌面网关教程:浏览器打开家里的 Windows / Linux 主机
Apache Guacamole 远程桌面网关教程:浏览器打开家里的 Windows / Linux 主机
家里有一台 Windows 主机、办公室有一台 Linux 服务器,想临时远程看一眼,最烦的不是远程桌面本身,而是每台机器都要装客户端、配端口、记地址。
Apache Guacamole 适合解决这个问题:把 RDP、VNC、SSH 收到一个 Web 入口里,人在外面只打开浏览器,就能进对应的远程会话。
这篇直接跑一套 Docker 版 Guacamole。公网访问部分只映射 Guacamole Web 面板,不把 3389、5900、22 这类服务端口直接丢到公网。最近 CSDN 上远程终端、远程控制相关内容热度不低,本质原因也很直接:远程接入是刚需,但安全边界不能糊。
1 什么是 Apache Guacamole?这篇里它负责什么
Apache Guacamole 是一个无客户端远程桌面网关。这里的“无客户端”不是说被控机器不用开远程服务,而是访问端不用再装 RDP、VNC、SSH 客户端。
它的访问链路可以这样理解:
浏览器访问 Guacamole Web 页面,Guacamole 把你的操作转给guacd,guacd再去连接内网里的 Windows、Linux 或其他主机。
这篇里 Guacamole 主要做三件事:
- 统一管理 RDP、VNC、SSH 连接;
- 让外部访问只面对一个 Web 入口;
- 隐藏后端主机的真实远程端口,减少直接暴露面。
适合的场景也很清楚:
- 家里有 Windows 主机,偶尔要从外面打开远程桌面;
- 公司内网有 Linux 机器,希望用浏览器临时进 SSH;
- 不想在每台电脑、平板上反复安装远程客户端;
- 想把远程入口集中起来,再统一做账号和访问控制。
提醒一句:Guacamole 是网关,不是免配置神器。Windows 仍然要开启远程桌面,Linux 仍然要有 SSH 服务,VNC 主机也要先启动 VNC Server。
2 环境准备:先把端口和目录定下来
下面用一台 Linux 主机做演示,机器上需要安装 Docker 和 Docker Compose 插件。Windows、macOS 也能跑 Docker Desktop,但家庭服务器、NAS、云主机里,Linux 更常见,排错也更直观。
本教程使用这些端口和服务名:
| 项目 | 值 |
|---|---|
| Guacamole Web 本地端口 | 8080 |
| Web 访问路径 | http://服务器IP:8080/guacamole/ |
| guacd 内部端口 | 4822,不对公网开放 |
| PostgreSQL | 仅 Docker 内部网络访问 |
| cpolar 映射目标 | 本机8080 |
先建一个工作目录:
mkdir -p ~/guacamole-docker cd ~/guacamole-dockerGuacamole 需要数据库保存用户和连接配置。这里用 PostgreSQL,原因很简单:官方 Docker 文档里 PostgreSQL 是常规搭配,后续升级时数据库数据也能单独保留。
3 使用 Docker Compose 部署 Guacamole
Guacamole 的 Docker 部署通常由三个容器组成:
guacd:真正负责 RDP、VNC、SSH 协议转发;guacamole:Web 页面和后端应用;postgres:保存用户、连接、权限配置。
3.1 生成 PostgreSQL 初始化脚本
官方guacamole/guacamole镜像内置了数据库初始化脚本。先把 PostgreSQL 需要的 SQL 导出来:
docker run --rm guacamole/guacamole:1.6.0 \ /opt/guacamole/bin/initdb.sh --postgresql > initdb.sql执行完后检查文件是否生成:
ls -lh initdb.sql能看到initdb.sql文件,就说明数据库表结构脚本已经准备好。这里别手动改 SQL,改错后 PostgreSQL 首次初始化会失败,后面还要清空数据卷重来。
3.2 编写 docker-compose.yml
在当前目录创建docker-compose.yml:
cat > docker-compose.yml <<'EOF' services: postgres: image: postgres:16-alpine container_name: guacamole-postgres restart: unless-stopped environment: POSTGRES_DB: guacamole_db POSTGRES_USER: guacamole_user POSTGRES_PASSWORD: change_this_postgres_password volumes: - ./postgres-data:/var/lib/postgresql/data - ./initdb.sql:/docker-entrypoint-initdb.d/initdb.sql:ro guacd: image: guacamole/guacd:1.6.0 container_name: guacamole-guacd restart: unless-stopped guacamole: image: guacamole/guacamole:1.6.0 container_name: guacamole-web restart: unless-stopped depends_on: - guacd - postgres environment: GUACD_HOSTNAME: guacd POSTGRESQL_HOSTNAME: postgres POSTGRESQL_DATABASE: guacamole_db POSTGRESQL_USER: guacamole_user POSTGRESQL_PASSWORD: change_this_postgres_password ports: - "8080:8080" EOF这里有两个地方别填错:
POSTGRES_PASSWORD和POSTGRESQL_PASSWORD必须一致;GUACD_HOSTNAME填 Compose 里的服务名guacd,不是服务器 IP。
如果这是正式长期使用的环境,把change_this_postgres_password换成一串长密码。只是在内网临时测试,也建议直接换掉,少给自己留坑。
3.3 启动容器
启动整套服务:
docker compose up -d查看容器状态:
docker compose ps正常情况下,能看到guacamole-postgres、guacamole-guacd、guacamole-web都处于运行状态。
再看一下日志:
docker compose logs --tail=80 guacamole如果日志里没有反复重启、数据库连接失败、认证扩展加载失败,就可以进入本地访问验证。
4 本地访问验证:先在内网把 Guacamole 跑通
打开浏览器访问:
http://服务器IP:8080/guacamole/如果就在服务器本机操作,也可以用:
http://127.0.0.1:8080/guacamole/Guacamole 默认账号是:
用户名:guacadmin 密码:guacadmin登录后第一件事不是添加连接,而是改默认密码。路径是右上角用户名菜单里的Settings,进入后在用户设置里修改guacadmin的密码。
这里别偷懒。默认账号一旦配合公网入口使用,风险非常高。改完密码后退出重新登录,确认新密码生效,再继续添加连接。
5 添加 RDP / VNC / SSH 连接
Guacamole 的连接配置在管理后台里完成。登录后进入Settings,找到Connections,新建连接。
5.1 添加 Windows RDP 连接
Windows 远程桌面走 RDP,常用端口是3389。新建连接时可以这样填:
- Name:例如
home-windows-rdp; - Protocol:选择
RDP; - Hostname:填写 Windows 主机的内网 IP;
- Port:填写
3389; - Username:填写 Windows 用户名;
- Password:填写该用户密码。
这一步的关键不是 Guacamole,而是 Windows 自己要允许远程桌面连接。Windows 端需要确认:
- 已开启远程桌面;
- 当前用户有远程登录权限;
- Windows 防火墙允许远程桌面;
- Guacamole 所在机器能访问 Windows 的
3389端口。
在 Guacamole 里保存后,回到主页点击连接。能看到 Windows 登录桌面,就说明 RDP 链路已经打通。
5.2 添加 VNC 连接
VNC 适合一些 Linux 桌面、树莓派桌面或已有 VNC Server 的机器。常见端口是5900,不同 VNC Server 会有差异,按实际服务端配置填写。
新建连接时选择VNC,重点填写:
- Hostname:VNC 主机的内网 IP;
- Port:VNC 服务端口,例如
5900; - Password:VNC Server 设置的访问密码。
如果点开后黑屏或断开,先回到 VNC 主机上确认 VNC Server 正在运行,再从 Guacamole 服务器测试端口连通性:
nc -vz 192.168.1.50 5900把192.168.1.50换成你的 VNC 主机 IP。能连通再查 Guacamole 配置,连不通就先处理 VNC 主机、防火墙和网段问题。
5.3 添加 Linux SSH 连接
SSH 更适合服务器维护。新建连接选择SSH,填写:
- Hostname:Linux 主机内网 IP;
- Port:通常是
22; - Username:SSH 用户名;
- Password:密码登录时填写;
- Private key:密钥登录时填写私钥内容。
建议先在 Guacamole 服务器上测试 SSH:
ssh user@192.168.1.60如果服务器本机都连不上,Guacamole 页面里也不会成功。这里先把网络、用户名、认证方式处理好,再回 Guacamole 添加连接,排错会轻松很多。
6 用 cpolar 临时映射 Guacamole Web 面板
内网已经能访问 Guacamole 后,再考虑外网入口。这里的安全思路很明确:只映射8080上的 Guacamole Web 面板,不直接映射 Windows 的3389、VNC 的5900、SSH 的22。
6.1 安装并启动 cpolar
Linux 上可以使用官方一键安装脚本:
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash安装完成后,确认命令可用:
cpolar version打开本地管理页面:
http://127.0.0.1:9200如果是在没有桌面的服务器上操作,可以用浏览器访问服务器 IP 的9200端口,或者按 cpolar 文档使用命令行绑定账号。常见方式是登录 Web UI 完成账号绑定;纯命令行环境可使用:
cpolar authtoken YOUR_CPOLAR_AUTHTOKEN把YOUR_CPOLAR_AUTHTOKEN换成你自己账号后台里的 authtoken。不要把 token 写进公开文章、截图或仓库。
6.2 创建 HTTP 隧道映射 8080
Guacamole Web 面板跑在本机8080,所以这里开 HTTP 隧道:
cpolar http 8080命令运行后,终端会显示公网访问地址。也可以打开 cpolar Web UI,在状态 → 在线隧道列表查看生成的公网地址。
拿到公网地址后,访问路径要带上 Guacamole 的应用路径:
https://你的cpolar公网地址/guacamole/如果只打开根路径看到 404 或空页面,先检查 URL 后面有没有/guacamole/。这是很多人第一次跑 Guacamole 时最容易卡住的点。
6.3 用完就关,不把临时入口当长期入口
临时访问结束后,在运行cpolar http 8080的终端按Ctrl + C,隧道就会关闭。
如果使用 Web UI 创建了隧道,也要回到 cpolar 管理页面停掉对应隧道。免费随机公网地址 24 小时内会变化;固定二级子域名需要基础套餐或以上。本文这个场景更推荐临时打开、用完关闭,安全边界更清楚。
7 外网访问的安全边界
远程桌面工具最怕“能用”之后忘了收口。Guacamole 已经帮我们把多个远程协议统一到 Web 入口,但它不是免死金牌。
建议照着下面几条做:
- Guacamole 默认账号
guacadmin/guacadmin必须改掉; - 给 Guacamole 用户设置强密码,不要和 Windows、Linux 主机密码重复;
- 不要把
3389、5900、22直接映射到公网; - cpolar 隧道按需开启,用完关闭;
- 敏感主机、生产数据库所在机器,不放进临时远程入口;
- 只给需要的人开对应连接,不要所有连接都塞进同一个共享账号。
还有一个容易忽略的点:guacd的4822端口不要暴露给不可信网络。官方文档也明确提醒,guacd本身是被动代理,不负责用户认证。本文的 Compose 文件没有把4822映射到宿主机,这个设计要保留。
8 常见问题排查
8.1 容器没启动
先看状态:
docker compose ps再看日志:
docker compose logs --tail=120如果 PostgreSQL 初始化失败,重点检查initdb.sql是否存在、postgres-data是否已经残留了错误初始化数据。PostgreSQL 只会在数据目录为空时执行/docker-entrypoint-initdb.d/里的 SQL。
测试环境要重来,可以停止并删除本目录下的数据:
docker compose down rm -rf postgres-data docker compose up -d这条命令会删除 Guacamole 数据库里的用户和连接配置,只适合刚搭建时重置环境。
8.2 登录 Guacamole 失败
确认访问路径是:
http://服务器IP:8080/guacamole/默认账号是guacadmin,默认密码也是guacadmin。如果已经改过密码,就使用新密码。仍然登录失败时,看guacamole-web日志:
docker compose logs --tail=120 guacamole如果日志提示数据库认证或连接异常,检查 Compose 文件里的 PostgreSQL 用户、库名、密码是否前后一致。
8.3 RDP 连接不上
Windows 端按顺序检查:
- 远程桌面已经开启;
- Windows 版本支持远程桌面服务;
- 登录用户有远程访问权限;
- 防火墙允许 RDP;
- Guacamole 服务器能访问 Windows 的
3389。
在 Guacamole 服务器上测试端口:
nc -vz 192.168.1.20 3389端口不通就先处理 Windows 主机、防火墙、网段或路由问题,不要急着改 Guacamole 配置。
8.4 VNC 或 SSH 连接不上
VNC 先确认服务端口,例如:
nc -vz 192.168.1.50 5900SSH 先确认账号能在服务器本机连上:
ssh user@192.168.1.60如果 SSH 使用密钥登录,把私钥内容填入 Guacamole 的 Private key 字段。私钥有 passphrase 时,也要在对应字段填写口令。
8.5 cpolar 公网地址打不开
按这条链路查:
- 本机先访问
http://127.0.0.1:8080/guacamole/; - 确认
cpolar http 8080正在运行; - 打开
http://127.0.0.1:9200,查看在线隧道列表; - 公网地址后面补上
/guacamole/; - 检查服务器防火墙没有拦截本地
8080服务。
如果本地8080都打不开,先回 Docker 排查。cpolar 只负责把入口转进来,不负责让本地应用启动。
9 总结
这套流程跑完后,你已经有了一个浏览器版远程入口:内网里的 Windows 走 RDP,Linux 走 SSH,需要桌面时走 VNC;外部访问时,只临时映射 Guacamole Web 面板,不把各台主机的远程端口直接暴露出去。
关键步骤可以压缩成三件事:
- 用 Docker Compose 启动
postgres + guacd + guacamole; - 在 Guacamole 里添加 RDP、VNC、SSH 连接,并先完成本地验证;
- 用 cpolar 临时映射
8080,外网访问公网地址/guacamole/,用完关闭隧道。
后续要长期使用,再考虑固定域名、反向代理 HTTPS、更多账号权限和审计策略。临时远程维护场景里,先把入口收敛到 Guacamole,再按需打开公网访问,比裸露多个远程端口省事,也更容易控制风险。
你如果也准备照着搭一套,欢迎在评论区说一下你卡在哪一步:RDP、VNC、SSH、Docker,还是公网访问?我后面可以单独把高频坑再整理一篇。
