在 Ubuntu 20.04 或 22.04 上配置远程图形化登录,核心思路其实就两个方向:VNC 和 RDP。
作为在国内云计算环境(比如阿里云、腾讯云、华为云等)下工作的开发者,我强烈建议优先选择 RDP (Remote Desktop Protocol),而不是传统的 VNC。原因很简单:VNC 默认走的是 framebuffer 或者 X11 转发,带宽占用大、延迟高,而且很多云服务器厂商的安全组默认没开 5900 端口;而 RDP 协议更成熟,支持音频重定向、剪贴板共享、分辨率自适应,体验更接近本地 Windows 桌面。
下面我会以 xrdp 为核心方案,结合 Ubuntu 默认的 GNOME 桌面环境,给出最稳妥的配置步骤。如果你用的是轻量级桌面(如 XFCE),步骤略有不同,但原理一致。
一、 为什么选 xrdp?
Ubuntu 默认没有开启远程桌面服务。xrdp 是一个开源的 RDP 服务器,它能完美兼容 Windows 自带的“远程桌面连接”客户端,也支持 Remmina、FreeRDP 等跨平台客户端。
注意:不要尝试用 VNC(如 TightVNC, TigerVNC)配合
gnome-remote-desktop来做生产环境的日常办公,除非你只是偶尔调试一下。VNC 在公网环境下容易遇到卡顿、黑屏问题,且安全性配置相对繁琐。
二、 标准配置流程(GNOME 桌面环境)
1. 安装 xrdp
打开终端,执行以下命令:
sudo apt update
sudo apt install xrdp -y
安装完成后,服务通常会自动启动。你可以检查状态:
sudo systemctl status xrdp
如果显示 active (running),说明服务正常。如果没有,手动启动并设置开机自启:
sudo systemctl enable xrdp
sudo systemctl start xrdp
2. 关键配置:解决黑屏/闪退问题(重点!)
这是新手最容易踩坑的地方。Ubuntu 20.04/22.04 默认使用 Wayland 或特定的 GNOME Session 管理,直接连 xrdp 很容易出现登录后黑屏,或者提示“会话已终止”。
我们需要修改 xrdp 的启动脚本,让它正确加载用户的 session。
步骤如下:
-
备份原始配置:
sudo cp /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.bak -
编辑
startwm.sh:sudo nano /etc/xrdp/startwm.sh -
在文件末尾(
test -x /etc/X11/Xsession之前或之后,建议在文件最后添加以下内容):# 强制使用 Xorg 而非 Wayland,因为 xrdp 对 Wayland 支持不佳 export XDG_SESSION_TYPE=x11 # 如果是 Ubuntu 22.04,可能需要显式指定 GNOME 会话 # 注意:不同版本路径可能略有差异,一般不需要改这里,除非上面方法无效 # 保留原有的 session 启动逻辑 . /etc/X11/Xsession更稳健的做法:有些用户反馈需要注释掉
/etc/X11/Xsession这一行,然后手动调用 gnome-session。但对于大多数标准安装,上述export XDG_SESSION_TYPE=x11已经足够。如果依然黑屏,可以尝试将文件最后改为:unset DBUS_SESSION_BUS_ADDRESS export XDG_SESSION_TYPE=x11 exec /usr/bin/gnome-session --session=ubuntu(注意:
--session=ubuntu是 Ubuntu 特有的会话名,Fedora 等可能是gnome-classic) -
保存退出(Ctrl+O, Enter, Ctrl+X)。
-
重启 xrdp 服务:
sudo systemctl restart xrdp
3. 防火墙与安全组配置
本地防火墙(UFW):
sudo ufw allow 3389/tcp
sudo ufw reload
云服务器安全组(重要!):
登录你的云厂商控制台(阿里云/腾讯云/华为云等),找到你的实例,在“安全组”规则中:
- 添加入方向规则:
- 协议:TCP
- 端口范围:3389
- 授权对象:
0.0.0.0/0(测试时)或你自己的 IP 段(生产环境推荐限制 IP)
警告:不要直接在公网暴露 3389 端口而不做任何防护。建议使用跳板机、SSH 隧道,或者至少配置强密码 + Fail2ban。
三、 连接测试
- 在你的 Windows 电脑上,按
Win + R,输入mstsc,回车。 - 输入服务器的公网 IP。
- 点击连接。
- 在弹出的 xrdp 登录窗口中:
- Session: 选择
Xorg(不要选 VNC,除非你特意装了 VNC 后端)。 - Username: 你的 Linux 用户名。
- Password: 对应的 Linux 密码。
- Session: 选择
- 点击 OK。
如果一切顺利,你应该能看到完整的 GNOME 桌面。
四、 常见问题排查
Q1: 登录后黑屏,几秒后断开?
- 原因:通常是 Wayland 冲突或权限问题。
- 解决:
- 确保
startwm.sh中设置了export XDG_SESSION_TYPE=x11。 - 检查
/var/log/xrdp.log和/var/log/xrdp-sesman.log是否有报错。 - 尝试在本地终端运行
sudo reboot重启机器后再试。 - 如果是 Ubuntu 22.04,确认是否安装了
gnome-shell-extension-appindicator等必要组件,有时缺少依赖会导致会话崩溃。
- 确保
Q2: 中文乱码?
- 原因:系统缺少中文字体或 locale 未正确设置。
- 解决:
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei sudo dpkg-reconfigure locales # 选择 zh_CN.UTF-8重启后生效。
Q3: 剪贴板无法同步?
- 原因:xrdp 默认不启用剪贴板同步,或者权限不足。
- 解决:
- 确保安装了
xrdp-pulseaudio-installer(如果需要音频重定向)。 - 在 Windows 远程桌面客户端,点击“显示选项” -> “本地资源” -> “详细信息”,勾选“剪贴板”。
- 如果仍不行,尝试在 Linux 端安装
clipit或parcellite等剪贴板管理器,并在~/.xprofile中启动它们。
- 确保安装了
Q4: 多显示器支持?
- xrdp 对多显示器的支持有限。通常只能看到一个主屏幕。如果需要扩展显示器,建议先在 Linux 端配置好虚拟显示器或使用 NVIDIA 驱动的多头模式,但这属于高级运维范畴,普通用户建议单屏使用。
五、 替代方案:KVM over IP / NoMachine
如果你发现 xrdp 性能还是不够好(比如看视频、做设计),可以考虑 NoMachine 或 Apache Guacamole。
- NoMachine:基于 NX 协议,压缩率高,延迟低,适合高带宽需求场景。免费个人版功能很强。
- Guacamole:HTML5 无客户端接入,适合通过浏览器访问,但部署复杂,需要 Java 环境。
对于大多数开发者日常写代码、跑 IDE、浏览网页,xrdp + Xorg 是最平衡的选择。
六、 安全建议(必读)
- 不要使用 root 登录:创建一个新的普通用户,赋予 sudo 权限,然后用这个用户登录远程桌面。
- 禁用密码登录,改用密钥:虽然 RDP 本身不支持 SSH 密钥认证,但你可以通过 SSH 隧道来映射 3389 端口,实现加密传输:
ssh -L 3389:localhost:3389 user@your-server-ip然后在本地连接
localhost:3389。这样即使服务器开了 3389,也是通过 SSH 通道加密的,无需开放公网端口。 - 定期更新系统:
sudo apt upgrade,修复已知漏洞。
总结:Ubuntu 20.04/22.04 远程桌面,装 xrdp,设 XDG_SESSION_TYPE=x11,开安全组 3389,用 Windows 自带 MSTSC 连接。这套流程经过大量实战验证,稳定可靠。
云技术博客