跳转至主要内容

晴雨技术笔记

XRDP 在 Linux 下的配置与调优

杏川铭心 杏川铭心
发表于 2025年5月23日

众所周知 Windows 下有个很好用的工具叫做远程桌面,允许远程访问计算机的图形界面。而 Linux 御用的远程管理工具只有 SSH,没有图形界面,虽说用熟了很高效,但有的适合还是没有图形界面方便。此外 SSH 要运行图形界面的程序也没有远程桌面来的方便,必须要做 X11 转发。像 XRDP , TightVNC,都是 Linux 下的成熟远程桌面方案。

目前 Linux 下能用的远程桌面协议,一种是 VNC,还有一种就是微软的 RDP。VNC 协议只能支持简单的画面传输,,什么剪贴板交换,什么远程打印,传输文件,甚至播放音频啥的,都不要想。此外 VNC 在 Windows 上并没有默认的连接方式,因此我们果断选择 RDP。比较成熟解决方案的就是我们今天要介绍的 XRDP 。

XRDP 的官网似乎用的是 GitHub Pages?

演示系统:Ubuntu 22.04 LTS

安装 XRDP

首先,既然是要配置远程桌面,那么肯定得先有一个桌面。

推荐 xfce4 桌面,资源占用低,界面也不是过于难以忍受。

sudo apt install xfce4 xfce4-goodies

安装完之后就算结束了,不需要额外配置 .xsession 文件。

接着就是安装 XRDP 的本体:

sudo apt install xrdp

然后开启 XRDP 服务:

sudo systemctl enable --now xrdp

这个时候已经可以尝试连接了,不过有可能会遇到问题,这个一会儿再讲。

XRDP 默认登陆界面。

连上去之后(假设你没有提前输入账号密码)大概就是上图这个效果,输入账号密码即可登录。注意 XRDP 不支持使用 SSH 密钥进行登录。

XRDP 性能调优

假设这个时候你已经顺利地登陆了桌面,会发现桌面似乎卡卡的,没有 Windows 的远程桌面那么顺畅。毕竟不是 Linux 亲生的协议,调优是必须的。

检查网络

这个其实是最根本的原因。如果你的服务器是那种 1 Gbps 的超级大水管,那么哪怕你啥都不调,也不大会卡。如果你是 1 Mbps 的小水管机器,那么只好接受自己远程桌面会卡的事实,不管你怎么优化都没什么用。

此外,如果你服务器在中国,那肯定也不会太卡。要是什么拼命绕路的鸟不拉屎的小地方的机房,那不管你怎么搞,该卡也还是卡。

修改桌面壁纸

这个网上大部分教程似乎都没有提到…

由于 XRDP 实现上的原因,桌面壁纸并不能像 Windows 那样缓存在本地,而是会在每次需要传输壁纸某个部分的时候都传输一遍。这就导致了如果你的壁纸是很花里胡哨的二次元壁纸,那么几乎一定会卡。选择 xfce 默认的那几个都不错,不过最好是设置成纯黑。

其他种类的系统美化,比如换主题换图标什么的,都尽量避免。自己平时玩玩还好,服务器上就算了。

降低颜色质量

修改 XRDP 配置文件:

sudo vim /etc/xrdp/xrdp.ini

找到 max_bpp 这一行,修改为一个小一点的值,例如 16。

max_bpp=16

这个配置改变的是色深,色深越小,能显示的颜色越少,当然相应的带宽占用也会越小。

提高缓冲数据包大小

同样是编辑 xrdp.ini 这个文件,找到这两行(默认是被注释的),然后修改为一个大一点的值。

tcp_send_buffer_bytes=1048576
tcp_recv_buffer_bytes=2097152

注意不要超过你服务器的带宽,不然可能适得其反。

禁用窗口合成器

禁用窗口合成器之后,桌面的特效会少很多。当然带宽也会跟着一起下来,速度自然就上去了。

sudo xfconf-query --channel=xfwm4 --property=/general/use_compositing --type=bool --set=false --create

所有这些操作完成之后,别忘了重启服务:

sudo systemctl restart xrdp

配置 XRDP

这个时候,桌面大概率是不卡了,不过其行为依然不是最佳,至少和 Windows 的远程桌面还是有一定差距。

启用加密

首先要把 xrdp 用户添加到 ssl-cert 用户组中:

sudo adduser xrdp ssl-cert

接着依然是编辑 xrdp.ini 文件,找到这三行进行修改:

security_layer=negotiate # 这一行其实不用修改,默认的是可以的。如果要强制加密的话那就改成 tls。
certificate=/etc/xrdp/cert.pem
key_file=/etc/xrdp/key.pem

XRDP 默认在配置目录下有一份自签名的证书,可以直接使用。

最终重启 XRDP 服务。

这个时候连接,应该会看到连接警告,提示证书不受信任。直接忽略就可以连上。

当然如果你很在意的话,那么还是搞一份正经的证书比较好。经过实测发现 Let’s Encrypt 的证书是可以直接使用的。

不过如果你要使用 Let’s Encrypt 的话,那么要注意默认的证书存放目录 XRDP 是不能访问的,必须要手动编写 deploy hook 把证书复制到一个 XRDP 可以读取的地方。

给一段示例代码:

#!/bin/bash
cp /etc/letsencrypt/live/example.com/fullchain.pem /etc/xrdp/lcert.pem
cp /etc/letsencrypt/live/example.com/privkey.pem /etc/xrdp/lkey.pem
chown xrdp:xrdp /etc/xrdp/lcert.pem /etc/xrdp/lkey.pem
systemctl restart xrdp

配置文件中的路径也要相应修改:

certificate=/etc/xrdp/lcert.pem
key_file=/etc/xrdp/lkey.pem

这个时候再去连接就没问题了:

XRDP 证书状态有效。

自动关闭连接

默认情况下 XRDP 不会自动关闭已经断开的连接,会导致服务器上的可用连接数最终用完。

修改 sesman.ini 文件:

sudo vim /etc/xrdp/sesman.ini

找到下面两行,修改成类似这样:

MaxSessions=50
KillDisconnected=true

其中 MaxSessions 规定了最大会话数量,而 KillDisconnected 指示终止关闭的会话。对于释放资源来讲非常好用。

如果要做到连接同一会话那么就会比较复杂,先不介绍,等我研究明白了再介绍(雾)

问题排查

由于 XRDP 不支持网络层身份验证 NLA,因此大部分人都会遇到和 NLA 有关的错误,提示“连接无法继续,因为未启用身份验证,并且远程计算机需要启用身份验证以进行连接”。微软官方也指出了 XRDP 的这个问题。

首先 Win+R 输入 systempropertiesadvanced,打开高级系统设置,并转到“远程”一栏。

关闭 XRDP 不支持的 NLA 。

选中“允许远程连接到此计算机”,并且取消勾选“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”。

如果还是不行,则需要编辑组策略。什么你说你是家庭版没有本地组策略编辑器?网上不是有教程吗自己去查啊(bushi)

打开 gpedit.msc,然后转到计算机配置 > 管理模板 > Windows 组件 > 远程桌面服务 > 远程桌面会话主机 > 安全。

修改“要求使用网络级别的身份验证对远程连接的用户进行身份验证”为已禁用。

禁用组策略“要求使用网络级别的身份验证对远程连接的用户进行身份验证”。 XRDP

启用“远程(RDP)连接要求使用指定的安全层”,并且配置为 RDP。

配置策略“远程(RDP)连接要求使用指定的安全层”。 XRDP

如果还是不行,则以管理员身份运行这个命令,刷新组策略。

gpupdate /force

还是不行,那么把“远程桌面连接”关掉,然后再打开。

依然不行就重启电脑。这个时候一定就行了,不可能还不行。

结语

至此我们完成了 Linux 上 XRDP 远程桌面的配置,并且解决了由于 XRDP 不支持 NLA 造成的连接问题。这下 Linux 服务器也可以开开心心的用图形界面了~

杏川铭心
杏川铭心

名字越改越尬,但是网站一点没动🤪 曾用名Frank419(现在也是我在很多地方的用户名),网站站长。

上一篇文章

SFTP Chroot 配置 

下一篇文章

无更新文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注