跳转至主要内容
晴雨技术笔记

XRDP 在 Linux 下的配置与调优

杏川铭心 杏川铭心
发表于 2025年5月23日
  • 本文最后编辑于 390 天前,部分信息可能已严重过时,请注意甄别。
  • 众所周知 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 服务器也可以开开心心的用图形界面了~

    • 特别提醒:

      评论看到就会回,但是不保证速度,有的时候站长忘记看的话就会出现审核好几天也没有动静的情况……

      有垃圾评论检查,如果评论之后直接消失、没反应说明被识别为垃圾评论了。

      如果等不及的话,可以加群!

    杏川铭心
    杏川铭心

    群号:1101838302,欢迎友好交流 :P 曾用名Frank419(现在也是我在很多地方的用户名),网站站长。

    发表回复

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