
XRDP 在 Linux 下的配置与调优

众所周知 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 不支持使用 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 不会自动关闭已经断开的连接,会导致服务器上的可用连接数最终用完。
修改 sesman.ini 文件:
sudo vim /etc/xrdp/sesman.ini
找到下面两行,修改成类似这样:
MaxSessions=50
KillDisconnected=true
其中 MaxSessions 规定了最大会话数量,而 KillDisconnected 指示终止关闭的会话。对于释放资源来讲非常好用。
如果要做到连接同一会话那么就会比较复杂,先不介绍,等我研究明白了再介绍(雾)
问题排查
由于 XRDP 不支持网络层身份验证 NLA,因此大部分人都会遇到和 NLA 有关的错误,提示“连接无法继续,因为未启用身份验证,并且远程计算机需要启用身份验证以进行连接”。微软官方也指出了 XRDP 的这个问题。
首先 Win+R 输入 systempropertiesadvanced,打开高级系统设置,并转到“远程”一栏。
选中“允许远程连接到此计算机”,并且取消勾选“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”。
如果还是不行,则需要编辑组策略。什么你说你是家庭版没有本地组策略编辑器?网上不是有教程吗自己去查啊(bushi)
打开 gpedit.msc,然后转到计算机配置 > 管理模板 > Windows 组件 > 远程桌面服务 > 远程桌面会话主机 > 安全。
修改“要求使用网络级别的身份验证对远程连接的用户进行身份验证”为已禁用。
启用“远程(RDP)连接要求使用指定的安全层”,并且配置为 RDP。
如果还是不行,则以管理员身份运行这个命令,刷新组策略。
gpupdate /force
还是不行,那么把“远程桌面连接”关掉,然后再打开。
依然不行就重启电脑。这个时候一定就行了,不可能还不行。
结语
至此我们完成了 Linux 上 XRDP 远程桌面的配置,并且解决了由于 XRDP 不支持 NLA 造成的连接问题。这下 Linux 服务器也可以开开心心的用图形界面了~