Ubuntu GNOME 同屏远程桌面配置指南
本篇目录28 个章节
摘要
本文介绍如何在 Ubuntu GNOME 桌面上配置基于 RDP 的同屏远程连接。配置完成后,Windows 客户端可以连接到 Linux 主机当前运行的 GNOME 桌面,并操作该桌面中的应用窗口。
该方案适用于主机通过虚拟 HDMI、采集卡或无显示器方式运行,并需要在启动后自动进入桌面会话的场景。内容涵盖环境检查、GDM 自动登录、TLS 证书、RDP 凭据、GNOME 会话启动服务、Windows 连接、验收与常见故障处理。
适用环境:Ubuntu 22.04、GNOME 桌面、GDM 显示管理器。命令中的示例用户名和 IP 地址应替换为目标环境的实际值。
1. 工作原理与准备条件
GNOME Remote Desktop 运行在已登录的 GNOME 用户会话中。RDP 客户端连接后进入该会话,因此看到的是当前 GNOME 桌面,而不是新建的图形会话。
Windows 远程桌面客户端
│ RDP / TLS,TCP 3389
▼
Ubuntu GNOME Remote Desktop
│
▼
当前已登录的 GNOME 桌面会话
开始前确认以下条件:
- Linux 主机已安装 Ubuntu GNOME 桌面和 GDM。
- 远程使用的 Linux 账户可以登录系统,并具有 sudo 权限。
- Windows 与 Linux 位于可互通的网络中。建议为 Linux 主机配置固定 IP,或在路由器上为其设置 DHCP 地址保留。
- 若主机需要无人值守启动桌面,需启用 GDM 自动登录。自动登录会绕过本机登录屏幕,应根据设备的物理安全要求决定。
- Windows 使用系统自带的远程桌面连接客户端。
RDP 用户名和密码由 GNOME Remote Desktop 单独设置;RDP 密码不等于 Linux 登录密码。
2. 检查并安装组件
在 Linux 终端或 SSH 会话中,以目标桌面用户身份检查系统、用户和组件:
cat /etc/os-release
id
command -v gnome-shell
command -v grdctl
systemctl status gdm3 --no-pager
系统应安装 GNOME 桌面、GDM 显示管理器和 GNOME Remote Desktop。若缺少 RDP 组件或 OpenSSL,安装对应软件包:
sudo apt-get update
sudo apt-get install -y gnome-remote-desktop openssl
确认主机地址和路由:
ip -brief address
ip route
记录 Windows 客户端可以访问的 Linux 主机地址。若该地址会变化,应先在路由器设置 DHCP 地址保留,或按网络环境配置固定地址。
3. 配置 GDM 自动登录
3.1 适用场景
无显示器、虚拟 HDMI 或无人值守运行时,主机启动后可能停留在登录屏幕。GNOME Remote Desktop 需要已经运行的 GNOME 用户会话,因此可通过 GDM 自动登录建立该会话。
若每次启动后都有人在本机手动登录 GNOME,可跳过自动登录步骤;使用同屏远程桌面前仍需先登录桌面。
3.2 修改 GDM 配置
确认 Linux 用户名:
id -un
备份配置文件并打开编辑器:
sudo cp -a /etc/gdm3/custom.conf \
"/etc/gdm3/custom.conf.backup.$(date +%Y%m%d-%H%M%S)"
sudoedit /etc/gdm3/custom.conf
在现有的 [daemon] 区段设置以下参数。将示例中的 linuxuser 替换为实际 Linux 用户名。若文件中已存在同名参数,修改原有行,不要重复添加:
[daemon]
AutomaticLoginEnable=true
AutomaticLogin=linuxuser
WaylandEnable=true
AutomaticLoginEnable 开启自动登录;AutomaticLogin 指定登录账户;WaylandEnable=true 使 GNOME 使用 Wayland 会话,适用于 GNOME 同屏远程桌面。
保存文件后重启 GDM:
sudo systemctl restart gdm3
重启 GDM 会结束并重新创建图形会话,已打开的桌面程序会关闭。SSH 会话通常仍可连接。等待自动登录完成后,列出会话:
loginctl list-sessions
从结果中找到目标用户的会话编号,再将示例编号 11 替换为实际编号:
loginctl show-session 11 -p Name -p Type -p Class -p Active -p Remote -p Seat
目标会话应属于指定 Linux 用户,类型为 wayland,Active=yes,Remote=no,并关联 seat0。
3.3 自动登录的安全影响
启用自动登录后,主机重启会直接进入指定账户桌面。能够接触主机控制台的人也可能使用该桌面。需要恢复本机登录屏幕时,编辑 /etc/gdm3/custom.conf,将 AutomaticLoginEnable 设为 false,然后运行:
sudo systemctl restart gdm3
4. 创建 RDP TLS 证书
GNOME Remote Desktop 使用 TLS 加密 RDP 连接。若没有受信任机构签发的证书,可为内网连接创建自签名证书。Windows 首次连接时会提示确认服务器证书,这是自签名证书的正常行为。
首次创建证书时运行:
mkdir -p ~/.local/share/gnome-remote-desktop
chmod 700 ~/.local/share/gnome-remote-desktop
HOST_NAME=$(hostname -s)
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout ~/.local/share/gnome-remote-desktop/rdp-tls.key \
-out ~/.local/share/gnome-remote-desktop/rdp-tls.crt \
-days 730 -subj "/CN=$HOST_NAME"
chmod 600 ~/.local/share/gnome-remote-desktop/rdp-tls.key
参数说明:
-x509创建自签名证书。-newkey rsa:2048创建新的 RSA 私钥和证书。-nodes让私钥不需要交互解锁,以便无人值守启动桌面服务。-days 730设置证书有效期为 730 天。-subj将主机名写入证书主题。
由于私钥不受口令加密,目录权限设置为 700,私钥权限设置为 600。配置证书和私钥路径:
grdctl rdp set-tls-key "$HOME/.local/share/gnome-remote-desktop/rdp-tls.key"
grdctl rdp set-tls-cert "$HOME/.local/share/gnome-remote-desktop/rdp-tls.crt"
更换现有证书前,先备份原有的 .key 和 .crt 文件。不要将私钥复制到 Windows 客户端或共享目录。
5. 创建 RDP 凭据
5.1 创建独立 RDP 密码文件
使用随机密码,并将它保存在当前用户专属文件中:
mkdir -p ~/.config/gnome-remote-desktop
chmod 700 ~/.config/gnome-remote-desktop
umask 077
openssl rand -hex 18 > ~/.config/gnome-remote-desktop/rdp-share-password
chmod 600 ~/.config/gnome-remote-desktop/rdp-share-password
该文件保存明文 RDP 密码,因此父目录权限必须为 700,文件权限必须为 600。需要向 RDP 客户端输入密码时,可在可信终端查看:
cat ~/.config/gnome-remote-desktop/rdp-share-password
不要将显示出的密码写入文章、截图或聊天记录。
5.2 连接到 GNOME 用户总线
通过 SSH 配置桌面服务时,命令必须连接到目标用户当前 GNOME 会话的 D-Bus。确认目标用户已自动登录后,在同一 Linux 用户的 SSH 会话中运行:
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
export DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/bus"
test -S "$XDG_RUNTIME_DIR/bus" && echo "GNOME 用户总线可用"
若命令显示 GNOME 用户总线可用,即可继续配置。若找不到总线,先确认 GDM 自动登录已经完成。没有图形会话时运行 grdctl,可能无法连接到预期的用户服务。
6. 自动登录后的 RDP 凭据恢复
6.1 密钥环与自动登录
GNOME 通常将桌面服务凭据保存在 Secret Service 密钥环中。手动输入 Linux 登录密码时,GNOME 可以自动解锁登录密钥环;GDM 自动登录不会提供这个密码,因此登录密钥环可能保持锁定。
为保留原登录密钥环并让 RDP 在桌面重启后仍可认证,可在 GNOME 用户会话启动后,将 RDP 凭据写入本次会话的密钥环。下列脚本从受限权限的密码文件读取 RDP 密码,不需要删除或重建原密钥环。
6.2 创建凭据恢复脚本
mkdir -p ~/.local/bin
cat > ~/.local/bin/refresh-gnome-rdp-credentials <<'EOF'
#!/bin/sh
set -eu
RUNTIME="/run/user/$(id -u)"
export XDG_RUNTIME_DIR="$RUNTIME"
export DBUS_SESSION_BUS_ADDRESS="unix:path=$RUNTIME/bus"
n=0
until busctl --user list | grep -q org.freedesktop.secrets; do
n=$((n + 1))
if [ "$n" -ge 30 ]; then
echo "Secret Service 未在 30 秒内启动" >&2
exit 1
fi
sleep 1
done
busctl --user call org.freedesktop.secrets /org/freedesktop/secrets \
org.freedesktop.Secret.Service SetAlias so default \
/org/freedesktop/secrets/collection/session
restore_default_collection() {
busctl --user call org.freedesktop.secrets /org/freedesktop/secrets \
org.freedesktop.Secret.Service SetAlias so default \
/org/freedesktop/secrets/collection/login
}
trap restore_default_collection EXIT
RDP_PASS=$(cat "$HOME/.config/gnome-remote-desktop/rdp-share-password")
grdctl rdp set-credentials "$(id -un)" "$RDP_PASS"
unset RDP_PASS
systemctl --user restart gnome-remote-desktop.service
EOF
chmod 700 ~/.local/bin/refresh-gnome-rdp-credentials
脚本先等待 Secret Service 在用户 D-Bus 上可用,然后临时把默认密钥环集合设为 session,将 RDP 凭据写入其中,并在退出时恢复默认集合为 login。恢复集合的操作由 trap 执行,脚本成功或失败退出时都会尝试恢复。最后脚本重启当前用户的 GNOME Remote Desktop 服务。
6.3 创建 GNOME 用户服务
创建 systemd 用户单元,使凭据恢复脚本随 GNOME 桌面会话启动:
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/refresh-gnome-rdp-credentials.service <<EOF
[Unit]
Description=Restore GNOME RDP credentials for the desktop session
PartOf=gnome-session.target
[Service]
Type=oneshot
ExecStart=$HOME/.local/bin/refresh-gnome-rdp-credentials
RemainAfterExit=yes
[Install]
WantedBy=gnome-session.target
EOF
WantedBy=gnome-session.target 将服务加入 GNOME 会话启动流程;PartOf 将服务生命周期关联到桌面会话;RemainAfterExit=yes 让 systemd 记录脚本已成功执行。
6.4 启用 RDP 和凭据恢复服务
仍在目标用户的 GNOME 会话 SSH 终端中运行:
systemctl --user daemon-reload
grdctl rdp disable-view-only
grdctl rdp enable
systemctl --user enable gnome-remote-desktop.service
systemctl --user enable refresh-gnome-rdp-credentials.service
systemctl --user start refresh-gnome-rdp-credentials.service
disable-view-only 允许远程键盘和鼠标控制桌面。若只允许观看屏幕,将其替换为:
grdctl rdp enable-view-only
检查服务和 RDP 状态:
systemctl --user status refresh-gnome-rdp-credentials.service --no-pager
systemctl --user status gnome-remote-desktop.service --no-pager
grdctl status
状态中应显示 RDP 已启用,TLS 证书和私钥已配置,凭据已设置。不要使用 grdctl status --show-credentials 输出秘密凭据。
7. 配置防火墙(按需)
查看 UFW 状态:
sudo ufw status verbose
若 UFW 已启用,允许 Windows 客户端所在网段访问 TCP 3389。以下示例使用 192.168.1.0/24,应替换为实际局域网网段:
sudo ufw allow from 192.168.1.0/24 to any port 3389 proto tcp
sudo ufw status numbered
若 UFW 关闭且确实需要启用,应先为当前 SSH 管理端口和 RDP 添加允许规则,再启用防火墙。以下示例假设 SSH 使用 TCP 22,管理端位于 192.168.1.0/24:
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 3389 proto tcp
sudo ufw status numbered
sudo ufw enable
启用前核对网段、端口和现有服务规则,避免远程锁定管理连接。若 SSH 使用其他端口,或主机还提供其他入站服务,应先为这些服务添加相应规则。
8. 从 Windows 连接与验收
8.1 检查网络端口
在 Windows PowerShell 中测试连接。将示例地址 192.0.2.10 替换为 Linux 主机的实际 IP:
Test-NetConnection -ComputerName 192.0.2.10 -Port 3389
输出中的 TcpTestSucceeded 应为 True。若为 False,检查主机地址、局域网连通性、防火墙规则和 Linux 端口监听。
8.2 建立 RDP 连接
- 在 Windows 按
Win+R,输入mstsc并回车;也可运行mstsc /v:192.0.2.10。 - 在“计算机”栏填写 Linux 主机的实际 IP。
- 输入
grdctl rdp set-credentials设置的 RDP 用户名和密码。用户名通常是 Linux 桌面用户名;密码是单独生成的 RDP 密码,不是 Linux SSH 登录密码。 - 首次连接出现 TLS 证书确认时,核对目标主机名或 IP 后再继续。
- 登录后确认显示的是预期 GNOME 桌面和桌面会话中的应用窗口。
8.3 Windows 客户端显示与流畅度
在远程桌面连接窗口选择“显示”和“体验”选项:
- 显示分辨率应与虚拟 HDMI 或显示器支持的分辨率匹配。首次连接可从单屏 1920×1080 开始,确认画面稳定后再提高分辨率。
- 同一局域网使用 32 位颜色可保持画面质量;若网络带宽或主机图形性能不足,优先降低分辨率,再关闭桌面背景和动画等视觉效果。
- “体验”中的连接速度选择“局域网”或让客户端自动检测。局域网连接一般不需要降低色彩质量。
- 在“本地资源”中按需要启用剪贴板共享。未使用的本地设备重定向可关闭,以减少额外资源占用。
这些设置只影响 RDP 客户端的显示和传输,不会改变 Linux 桌面账户或 RDP 服务端凭据。
8.4 Linux 端验收命令
grdctl status
systemctl --user is-active gnome-remote-desktop.service
systemctl --user is-active refresh-gnome-rdp-credentials.service
ss -ltn | grep ':3389'
loginctl list-sessions
验收应同时满足:GNOME 会话处于活动状态;两个用户服务均为 active;RDP 状态为 enabled;TCP 3389 正在监听;Windows 端口测试成功并且能够完成 RDP 身份验证。
9. 常见问题
9.1 连接后没有可用桌面
运行 loginctl list-sessions,确认目标用户有活动的 seat0 图形会话。检查 GDM 自动登录设置以及 Wayland 会话类型。RDP 共享的是已经启动的 GNOME 用户桌面;只有 SSH 会话时没有图形桌面可供共享。
9.2 TCP 3389 没有监听
在 GNOME 用户会话中检查:
grdctl status
systemctl --user status gnome-remote-desktop.service --no-pager
journalctl --user -u gnome-remote-desktop.service -n 100 --no-pager
确认 GDM 登录成功、TLS 文件路径有效、XDG_RUNTIME_DIR 和 D-Bus 地址指向目标用户会话。修改凭据后重跑凭据恢复服务:
systemctl --user restart refresh-gnome-rdp-credentials.service
9.3 Chromium 要求解锁登录密钥环
“Authentication required”或“login keyring did not get unlocked”提示来自 GNOME 密钥环,不代表 RDP 认证失败。自动登录不会自动解锁旧的 login 密钥环。若需要访问其中保存的浏览器密码,在弹窗中输入创建该密钥环时设置的旧密码。该密码可能与当前 Linux 登录密码不同,也与 RDP 密码无关。
若要保留原有保存项,不要删除或重建 ~/.local/share/keyrings/login.keyring。忘记旧密码时,凭据恢复脚本不能解密旧保存项。
9.4 Windows 提示无法验证服务器身份
自签名证书通常会触发首次连接确认。核对 Windows 显示的主机名或 IP 与预期目标一致后再接受。Linux 主机更换或重新生成 TLS 证书后,客户端可能再次提示确认。
10. 关闭远程访问或撤销自动登录
在 Linux 的 GNOME 用户会话中关闭 RDP 和凭据恢复服务:
grdctl rdp disable
systemctl --user disable --now refresh-gnome-rdp-credentials.service
systemctl --user disable --now gnome-remote-desktop.service
需要恢复本机登录屏幕时,编辑 /etc/gdm3/custom.conf,将 AutomaticLoginEnable 设置为 false,然后运行:
sudo systemctl restart gdm3
重启 GDM 会结束当前图形会话;执行前保存桌面中尚未保存的工作。


