ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu 24.04远程桌面与SSH登录:原生RDP配置与排坑攻略

Ubuntu 24.04远程桌面与SSH登录:原生RDP配置与排坑攻略

还记得以前帮一个新同事配Ubuntu的远程桌面,折腾了半天,最后发现新版系统自带的“桌面共享”已经换成了一套完全不一样的东西。网上很多教程还停留在旧时代的vino和VNC配置思路上,一上来就是装x11vnc、改gsettings,结果在Ubuntu 24.04上要么连不上,要么黑屏,要么分辨率卡死。

Ubuntu 24.04的原生远程能力,其实分成了两条完全不同的技术路线:一条是“桌面共享”,走的是RDP协议,面向的是“人和图形界面交互”的场景;另一条是“远程登录”,走的是SSH生态,面向的是“命令行操作”和“服务托管”的场景。这两条路各有一堆细节,搞不明白就容易踩坑。这篇我就把自己实测下来的配置方法、性能感受、排坑记录全部摊开来讲,结尾还会顺带聊聊到底什么时候该用哪一边。

1. Ubuntu 24.04的远程方案到底有哪些“原生货”

1.1 先分清两个概念:桌面共享 vs 远程登录

很多新手会把“远程桌面”当成一个笼统的需求,但实际操作中这两类东西的目标完全不同。

桌面共享(Desktop Sharing)强调的是“屏幕在场”。它把当前图形会话的屏幕内容编码成视频流,通过网络发到远程客户端,远端看到的和你本机屏幕看到的几乎是同一帧画面。这个方向最典型的协议就是RDP和VNC,使用场景是:你人在外面,家里/办公室的Ubuntu机器开着图形界面,你想点开某个软件操作一下,或者帮人远程调试一个GUI应用。

远程登录(Remote Login)强调的是“会话在场”。它不关心屏幕,只关心有没有一个合法的终端会话能执行命令。最典型的就是SSH。你敲一条ls,远端就把目录列表返回来。这个方向适配一切无头环境、服务器、容器,也是做运维和开发的老本行。

Ubuntu 24.04很有意思,它把这两个方向都做成了“开箱即用”的原生支持:桌面共享默认捆绑了GNOME Remote Desktop(底层是RDP服务),远程登录默认带的有OpenSSH服务端(装好系统之后可选)。也正是因为原生都可以用,反而让很多人犯了选择困难症。

1.2 为什么24.04的原生方案让人又爱又纠结

如果用一句话概括24.04的远程体验:原生方案已经“能用了”,但距离“完美替代第三方商业软件”还有不少路要走。

纠结的点主要在Wayland。Ubuntu从22.04开始全面默认Wayland会话,24.04延续了这一点。Wayland的安全模型比X11严格得多,传统X11下的远程桌面工具可以直接抓取任意窗口内容、模拟输入事件,而Wayland不允许这些“过于自由”的操作。这导致旧方案vino在Wayland下根本跑不起来,才逼着Ubuntu转向了GNOME Remote Desktop + RDP这套新方案。

这套新方案的好处是:不需要额外安装闭源驱动,不需要手工编译mod,不需要为了远程功能牺牲安全模型。坏处是:它还在快速迭代中,偶尔会有一些小毛病,比如剪贴板同步时灵时不灵,比如远程分辨率跟随本地客户端的规则有些反直觉。

远程登录那边倒是稳如老狗。OpenSSH这么多年一直没有大变化,Ubuntu 24.04上的配置体验和以前几乎一致,原生支持得相当透彻。问题是很多人不知道SSH也可以开图形转发,或者不知道如何把SSH和GUI应用衔接起来,导致明明可以一条命令解决的问题,非要跑去折腾VNC。

2. 桌面共享实操:RDP路径的开启与连接全流程

2.1 第一步:确认你处于Wayland还是Xorg会话

这一步非常关键,因为它决定了后面所有的操作路径。

echo $XDG_SESSION_TYPE

在Ubuntu 24.04默认登录界面,一般会得到wayland。如果你的显卡或驱动有问题,系统会回退到Xorg,这时的输出是x11。不管是哪个,先用这个命令确认一下当前状态。

如果你看到了wayland,那恭喜,走标准流程就行:进入“设置 → 系统 → 远程桌面”,打开“远程桌面”开关,设置一个密码。如果你看到了x11,也不代表不能用,只是部分优化体验会有差异(后面性能对比部分会说)。

从命令行看状态,可以这样:

grdctl status grdctl rdp status

正常情况下会输出类似RDP is enabled的信息。如果没启用,可以手动启用:

grdctl rdp enable grdctl set --enable-rdp grdctl rdp set -p '你的远程密码'

注意上面的密码是RDP连接时验证用的独立密码,不要求是你的系统登录密码。

2.2 第二步:用RDP客户端连上去

现在Ubuntu桌面共享走的是RDP协议,官方推荐用Windows自带的“远程桌面连接(mstsc)”来连。你也可以用FreeRDP命令行:

xfreerdp /v:192.168.1.100 /u:任意用户名 /p:你的远程密码 /cert:ignore

如果是跨平台环境,微软的Remote Desktop客户端(macOS、iOS、Android都有)也能直接连。

连接时有个容易迷惑的细节:用户名完全无所谓,随便填什么都行。整个RDP会话的认证走的是我们在grdctl里设置的密码而不是系统登录密码,用户名只是走个形式。这是GNOME Remote Desktop早期设计就定下来的规则,很多人用系统账号密码连,结果一直提示认证失败,换成任意用户名+远程密码就通了。

提示:在局域网内测试时,建议先用IP直连,把防火墙影响排除掉。Ubuntu默认ufw如果开启,需要放行3389端口:sudo ufw allow 3389/tcp。

2.3 第三步:连上之后会是什么体验

我实测在千兆局域网里,RDP连接Ubuntu 24.04的体验是这样的:

  • 桌面分辨率会自动调整为客户端窗口大小,默认情况下远端屏幕会跟着客户端拉伸。
  • 鼠标移动有一定延迟,但普通办公、写文档、浏览网页完全可以接受。
  • GNOME的动画效果会有点掉帧,流畅度不如Windows之间的RDP连接。
  • 声音重定向在24.04上默认不生效,能听到声音的场景基本不存在,官方还没有把PulseAudio/PipeWire重定向无缝接通。
  • 剪贴板同步在Wayland会话下,如果客户端往Ubuntu粘贴,实测成功率高;Ubuntu往Windows粘贴,偶尔会失联。

如果只是应急操作一下桌面软件,这个方案是合格的。但如果你打算长期靠它做设计、视频剪辑、或者对色彩要求高的活,原生RDP那点色深和帧率可能会让你抓狂。

3. 远程登录实操:SSH生态才是真正的主力

3.1 十分钟配好OpenSSH并开启密钥登录

远程登录路径的核心是OpenSSH。Ubuntu Server安装时会默认带openssh-server,但Desktop版默认不带,需要手动装:

sudo apt update sudo apt install openssh-server sudo systemctl enable --now ssh

装完之后系统就有了SSH能力。可以先在本机测试,再允许局域网连接:

ssh localhost

如果这条能通,说明服务端没问题。接下来要干的第一件事是配置密钥登录,因为只靠密码登录不仅容易被爆破,每次连接也要输密码,很麻烦。生成密钥并复制到远端:

ssh-keygen -t ed25519 -a 100 ssh-copy-id 你的用户名@远端IP

这样之后再用ssh 你的用户名@远端IP,就能直接无密码登录。注意ed25519是现在最推荐的非对称加密算法,兼容性已经覆盖所有LTS版本,不用再纠结RSA的位数问题。

为了让SSH用起来更顺滑,可以在~/.ssh/config里面加一段别名配置:

Host ubuntu24 HostName 192.168.1.100 User 你的用户名 IdentityFile ~/.ssh/id_ed25519

配置完之后,一个ssh ubuntu24就进去了,记IP、记用户名的成本全部省掉。

3.2 在SSH里跑图形程序:X11转发与局限

很多人不知道SSH除了敲命令还能开图形窗口。只要在/etc/ssh/sshd_config里确认下面的配置存在:

X11Forwarding yes

然后连接时使用-X参数:

ssh -X ubuntu24 # 然后试着运行一个图形程序 nautilus

理论上nautilus的窗口会弹到你本地。但这里有个大坑:如果远端会话是Wayland,X11转发根本转不出来任何画面,因为Wayland会话里压根没有XWayland的X server暴露给SSH。实测下来,只有远端用的是Xorg会话时,X11转发才稳定。

如果非要让SSH承载图形转发,我建议在远端登录界面登录时选择“Ubuntu on Xorg”,然后重启一次让会话变成X11。这样做的代价是放弃Wayland的部分安全性和视觉效果,但换来了X11体系下所有传统远程工具的兼容性。

如果图形应用不多,还有一个更轻量级的思路:不转发整个桌面,只用SSH启动一个特定应用,配合socket转发和Wayland原生协议,走weston或者waypipe这类方案。这些工具能把Wayland协议的socket转发到本地,性能比X11转发好很多,还不用切到Xorg。不过配置成本偏高,适合已经熟悉Wayland底层机制的朋友尝试。

3.3 远程登录的进阶玩法:端口转发与隧道

SSH真正让我离不开的原因,是它的隧道能力。如果远端机器上跑了一个Web服务,监听在内网端口,你不想给这个服务单独配公网入口,可以直接用本地转发:

ssh -L 8080:localhost:3000 ubuntu24

执行之后,浏览器打开http://localhost:8080就能访问远端内网的3000端口服务。这个能力在调试后端、看监控面板、临时暴露开发服务器时非常实用。反向转发也是类似逻辑:

ssh -R 9000:localhost:80 ubuntu24

这条命令让远端机器访问自己的9000端口时,流量被隧道转到你本机的80端口,适合临时让远端服务器访问你本机正在开发的服务。

SSH隧道的安全性也比在公网裸开端口稳妥得多,因为所有流量都是加密通道,服务本身不暴露端口,扫描器根本看不见。

4. 硬核对比:桌面共享和远程登录到底该怎么选

4.1 性能、延迟与画质的真实差异

先说大家最关心的性能。我把两组方案放在同一台Ubuntu 24.04机器上实测:千兆局域网,同样的网络压测脚本,对比结果大致是这样的:

方案延迟感受画质表现CPU消耗适配场景
GNOME Remote Desktop (RDP)150ms左右,鼠标能感觉到迟滞中等,文本清晰,色彩一般中高,编码持续占核图形界面点按操作
SSH + X11转发300ms以上,窗口拖动卡顿明显低,截图工具画质不稳定较高,传输量大少量GUI程序应急运行
SSH纯命令行10ms以内,几乎无感不适用图形极低运维、开发、服务管理

这张表的结论很直白:桌面内操作选RDP,命令行效率选SSH。没有第三种原生方案能同时做到“图形接近本地”和“网络消耗低”。

RDP延迟感受150ms是我个人感觉,实际上它受网络带宽、显卡编码能力影响很大。如果远端机器有GPU硬件编码支持(比如支持NVENC的显卡),通过VA-API硬编可以再压掉一截延迟。没有硬编的机器,全靠CPU软编,CPU占用会明显上去。

4.2 安全模型:Wayland、认证与暴露面

安全角度,桌面共享和远程登录完全是两种思路。

桌面共享(RDP)默认只监听在内网,而且需要独立设置远程密码,不直接使用系统账号。Wayland会话下,远程输入事件被严格限制,远端能操控的范围和你本机窗口完全一致,不存在“悄悄截取其他显示器画面”这类传统X11漏洞。RDP的NLA(网络级认证)机制也默认开启,未认证的客户端根本进不到桌面层面。

但RDP有一个先天短板:它暴露的是一个完整图形界面,意味着横向移动后的风险更大。一旦对方突破了RDP认证,整个桌面的应用、文件管理器、浏览器会话都裸露在外。

SSH的暴露面其实更小。它默认只给一个shell,权限边界通过账号体系管控。更关键的是,SSH支持强制命令、子系统、密钥来源限制、AllowUsers白名单等,可以把登录行为约束得非常窄。比如某个SSH密钥只允许执行git pull,其余操作一律拒绝,这在RDP里很难做到。

如果你要公网访问,我更推荐在用户态做一层跳板:只暴露SSH的22端口,然后基于SSH隧道再访问RDP端口。这样桌面共享服务本身完全不暴露在公网,攻击者连扫描都扫不到。这是一套我实践了很久的安全前置方案:公网只开SSH,远程桌面走隧道转发。

4.3 场景化选型建议,直接照抄

经过大量实测,我把选型逻辑总结成一张“决策表”,你照着选就行:

使用场景首选方案备选方案关键理由
访问服务器管理面板SSHSSH隧道资源开销最小
远程调公司/学校桌面GUIRDP桌面共享xrdp原生支持,无需额外配置
临时打开远端某个GUI程序X11转发或RDPwaypipe看会话类型决定
多人协作远程同一台机器RDP无良好原生方案原生RDP已经多人可用
频繁传输大量文件SSH + rsyncSSH隧道基于SSH的文件同步最稳
特殊设备调试(如串口、USB)SSH端口转发无设备访问直接映射

这个表格里我特意加了xrdp。很多老教程会推荐在Ubuntu上装xrdp走RDP,但在24.04上它和GNOME Remote Desktop默认会冲突,两个RDP服务抢3389端口。如果你打算用xrdp,先把原生的远程桌面关掉:

grdctl rdp disable sudo systemctl stop --now gnome-remote-desktop.service

然后xrdp才能正常绑定端口。不然你会看到xrdp一直报address already in use,网上查半天资料才发现两个RDP服务打架了。

5. 常见问题与排查实录:我踩过的具体坑

5.1 连不上、黑屏、卡在登录界面

黑屏是远程桌面问题里最常见的,而且原因千奇百怪。

第一种情况:远端处于登录界面,你从RDP客户端连过去。GNOME Remote Desktop的新版本支持从锁屏和登录界面走“远程登录”分支,但前提是你在设置里开启了“远程登录”开关(默认情况下只有“远程桌面”开关打开)。如果只开了远程桌面,远端一旦注销或处于登录界面,客户端就会看到一个静态画面或黑屏。

第二种情况:显卡驱动问题导致桌面合成崩溃。Wayland会话在远程编码时,如果显卡驱动不稳定,RDP连接时会话会整个重启。查错先看日志:

journalctl -u gnome-remote-desktop -b --no-pager | tail -50

常见报错有pipewire stream error或vaapi decode failed,前者多半是Wayland流媒体管道问题,后者多半是浏览器/客户端硬解和服务器编码不匹配。解决的土办法是关闭客户端的硬件解码,强制软件解码;或者把远端会话切成Xorg,绕开Wayland的合成器路径。

第三种情况更隐蔽:Ubuntu 24.04桌面版默认使用NetworkManager,但防火墙模块可能没有完全安装。某些精简安装环境里ufw没启用,可你还是连不上,那就要检查是否有别的网络限制,比如路由器AP隔离、VLAN划分。先用ip addr确认远端IP,再用手机热点测试一下能不能绕开局域网隔离,这是最快定位网络层问题的方法。

5.2 认证失败、密码明明是对的

RDP连不上、认证失败,是最容易让人怀疑人生的一个坑。GNOME Remote Desktop的密码机制前面提到过:用户名随便,密码是在设置或grdctl rdp set -p里设置的独立密码,它和你的系统登录密码没有半毛钱关系。很多人习惯性地输系统密码,一直提示失败,最后才想起自己根本没设置过RDP专用密码。

另外,如果是通过grdctl命令行设置密码,注意特殊字符的处理。假设密码里有$、'、"等字符,bash会做变量扩展,你设置的密码可能和你以为的不一样。稳妥做法是单引号包裹并转义内部单引号:

grdctl rdp set -p 'my$ecurePass'

设置成功后可执行grdctl rdp status检查密码是set状态而不是disabled。

SSH认证失败通常是密钥权限问题。如果你的~/.ssh/authorized_keys权限是644,某些严格模式下SSHD会拒收。确保:

chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_ed25519

如果还是不行,打开/var/log/auth.log看具体拒绝原因,一眼就能看到是Permission denied (publickey)还是Unable to negotiate。

5.3 剪贴板、分辨率、声音和重定向问题

分辨率问题最反直觉。GNOME Remote Desktop在RDP连接时,远端Gnome会话的分辨率会被客户端窗口尺寸覆盖。听起来很方便,但如果你在远端开启了某些固定分辨率应用(比如全屏游戏、专业软件),连接过程中画面可能被拉伸变形。规避做法是先断开RDP,在本地会话里设置好需要的分辨率,再重新连接;或者在客户端里锁定分辨率选项,不让它随意改远端会话。

剪贴板同步,在24.04上支持的协议是RDP标准的剪贴板通道,文本复制问题不大,但文件复制经常失败,尤其是超过几百MB的大文件,几乎必断。官方还在改善中,我的土办法是配合SSH传输文件:scp或rsync,又快又稳,不走剪贴板这条路。

声音重定向前面已经提过一句,再展开说一下:GNOME Remote Desktop目前没有把PipeWire音频流重定向到RDP客户端,官方还在推进中。如果你确实需要远端有声音,目前唯一有效的原生方案是走SSH隧道然后把音频流通过PulseAudio的网络协议中转,但配置复杂。个人建议:远程操作需要声音审核的话,老老实实回到机器旁边处理,或者用一台带物理输出的设备配合采集方案,别指望原生RDP服务器声道。

注意:以上这些都是我在实际项目中踩过的真实问题,不代表每个版本都一定会遇到。远程桌面这块发展很快,Ubuntu 24.04的后续小版本更新里,某些问题可能悄悄修复了。如果某个毛病新版本里突然消失了,也不需要太惊讶。

6. 一些个人体会和效率小技巧

6.1 结合两种方案,才是真正舒服的远程姿势

我自己用Ubuntu 24.04远程工作的习惯是:桌面共享RDP负责“打图形”,SSH负责“打底层”,两者互相补充,而不是二选一。

平时管理家里的24.04机器,我会先SSH上去看一下负载、磁盘、服务状态:

ssh ubuntu24 htop df -h journalctl -u 某个服务 --since today

如果需要处理图形化的软件,再另开一个RDP连接。两个通道并行工作,SSH窗口用来敲命令,RDP窗口用来肉眼确认结果,效率比单一方案高很多。

在安全加固方面,我可以分享一个异常实用的做法:公网服务器上永远不要直接暴露3389端口。只开放22端口,然后通过SSH做RDP隧道:

ssh -L 33389:localhost:3389 ubuntu24

然后你的RDP客户端连localhost:33389即可。这样远程桌面服务看起来只监听在本地回环地址,公网扫描器根本扫不到3389,攻击面瞬间缩小一个量级。即使RDP本身有漏洞,外部也无法直接触达。

6.2 给新手的最后建议清单

整理了一份“开箱即用清单”,照着设置你的Ubuntu 24.04远程环境,30分钟可以从裸机变成可远程作业:

步骤操作
1sudo apt update && sudo apt upgrade
2安装openssh-server 并systemctl enable --now ssh
3生成ed25519密钥并ssh-copy-id
4确认~/.ssh/config里有主机别名
5进入“设置 → 系统 → 远程桌面”,开启RDP并设置独立密码
6如果计划长期使用,把ufw开启并放行22和3389端口
7用手机/电脑测试从局域网另一台设备连接
8公网场景只开放22端口,其余全部走SSH隧道

当前这个清单基本涵盖了绝大多数人会遇到的核心需求。

回看Ubuntu 24.04这代系统,原生远程支持的变化本质上是一次“从X11时代的自由泛滥,走向Wayland时代的安全收拢”的取舍。桌面共享不再是那个随便抓屏的工具,而是一个严格限定在会话内的RDP服务;远程登录依然以OpenSSH为基石,稳得几乎让人感觉不到它存在。

桌面共享适合有人坐在画面那一头,远程登录适合面向生产力的稳定通道。在做选型、写自动化、配安全策略的时候,先想清楚你到底是在跟屏幕打交道,还是跟命令打交道,就不会被那些花里胡哨的第三方工具牵着走了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进