多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Ubuntu 20.04 Xrdp 远程桌面配置指南:从安装到排错

Ubuntu 20.04 Xrdp 远程桌面配置指南:从安装到排错 简介面向需要在Ubuntu 20.04上建立远程桌面连接的Linux运维人员与开发者这份PDF资料围绕Xrdp服务器的安装与配置展开覆盖从选择Gnome/Xfce桌面环境、安装Xrdp服务、添加ssl-cert用户组到防火墙放行3389端口、通过Windows RDP客户端远程登录的完整流程。资源为1个PDF文件压缩包大小约160KB图文命令清晰适合作为服务器远程管理操作的快速参考。目前已有9666人学习下载内容以实操命令为主线同时穿插Xrdp配置项说明、SSH隧道加密等安全建议可帮助读者避开常见权限与端口问题在本地图形界面下高效管理远程Ubuntu系统。1. 为什么 Ubuntu 20.04 的远程桌面我推荐 Xrdp 而不是先装 VNC管理员手边常有一台 Ubuntu 20.04 的服务器或办公主机想从 Windows 直接远程桌面连过去做图形化运维。这类需求的第一反应是装 VNC但 VNC 在会话拓扑、端口透传和 Windows 端客户端兼容性上都更折腾。Xrdp 把问题收敛成三步Ubuntu 上装好 xrdp放行 3389 端口Windows 自带远程桌面客户端mstsc直接连。它不替代 SSH 的管理通道而是补齐图形化访问这块短板。下面的操作把安装、排错、验证串成一条可复现的路径并说明哪些参数不能改、哪些报错其实不用怕。2. Ubuntu 20.04 安装 Xrdp 的完整流程从软件源到首次连接2.1 安装前的检查项桌面环境和软件源安装 Xrdp 之前先弄清这台 Ubuntu 20.04 是桌面版还是 Server 版两者差在 X server 和显示管理器上。桌面版默认带 GNOME 3.36Xrdp 装完后可以直接用Server 版没有图形环境需要先补一个桌面否则连进去只会看到一个孤立的光标或直接退出来。ls /usr/share/xsessions/ echo $XDG_CURRENT_DESKTOP cat /etc/os-release | grep VERSION_ID第一条命令列出系统已注册的桌面会话文件GNOME 桌面对应gnome.desktop装上 xfce 后会多出对应条目第二条命令告诉你当前登录环境是什么输出为空说明你不在图形会话里查看第三条命令确认版本号是 focalVERSION_ID20.04这决定后面 apt 源匹配是否准确。命令输出含义ls /usr/share/xsessions/列出系统已注册的桌面会话入口echo $XDG_CURRENT_DESKTOP当前图形会话的桌面环境名cat /etc/os-release确认系统版本及代号如果目标机器在隔离内网、没有外网仍然可以完成安装。做法是在一台同样架构、同样为 Ubuntu 20.04 且有网的机器上准备离线包sudo apt download xrdp xorgxrdp xrdp-sesmanapt download只把指定 .deb 拉到当前目录不会写入本机软件库把文件拷贝到离线机后用sudo dpkg -i *.deb安装中途若报依赖缺失用sudo apt -f install -y修复一次依赖。这一步要注意 xrdp-sesman 是会话管理进程少一个 deb装出来的服务就不完整。动手前先把源索引刷新到最新sudo apt update提示建议先更新再安装。20.04 是老 LTS索引缺失会导致 apt 在解析依赖时直接中断。2.2 安装 Xrdp 本体和它需要的桌面组件主线安装对 Ubuntu 20.04 来说就是一条命令sudo apt install xrdp -y装完后系统里会出现两个服务xrdp监听 3389 端口负责和远程桌面客户端握手xrdp-sesman负责用户认证、会话分配和拉起显示进程。两步分开设计的好处是连接层和会话层可以独立重启。先确认两个服务都起来sudo systemctl status xrdp sudo systemctl status xrdp-sesman sudo systemctl enable --now xrdp如果xrdp是 active 而xrdp-sesman显示 failed不要急着重启 3389 端口优先去翻/var/log/xrdp-sesman.log大部分问题出在 polkit 权限或用户家目录的所有者不对。桌面版可以直接跳到下一节Server 版补装桌面时我一般推荐 xfce4 而不是继续装完整版 GNOMEsudo apt install xfce4 xfce4-goodies -y选择 xfce4 的原因不是它好看而是 Xrdp 的会话管理对它最省心。GNOME 3 在 xrdp 会话里经常出现登录后只有背景图、没有窗口和任务栏的情况处理成本很高xfce4 没有全局菜单和复杂的合成器依赖远程会话的绘制压力也小这在内网带宽一般、机器配置不高的环境下尤其明显。2.3 配置会话启动器让 Xrdp 知道登录后启动哪个桌面Xrdp 认证通过后读/etc/xrdp/startwm.sh这个脚本决定启动什么桌面。Ubuntu 20.04 默认内容会调用系统的 Xsession在 Xorg 会话下很容易黑屏所以通常把最后一行的启动命令指向 xfce4。#!/bin/sh # 加载系统默认 locale避免远程会话里中文显示成方块 if [ -r /etc/default/locale ]; then . /etc/default/locale export LANG LANGUAGE fi # 启动 Xfce 会话Xrdp 会等待该进程存活 startxfce4用编辑器打开/etc/xrdp/startwm.sh把内容替换成上面这样然后保存并赋权重启sudo chmod x /etc/xrdp/startwm.sh sudo systemctl restart xrdp对单用户主机也可以把startxfce4写进用户主目录的~/.xsession效果等价两者同时存在时.xsession优先级更高排错时先看它。注意不要把exit 0加在startxfce4前面这是黑屏最常见的元凶。2.4 放行 3389 端口并确认监听状态装好不等于能连防火墙这步漏掉连接会卡在“正在用远程桌面协议进行连接”。常见做法是只放给内网网段sudo ufw allow from 192.168.1.0/24 to any port 3389 proto tcpfrom指定来源网段proto tcp限定协议端口填 3389。如果要求不严直接sudo ufw allow 3389/tcp也能过但不要把它暴露到公网。RDP 的 TLS 只解决传输加密认证层面扛不住暴力尝试。查看是否真的在监听ss -tlnp | grep 3389看到LISTEN 0 10 *:3389 *:*即表示 xrdp 已接管端口。如果输出为空说明服务没起来或者 3389 被别的进程占住先用sudo netstat -tlnp | grep 3389查一遍再决定重启哪个服务。3. Xrdp 连接出现黑屏或登录闪退的排错路径3.1 黑屏与闪退的四个高频来源连上去之后的黑屏绝大多数不是 Xrdp 安装环节出错而是会话脚本没按预期工作。按出现频率排序第一是startwm.sh被改坏很多安装教程让用户在文件末尾追加一行startxfce4但默认文件尾部本来就有条件判断和exit 0新追加的命令根本轮不到执行结果就是登录成功但桌面起不来。第二种是~/.xsession指向了不存在的会话名称Xrdp 解析不出有效桌面。第三种是用 GNOME 3 直接对接 Xrdp登录后长时间只有背景图。第四种是 dbus 环境变量没带进远程会话导致部分组件启动后立即退出。排查时先在终端里 SSH 登录这台机器手工启动一次桌面sudo -u yourname startxfce4如果这条能拉起来窗口说明桌面环境本身没坏问题缩到 Xrdp 的会话脚本上如果连手工启动都报错先解决桌面依赖再回头看远程连接。3.2 通过日志定位 Xrdp 启动失败的位置Xrdp 的日志路径比较固定连接层看/var/log/xrdp.log会话层看/var/log/xrdp-sesman.log用户侧桌面启动失败看家目录下的~/.xsession-errors。排错顺序也按这个方向走。sudo tail -n 100 /var/log/xrdp.log sudo tail -n 100 /var/log/xrdp-sesman.log tail -n 100 ~/.xsession-errors日志文件负责环节黑屏时的信号/var/log/xrdp.log网络连接与协议协商没有连接记录说明端口未放行/var/log/xrdp-sesman.log认证与显示会话分配没有 started session 说明会话没拉起~/.xsession-errors用户桌面进程这里报的错才是黑屏真正的根因xrdp.log打印 TCP 握手和远程桌面协议协商看到connection received from说明客户端已经触达服务端xrdp-sesman.log记录starting xrdp-sesman with pid和用户认证结果~/.xsession-errors记录桌面进程自己的报错黑屏时这里往往已经写好了真正异常比如dbus-launch找不到或者某个.desktop文件语法错误。顺着时间戳读一次典型登录流程[INFO ] Socket 12: connection received from 10.0.0.8 port 51234 [INFO ] using default: hashed password file [INFO ] login_success: user yourname [INFO ] started session for user yourname: X11 :1login_success之后如果started session迟迟不出现多半是startwm.sh在启动过程中卡住出现started session但用户侧黑屏注意力就去~/.xsession-errors。还有一类连接层错误值得提Windows 客户端可能报 0x204 之类的连接失败这通常发生在 TLS 协商阶段先确认 3389 端口可达再检查xrdp.ini里的security_layer是否被设成了不匹配的组合恢复为negotiate能解决大多数这类兼容问题。3.3 PAM 与 polkit认证通过但会话不成立的隐形门槛Xrdp 在 Ubuntu 20.04 上的认证走 PAM配置文件是/etc/pam.d/xrdp-sesman。它默认引入common-auth正常情况下和 SSH 的密码认证共用同一套逻辑。如果这台机器加固过 PAM比如修改过pam_unix.so的调用链就会出现“Xrdp 登录页面提示密码错误SSH 却能登录”的怪象。排查方法是直接在终端里测认证链sudo apt install pamtester -y sudo pamtester xrdp-sesman yourname authenticatepamtester安装后运行第二条命令按提示输入密码验证失败会打印 PAM 层返回的错误码。它不经过网络直接模拟 PAM 流程能干净地分离出认证层与会话层的问题。polkit 这层通常以“会话建立后马上掉线”的形式出现。Xrdp 拉起 Xorg 时需要访问部分系统资源xrdp-sesman本身的权限如果不正确日志里会出现类似Error: Cant open display的记录。检查家目录属主和权限用stat -c %U %a /home/yourname确认是 755 或 700 且所有者正确不对就改回来然后清理残留会话进程再重试。sudo pkill -u yourname pkill -f xrdp-sesman sudo systemctl restart xrdppkill -u yourname把该用户所有残留显示进程清干净避免旧的 X 锁文件导致下一次连接失败pkill -f xrdp-sesman在 sesman 卡死时使用之后重启 xrdp 父进程它会自动拉起子会话服务。4. Xrdp 在 Ubuntu 20.04 上的进阶参数与会话管理技巧4.1 改端口、调颜色深度xrdp.ini 里最值得动的四个参数Xrdp 的主配置在/etc/xrdp/xrdp.ini[Globals]段里的参数决定远程桌面客户端和它协商出来的最终效果。日常改动集中在端口、颜色深度和加密协商策略上。参数常见值作用port3389RDP 监听端口被占时改成 3390max_bpp32最大颜色深度24 能明显减少带宽占用security_layernegotiate安全协商老客户端兼容问题改回 rdpcrypt_levelhigh加密级别改 low 会降低安全性只需要动[Globals]段里的两处[Globals] port3390 max_bpp24把port提到 3390 有两个副作用Windows 客户端连接时要显式写ip:3390防火墙要同步放行新端口。max_bpp从 32 降到 24在宽带受限的远程场景里收益明显颜色平滑度下降一点点换来的是重绘延迟下降对文字为主的运维场景够用看视频则不推荐。crypt_level在遇到加密协商报错时可临时降级。默认high用 128 位及以上个别老客户端会握手失败降到low能连通但风险由你承担。改完配置务必重启因为参数在启动期加载热改不会生效sudo systemctl restart xrdp4.2 多人同时登录从单会话切换到多会话并存Ubuntu 20.04 上的 Xrdp 默认支持多个用户并发登录但很多人没有单独配过多会话。远程会话与本地登录共用显示环境时Xrdp 会分配独立的显示编号:1、:2 等来区分会话这些内容定义在/etc/xrdp/xrdp.ini的[Xorg]与[Xvnc]两类会话区块里。[Xorg] nameXorg liblibxup.so usernameask passwordask port-1 code20usernameask和passwordask表示连接时由用户现场输入port-1让 sesman 自动分配显示端口避免多会话撞在一起code20是给 RDP 客户端的标识符。[Xvnc]区块格式基本一致只是liblibvnc.so后端从 Xorg 换成 VNC 虚拟显示。多人同时登录时把会话模板切到[Xvnc]更合适它不绑定物理 GPU虚拟显示可以并行开多个。切换方法是在连接时把会话类型选成 Xvnc。也可以把xrdp.ini里的[Xorg]名字改成[Xorg-disabled]让客户端拉列表时看不到这个入口。会话僵死时的回收命令是sudo systemctl restart xrdp-sesman这条命令会把所有远程桌面会话连同 Xorg/Xvnc 进程一起重置。它会踢掉在线用户执行前先确认当前没有正在干活的人。4.3 中文输入法与键盘布局远程会话里的两个隐藏坑Xrdp 的键盘布局默认跟随客户端的语言设置Windows 上是中文系统连进去后键盘映射基本不出问题。真正要处理的是输入法框架。Xrdp 会话默认不会自动启动 ibus 或 fcitx只装不启动中文输入法便调不出来。比较稳妥的流程是先在主机层面装好框架再让远程会话继承相关变量。以 fcitx5 为例sudo apt install fcitx5 fcitx5-chinese-addons -y im-config -n fcitx5装完后在~/.xprofile里按下面的模板导入环境变量export XDG_SESSION_TYPEx11 export XMODIFIERSimfcitx export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx最后三个变量分别告诉 X11 上层环境、GTK 程序和 Qt 程序如何找到输入法。远程会话重新登录后在 Xfce 面板里调出 fcitx 状态条再添加拼音输入源即可。若看到XMODIFIERS为空说明输入法没在会话启动前加载优先检查.xprofile是否被桌面会话读取。用 xfce4 的好处在这里也会体现它默认执行.xprofileGNOME 远程会话则不一定。中文字体显示成方块是另一个常见坑根因是 locale 或字体包缺失。按第 2 章的写法在/etc/xrdp/startwm.sh里加载/etc/default/locale就能规避大部分问题再安装fonts-noto-cjk兜底sudo apt install fonts-noto-cjk -y5. 用 Windows 和 Linux 客户端双重验证 Xrdp 安装是否真正跑通从客户端视角验证比什么都直接。Windows 上打开自带远程桌面mstsc地址填内网 IP不带端口号如果改过端口就填内网IP:3390。用户名密码是 Ubuntu 系统账户不是 Xrdp 自己的账户体系。首次连接会弹证书校验提示这是 Xrdp 自签 TLS 证书的常规流程选择继续连接即可。如果连认证界面都见不到先回到服务端跑一次自检sudo systemctl is-active xrdp ss -tln | grep 3389第一条输出active且第二条能看到监听端口说明服务侧正常。再验证会话真的被拉起用who看在线状态who正常能看到类型为:1、:2这样的显示编号和 SSH 的pts/0不同。它说明 RDP 握手、PAM 认证、X 会话初始化三个环节都走通了。此时回到 Windows 窗口应该已经能看到 Xfce 桌面。Linux 客户端验证常用xfreerdp命令行方式更适合快速确认xfreerdp /v:10.0.0.8:3389 /u:yourname/v指定目标地址和端口/u指定用户名密码会提示输入或由/p传入。xfreerdp 能打印更多底层协商日志出问题时它的报错比 Windows 客户端详细。如果 Linux 与 Windows 两台客户端都能连通说明安装本身没有问题。最后压一个实用技巧验证结束后把残留会话清掉避免占用显示编号sudo systemctl restart xrdp-sesman这条命令会踢掉所有远程用户并释放所有 X 会话资源。对没有人在线的机器这是最省事的清理方式对多人共用机器先用who确认无人再执行。本文还有配套的精品资源点击获取
返回列表