一台银河麒麟V10桌面版机器摆在机房里键盘鼠标都在它跟前人在另一层楼的Windows笔记本前想把桌面搬过来用。这个需求在国产化替代推进得比较快的单位里非常普遍——服务器侧早就用命令行管熟了偏偏桌面版这一块因为要跑WPS、浏览器、即时通讯工具、业务客户端很多时候必须看到图形界面才能操作。我前后在三四个不同SP版本的麒麟V10桌面上折腾过RDP踩过的坑从黑屏、认证弹窗刷屏到剪贴板不通、输入法打不出中文基本集齐了。这篇就把Windows远程桌面连麒麟V10桌面这件事从方案取舍一直讲到长期运维中间所有配置都给你可以直接抄的完整内容。1. 该不该用RDP把麒麟桌面搬到Windows上很多人一上手就搜麒麟V10 远程桌面看到教程第一条是装xrdp复制粘贴跑完结果连上去一片黑然后就开始怀疑人生。问题不在xrdp本身而在于没先想清楚自己要的到底是哪一种远程——是把当前这块屏幕上显示的东西镜像出去还是在服务器内部另开一个独立的图形会话。这两种诉求对应的技术路线完全不同选错了后面怎么调都别扭。1.1 先把需求拆成两个问题第一个问题远程连上去的时候麒麟这台机器的本地屏幕还有没有人在用如果这是一台放在机房、平时没人碰的机器那你要的是独立会话RDP是最合适的选择。第二个问题远程操作需不需要看到本地已经打开的程序窗口比如本地已经登录了即时通讯工具、挂着一个长时间跑的业务客户端你想在Windows上接着操作这些窗口——这种叫屏幕共享RDP天生做不到得走VNC那一路。我用一个很直白的类比来区分xrdp的做法相当于给你在机器内部新开了一间办公室你进去从零开始打开软件VNC的做法相当于在原有办公室装了个摄像头加机械臂你远程操作的是同一张桌子。前者互不干扰、各用各的后者所见即所得但会跟本地操作抢鼠标键盘。大部分单位里的场景其实是前者这台麒麟机器就是一台被远程管辖的办公终端本地无人使用那么xrdp是性价比最高的方案。1.2 xrdp、VNC、麒麟自带远程协助的横向对比我把这三种路线在麒麟V10桌面上的实际表现整理成一张表都是我在真实环境里测出来的体感不是从文档上抄的。对比项xrdpRDP协议VNCTigerVNC/x11vnc麒麟自带远程协助类工具会话模式独立新会话可多用户并发默认共享:0屏幕也有独立模式共享当前屏幕需本地确认Windows端系统自带mstsc零安装需装VNC Viewer需要对应客户端或浏览器传输效率高有增量刷新和压缩一般带宽占用偏大视实现而定通常一般剪贴板互通支持需配置支持文字基本无碍支持文件传输支持磁盘重定向靠剪贴板或额外工具视工具而定3D/视频播放弱无硬件加速弱弱断线保持可配置保持会话依赖服务端策略通常断开即结束部署难度中配置文件要改对中需要处理桌面冲突低图形界面点几下从表里能看出来只要你的场景允许另开会话xrdp在传输效率和Windows端零安装这两点上优势非常明显。Windows自带远程桌面客户端分辨率自适应、多显示器、剪贴板、磁盘映射都是原生能力不用额外装任何软件这在受管控的办公终端上是个很大的加分项。VNC的优势在于看到的就是本地那块屏。我遇到过一种典型情况麒麟机器上跑着一个只能在本地图形界面里点确认的业务程序本地必须有人先登录这种情况就只能用VNC共享屏幕。还有一种是麒麟V10桌面自带的远程协助功能适合临时帮同事看个问题点一下同意就行但它通常需要本地有人配合点确认做无人值守不合适。1.3 xrdp到底做了什么一个协议翻译器把xrdp理解成一个翻译官最准确。Windows这头说的是RDP协议麒麟那边能听懂的是X11图形会话两边语言不通xrdp夹在中间做同声传译。它内部其实分成两个进程xrdp负责监听3389端口、处理RDP协议握手和图形编码xrdp-sesman是会话管理器负责在你登录成功后在服务器上真正把图形会话拉起来。真正把图形会话拉起来的过程是这样的sesman收到登录请求去调用你配置好的启动脚本就是那个关键的startwm.sh脚本里再去启动Xorg服务和一个桌面会话进程桌面进程按你自己的配置去读UKUI之类的会话定义最终呈现出你看到的麒麟桌面。图形数据再由xrdp编码成RDP协议丢回Windows。这个链路里任何一环断掉都会表现为黑屏或者秒退这也是为什么排查的时候必须先看日志、定位到底断在哪一环而不是瞎改配置。搞明白这条链路后面所有的坑都会变得非常好理解。还有一点必须提前说清楚xrdp开出来的会话和你本地tty上那个图形会话是两个完全独立的X显示。也就是说本地已经登录了UKUIxrdp还是能再开一个自己的会话——听起来很美好但UKUI这类桌面环境在配置存储、DBus、输入法这些地方会互相打架这就是后面要专门处理的一个大坑。2. 动手前的环境盘点别急着装包我见过太多人上来就sudo apt install xrdp装完发现源里根本没有这个包或者装的是个老版本然后就开始在网上乱找deb包。动手前花五分钟做环境盘点能省掉后面两个小时。2.1 三条命令摸清底细第一件事是确认你手上这台到底是什么底子。麒麟V10桌面版和服务器版虽然名字相近包管理器和桌面环境差别不小网上的教程往往混着写。# 看系统版本和SP补丁号 cat /etc/.kyinfo nkvers # 看桌面会话定义找出真正的启动命令 ls /usr/share/xsessions/ cat /usr/share/xsessions/*.desktop # 看包管理器和软件源 which apt yum dnf cat /etc/apt/sources.list 2/dev/null | head -20/etc/.kyinfo这个文件是麒麟特有的里面能看到dist_id和milestone比uname -a信息全得多。nkvers也是麒麟自带的版本查询命令输出比通用命令更贴合这个发行版。/usr/share/xsessions/这个目录特别关键。里面的.desktop文件描述了系统里装了哪几种桌面会话每个文件里的Exec那一行就是启动这个会话的真正命令。这一行后面要原封不动地抄进xrdp的启动脚本里抄错了就是黑屏。麒麟V10桌面版这里通常能看到ukui.desktopExec的值可能是ukui-session或者/usr/bin/startukui不同SP版本不完全一样必须以你自己机器上的实际内容为准。软件源这块要注意麒麟V10桌面的镜像源分内网源和公网源很多单位的内网环境只挂了自己的源如果源里没有xrdpapt install会直接报无法定位软件包。2.2 内网离线环境怎么把包装进去内网机器不联外网是常态这种时候有三个办法按推荐程度排第一个是先用apt list xrdp*和apt-cache search xrdp搜一下本机源里到底有没有。不少单位的麒麟源里其实是有xrdp的只是版本可能偏老0.9.x那一档够用先装上跑通再说。第二个是找一台能连外网的同版本麒麟机器用apt-get download把包和依赖一次性下齐再拷进内网。注意这里一定要在相同版本、相同架构的机器上下载麒麟V10有x86_64、aarch64、loongarch等好几种架构混了就装不上。下载依赖可以用apt-get install --download-only xrdp xorgxrdp # 包会落在 /var/cache/apt/archives/第三个是用麒麟自带的软件商店图形界面搜一搜有些SP版本商店里收录了远程桌面相关组件点一下就能装比命令行省事。装完之后用dpkg -l | grep xrdp确认一下版本心里有个数。提示xrdp和xorgxrdp是两个包前者是协议处理后者是Xorg的服务端驱动。只装前者在新版本上可能起不来一定要一起装。另外建议顺手把dbus-x11装上后面会话里很多认证问题都跟DBus有关。2.3 账户、权限和别把自己锁在门外改远程配置之前先保证自己有一条退路。我吃过一次亏改startwm.sh改错了语法xrdp连不上同时因为顺手把防火墙规则也调了SSH都进不去最后只能跑到机器跟前去救。留退路的做法很简单改配置前先备份原文件改完确认SSH还能正常登录再重启xrdp服务。SSH是生命线任何时候都不要先动SSH的配置或防火墙对22端口的放行策略。账户方面有两个硬性前提。一是远程登录用的账号必须有登录图形界面的权限正常创建的普通用户都有但如果被刻意限制过要检查一下。二是这个账号的密码不能为空也不能是锁定状态用passwd -S 用户名看一眼状态字段。麒麟V10对密码复杂度有要求如果提示密码太简单可以用sudo passwd 用户名重设一个符合策略的。关于root密码和单用户模式这里也顺带提一句。很多教程会让你直接改root密码来做配置我不建议这么做日常配置用有sudo权限的普通账号就够了。但如果真的因为误操作进不去图形界面了单用户模式是最后的救命稻草进GRUB的时候在启动项上按e编辑内核参数在linux那一行末尾追加init/bin/bash或者直接single进到shell之后mount -o remount,rw /把根分区改成可写再改文件。这套流程一定要提前演练一遍不要等出事了才现学。3. 安装与配置让远程会话真正落到UKUI包装完之后默认配置是不太可能直接给你一个完美的麒麟桌面的。默认的启动脚本会去找一些通用会话定义找到了可能是个极简的窗口管理器找不到就直接黑屏。这一节的内容是整个方案的核心也是最容易反复踩坑的地方。3.1 安装与首次启动安装没什么好说的两条命令的事sudo apt update sudo apt install -y xrdp xorgxrdp dbus-x11装完之后服务一般会自动起来确认一下状态和监听端口systemctl status xrdp systemctl status xrdp-sesman ss -tlnp | grep 3389如果服务没起来systemctl status的输出里通常会直接告诉你原因最常见的是端口被占用。3389这个端口很有辨识度如果这台麒麟机器上之前装过别的远程工具或者跑着Windows虚拟机做过端口映射就可能冲突。这时候要么把冲突进程停掉要么把xrdp的端口改掉改法在3.3节讲。第一次连接建议先在Windows上用mstsc连一下即使黑屏也要连因为只有连接过/var/log/xrdp.log和/var/log/xrdp-sesman.log里才会留下完整的过程记录后面排查全靠它。3.2 startwm.sh整个方案里最关键的一个文件先备份再动手sudo cp /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.bak sudo vi /etc/xrdp/startwm.sh把文件内容改成下面这样把会话启动命令换成你在2.1节里查到的那个Exec值#!/bin/sh # xrdp X session 启动脚本 if test -r /etc/profile; then . /etc/profile fi # 清理掉可能与本机会话冲突的运行时会话变量 unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR unset XDG_SESSION_TYPE # 显式声明这是X11会话 export XDG_SESSION_TYPEx11 export XDG_CURRENT_DESKTOPUKUI # 输入法环境变量不写这几行远程会话打不出中文 export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx # 通过dbus-launch拉起会话避免认证组件的异常 exec dbus-launch --exit-with-session /usr/bin/ukui-session这里有几个细节值得解释清楚因为它们决定了后面会不会黑屏。unset DBUS_SESSION_BUS_ADDRESS和unset XDG_RUNTIME_DIR这两行是解决本地会话和远程会话互相打架的关键。麒麟V10用systemd的用户会话管理本地登录时会设置一个XDG_RUNTIME_DIR指向/run/user/1000那里放着一堆socket。远程会话如果继承了这个路径就会去连本地会话的DBus结果就是各种认证错误和组件异常。清掉之后让xrdp会话自己重新建立一套就正常了。exec dbus-launch这一层包裹也很重要。UKUI的很多组件需要会话总线才能正常工作如果脚本只是简单地把桌面进程拉起来没有总线桌面可能会卡在启动阶段。如果你试了之后桌面还是起不来一个非常实用的兜底方案是装个轻量桌面专门给远程用。这不是妥协很多单位就是这么干的因为远程会话本身没有显卡加速跑重量级桌面体验并不好sudo apt install -y xfce4 xfce4-goodies # 然后把startwm.sh最后一行的ukui-session换成 startxfce4这套组合在远程场景下反而更流畅剪贴板、输入法、文件管理器的兼容性都更省心。我现在的做法是本地用UKUI远程专门用一套轻量会话两边各司其职互不干扰。这个取舍值得你认真考虑一下不要执着于远程也必须看到一模一样的桌面。改完之后chmod x /etc/xrdp/startwm.sh再sudo systemctl restart xrdp xrdp-sesman。3.3 端口、防火墙与开机自启端口改不休改看情况。如果Windows这台机器和麒麟不是同一台显然是3389冲突的情况不多保持默认最省事。但如果你的网络环境里有其他设备也在用3389或者出于安全习惯不想用默认端口就在/etc/xrdp/xrdp.ini的[Globals]段里改[Globals] port3390 security_layernegotiate crypt_levelhigh改端口纯粹是减少被扫描的概率属于降低噪音级别的措施不能替代真正的安全策略。防火墙这块麒麟V10桌面版一般装的是ufw系或者麒麟安全中心自带的防火墙模块。命令行确认sudo ufw status verbose如果防火墙是开启状态放行对应端口sudo ufw allow 3389/tcp sudo ufw reload如果用的是麒麟安全中心的图形界面在网络保护或者防火墙那一栏里加一条自定义规则协议选TCP端口填3389方向选入站。图形界面改的好处是策略持久化更可靠重启不会丢。开机自启别忘了sudo systemctl enable xrdp sudo systemctl enable xrdp-sesmanxrdp-sesman是独立的服务单元只enable xrdp是不够的这是很多人重启后连不上的原因。确认一下systemctl is-enabled xrdp xrdp-sesman两个都返回enabled。3.4 给远程会话准备一个专用账号这一条是我强烈建议的做法能规避掉相当一部分玄学问题。为远程连接单独建一个账号sudo useradd -m -s /bin/bash remoteuser sudo passwd remoteuser sudo usermod -aG sudo remoteuser # 需要管理员权限才加为什么这么做因为UKUI这一类基于Qt和dconf的桌面配置文件是跟着用户走的存放在家目录的.config、.local下面。如果本地登录和远程登录用同一个账号两份桌面会话同时读写同一批配置文件轻则主题错乱、面板位置乱跳重则锁文件冲突导致桌面起不来。分开账号之后各写各的物理隔离问题就消失了。顺带说一句磁盘路径的事。如果你这台麒麟机器做过数据盘分离系统盘装系统、数据盘放用户数据新建的用户家目录默认会落在系统盘上。想让远程账号的家目录也放到数据盘建用户的时候用-d指定路径sudo mkdir -p /data/remoteuser sudo useradd -d /data/remoteuser -m -s /bin/bash remoteuser sudo chown -R remoteuser:remoteuser /data/remoteuser这个细节容易被忽略等到远程用户存了几个大文件把系统盘撑满才发现问题那时候处理起来就麻烦了。4. 登进去之后的那些毛病黑屏、认证弹窗、剪贴板、输入法配置对了第一次连上去基本能看到桌面了。但接下来等着你的还有一堆小毛病这一节按从登录到用起来的顺序把常见的几个问题挨个拆开讲。4.1 黑屏与秒退按日志顺序倒推黑屏是最常见的也是最容易一头雾水的。我的排查顺序是固定的先看会话管理日志再看xrdp主日志最后看用户目录下的Xorg日志。# 会话管理日志看登录过程走到哪一步断了 sudo tail -100 /var/log/xrdp-sesman.log # 主服务日志看协议握手和连接建立 sudo tail -100 /var/log/xrdp.log # 用户家目录下的Xorg日志看图形会话本身有没有起来 ls -la ~/.xorgxrdp.*.log tail -100 ~/.xorgxrdp.*.logxrdp-sesman.log里如果看到类似session started之后紧接着没有后续说明会话进程拉起来了但立即退出这种基本都是startwm.sh里指定的会话命令有问题——要么路径写错要么命令根本不存在用which ukui-session确认一下。如果日志里出现Xorg启动失败、报模块缺失那就是xorgxrdp没装好或者版本跟xrdp对不上重装一下这两个包。还有一种黑屏很迷惑登录窗口能看到输完密码就黑。这种情况十有八九是窗口管理器起来了但合成器compositor崩了。远程会话没有真正的GPU硬开3D合成很容易失败。解决办法就是3.2节说的换轻量会话或者在UKUI的配置里关掉桌面特效。4.2 polkit认证弹窗刷屏与输密码也没用这个问题的现象特别典型连上去之后屏幕中间不断弹出需要认证的对话框内容大意是要创建颜色管理设备、要刷新软件源之类的你输入密码点确认弹窗关掉一个又冒出来两个整个桌面没法用。根因是polkit策略。这些操作在本地登录时会被自动放行因为本地是物理登录polkit认为可信。而xrdp会话在polkit眼里属于远程会话安全级别更低于是逐条拦截。桌面组件在那儿反复重试就形成了刷屏。解决办法是加一条polkit规则让指定用户组在这些无害操作上免认证。新建文件/etc/polkit-1/rules.d/49-remote-desktop.rulespolkit.addRule(function(action, subject) { if (subject.isInGroup(sudo) (action.id.indexOf(org.freedesktop.color-manager.) 0 || action.id.indexOf(org.freedesktop.packagekit.) 0 || action.id.indexOf(org.freedesktop.udisks2.) 0)) { return polkit.Result.YES; } });这几类操作分别是颜色管理、软件包管理和磁盘挂载。它们都是本地化的、不会影响系统安全的操作放行风险可控。注意规则文件里用的是sudo组如果你的远程账号不在这个组里改成对应的组名。改完之后不用重启系统polkit会自动重载规则目录。再连一次弹窗应该就消失了。这里必须提醒一句不要图省事写一条polkit.Result.YES全放行所有action的规则。那等于把系统的权限校验整个关掉任何程序都能无密码做特权操作安全上完全不可接受。规则一定要限定到具体的action前缀上。4.3 剪贴板、磁盘映射、声音这三件事这三样是能不能用得舒服的分水岭其中剪贴板和磁盘是刚需声音属于锦上添花。剪贴板靠的是xrdp-chansrv这个通道服务。正常情况下它会随会话自动启动你确认一下xrdp配置文件里没有把通道关掉[Globals] allow_channelstrue如果剪贴板只有单向能用或者复制大段文本卡住多半是通道服务挂了。用ps -ef | grep chansrv看一下有没有这个进程没有的话检查~/.xrdp-chansrv.log。另外剪贴板的实现跟桌面环境的剪贴板管理器有交互UKUI用的是自己的剪贴板管理组件有时候会被它的历史记录功能干扰可以临时关掉剪贴板历史功能试试。Windows磁盘映射把Windows的C盘D盘挂到麒麟上靠的是RDP的驱动器重定向通道挂载点默认在用户家目录下的thinclient_drives目录里ls -la ~/thinclient_drives/这个目录为空或者不存在的常见原因是FUSE没装或者用户没权限。装一下fuse3确认当前用户在fuse组里。还有一个坑这个映射默认只对当前会话有效会话重连后目录名会变写脚本的时候不要写死路径。声音这块我要说实话它是三个里面最不靠谱的。理论上装了对应的模块之后可以把远程会话的音频转发到Windows端播放但麒麟V10不同SP版本的音频栈不完全一样有pulseaudio的也有pipewire的模块包不一定对得上。我的建议是如果不是必须放弃声音重定向能省掉一堆折腾。真需要的话先在终端里确认用的是哪套音频服务再去找对应版本的模块包。4.4 远程会话里打不出中文输入法问题看着小实际最影响效率。现象是麒麟桌面上输入法图标正常显示能切换但打字出来全是英文或者候选词框跑到屏幕角落。根因是环境变量。输入法框架要靠GTK_IM_MODULE、QT_IM_MODULE、XMODIFIERS这三个变量告诉应用程序去哪儿找输入法。本地登录时这些变量由系统会话脚本设置好了远程会话里如果启动脚本没带上应用程序就不知道有输入法这回事。这就是为什么3.2节的startwm.sh里要显式写那三行。如果已经写了还是不行检查两处# 在远程会话的终端里验证变量是否生效 echo $GTK_IM_MODULE echo $QT_IM_MODULE echo $XMODIFIERS # 确认输入法进程有没有起来 ps -ef | grep fcitx变量对、进程没起来说明输入法没有被自动启动。在startwm.sh里exec那一行的前面加上启动命令fcitx -d sleep 1候选词框位置错乱是另一个问题通常是Xinerama或者多屏信息在远程会话里不准确导致的如果用的是单屏还出现这问题换轻量会话基本能解决。5. Windows这一侧连接参数与那几条眼熟的报错远程方案是两端的配合麒麟那头配好了Windows这头也有讲究。这一节讲客户端参数和几个高频报错。5.1 mstsc的实用参数与.rdp文件日常连接直接WinR输入mstsc回车填IP就行。但有几个参数值得掌握尤其是画质和分辨率相关的mstsc /v:192.168.1.100:3389 /f # 全屏连接 mstsc /v:192.168.1.100 /multimon # 多显示器拓展 mstsc /v:192.168.1.100 /w:1920 /h:1080 # 指定窗口分辨率如果你要频繁连同一台机器建议在mstsc里配好一次然后另存为一个.rdp文件放在桌面双击直连。这个文件本质是个文本可以直接编辑几个值得关注的项full address:s:192.168.1.100:3389 screen mode id:i:1 desktopwidth:i:1920 desktopheight:i:1080 session bpp:i:24 compression:i:1 audiomode:i:2 redirectclipboard:i:1 drivestoredirect:s:*audiomode:i:2表示不在本地播放声音需要在远程播放就改成0redirectclipboard:i:1开剪贴板drivestoredirect:s:*把所有本地盘都映射过去。这几项在图形界面里也能设但直接编辑文件更快更清晰。分辨率的经验不要盲目追求高分辨率。1920x1080在普通千兆内网下是流畅的但如果网络质量一般或者你连的是跨机房的链路降到1600x900甚至1366x768体验提升非常明显。远程桌面是实时编码传输分辨率越高每帧要压的数据量越大。色深也一样session bpp用24够了32位色在远程场景下看不出差别但带宽和CPU开销都要上去一截。5.2 0x204、凭据反复弹窗、ActiveX控件加载失败Windows端报错看着吓人实际上大部分能按图索骥。0x204这个错误码我的经验是绝大多数情况下跟麒麟端没关系而是会话冲突。典型场景是你之前连过一次直接关了窗口没注销会话麒麟那边会话还挂着再连的时候客户端和服务端的会话状态对不上就报这个。解决办法是先看麒麟端的会话列表sudo /usr/sbin/xrdp-sesadmin -u remoteuser # 或者直接看进程 ps -ef | grep -i xrdp把残留的会话进程清掉再重新连。长期方案是在sesman.ini里配置断线保持策略这个下一节讲。凭据反复弹窗输对了密码还是弹这是典型的xrdp会话建立后立即失败又重试的表现。回到4.1节看日志。也有一种情况是Windows端保存了旧密码凭据管理器里存着过期信息去控制面板 - 凭据管理器 - Windows凭据里把对应的条目删掉再连。无法加载远程桌面服务ActiveX控件请确保rdclientax.dll在路径中这个报错是Windows本机的问题跟麒麟完全无关。原因是远程桌面客户端的控件注册信息损坏或者被杀毒软件清理掉了。修复方法是注册系统目录下的对应dll# 以管理员身份运行命令提示符 regsvr32 /s %SystemRoot%\System32\mstscax.dll如果注册报错说明文件本身损坏了用系统文件检查器修复sfc /scannow顺便说这类控件相关的问题在精简版系统、被第三方优化工具清理过的系统上更容易出现。办公终端的系统最好不要做过度优化省下来的那点资源还不够折腾的。5.3 授权模式尚未配置11天后停止工作到底在说什么这条提示我特意拎出来讲因为很多人看到11天后停止工作会吓一跳以为自己的远程方案要到期了。这条提示来自Windows Server的远程桌面服务授权机制是Windows那边在说我这边的RDS授权还没配宽限期还剩11天。它的触发条件是你连接的目标是Windows Server系统本身而不是通过客户端连到别处。也就是说如果你在Windows上准备连麒麟压根不会看到这条提示如果你看到了说明你在某个环节连错了目标比如误连到了本地的另一台Windows Server或者看的日志是别的机器的。搞清楚这一点很重要能避免你在错误的方向上排查半天。麒麟端的xrdp是完全开源免费的没有任何授权这个概念不存在到期一说。5.4 把3389收进SSH隧道里如果你对安全性要求高一个简单有效的做法是把RDP端口关在防火墙后面只通过SSH隧道访问。前提是麒麟机器上开着SSH服务。Windows端用ssh命令做本地端口转发ssh -L 13389:127.0.0.1:3389 remoteuser192.168.1.100 -N这条命令的意思是在Windows本地的13389端口和麒麟机器的3389端口之间搭一条加密通道。隧道起来之后mstsc连127.0.0.1:13389实际上就到了麒麟的3389。配合上防火墙只放行22端口、封掉3389安全性提升是实打实的RDP的握手和认证全在加密通道里走外部扫描也扫不到远程桌面服务。代价是每次连接前要先起隧道稍微麻烦一点可以写成批处理脚本一键搞定。另外如果你的内网有堡垒机或者跳板机规范那就按单位的规定走别自己搭旁路。6. 长期使用的调优与运维经验跑通只是起点用起来舒服才是目的。这一节分享一些长期使用中攒下来的经验。6.1 让画面不再像幻灯片远程桌面天生不适合跑动画。几个立竿见影的调整关掉桌面特效。UKUI的桌面特效在远程会话里是纯负担每帧都要编码传输看起来就是一顿一顿的。在设置里把窗口动画、透明效果、桌面切换动画都关掉。色深降到16位或者24位。在.rdp文件里把session bpp调低肉眼几乎看不出差别但传输量明显下降。关掉不需要的重定向。声音重定向、磁盘重定向、打印机重定向每个都是一路额外的通道用不上的就关掉。.rdp文件里把对应项设成0就行。检查网络的MTU和延迟。如果画面卡顿是间歇性的特别是打字延迟明显先测一下到麒麟机器的网络延迟和丢包。xrdp的会话建立和维持对环境比较敏感链路抖动的环境下体验会很差。还有一个容易被忽略的点麒麟的壁纸如果是高清大图每次重绘都要传一张大图换成纯色或者简单图案的壁纸远程体验会好一些。6.2 多用户并发与断线保持xrdp默认支持多用户并发每个用户一个独立会话互不干扰。控制并发数的参数在/etc/xrdp/sesman.ini里[Sessions] MaxSessions50 KillDisconnectedfalse DisconnectedTimeLimit0 IdleTimeLimit0KillDisconnectedfalse配合DisconnectedTimeLimit0的意思是客户端断开后不杀会话也不设超时。这样你从Windows上关掉窗口麒麟那边的程序和窗口都还开着下次连回来还是原来的样子。这对那些需要挂长任务比如跑一个长时间的脚本、开着一个不能断的业务客户端的场景非常有用。代价是要注意资源占用。会话挂着不释放内存和CPU都会被占着。如果只是偶尔用建议还是设一个合理的DisconnectedTimeLimit比如3600秒一小时后自动回收。改完sesman.ini要重启xrdp-sesman服务才生效。6.3 安全上的几个习惯我把远程相关的安全习惯归纳成几条都是低成本高收益的。远程账号用独立账号不用管理员账号密码按单位的复杂度要求设置定期换。能改默认端口就改不是为了安全而是为了减少自动化扫描带来的日志噪音。防火墙做源地址限制只允许办公网段访问远程桌面端口其他一律拒绝。关闭不必要的通道用不到的功能就等于没打开的入口。定期看/var/log/xrdp.log异常登录尝试会留下记录看到大量来自不认识的IP的连接尝试就考虑上更严格的访问控制。系统补丁和xrdp版本保持更新安全更新该打就打。这些都是常规操作没什么高深技巧但坚持做和不做差别很大。6.4 我踩过的几个具体坑说几个印象深刻的都是网上教程不会写的。坑一改配置忘了备份把本地桌面也搞挂。有一次我在startwm.sh里加了一行不太对的export结果不只是远程连不上本地重启后桌面也起不来了——因为那个脚本被别的会话也引用了。教训是改/etc下面的文件永远先cp一份带日期的备份.bak后面加上年月日。坑二本地和远程同时用同一个账号配置互相覆盖。现象是本地好不容易把面板调好远程登一次回来发现面板位置全变了。这就是dconf配置文件的并发写入问题。用了专用账号之后彻底消失。坑三以为改完就生效忘了重启服务。xrdp.ini和sesman.ini改完必须重启对应服务重启错了也没用——xrdp.ini归xrdp服务管sesman.ini归xrdp-sesman管。两个都重启最保险。坑四防火墙放行了但状态没刷新。用ufw的话allow之后记得reload或者确认规则真的在status里出现了。有次我加完规则就去连怎么都连不上后来发现规则在但防火墙没重载。坑五跨版本照抄教程。麒麟V10的SP1、SP2、SP3在桌面会话的启动命令上是有差异的从网上抄的Exec行放到自己机器上可能就是错的。永远以自己机器上/usr/share/xsessions/里的实际内容为准这一步花不了两分钟能省掉一晚上的排查。坑六忘了Windows那边也占3389。如果你打算在麒麟机器上同时跑点什么需要监听端口的东西或者做过端口转发3389可能被占。上ss -tlnp看一眼端口冲突的问题排查起来其实很快但想不到就会绕很久。我个人在这套方案上跑了小半年现在的状态是一台放在机房的麒麟V10桌面机配了独立的远程账号和轻量会话Windows这边双击一个.rdp文件就能进去干活剪贴板、文件互传都正常声音重定向我直接放弃了。真要说有什么心得就是别追求远程和本地一模一样把两边的定位分开来设计问题会少一大半。另外动手前把SSH通道和配置备份这两件事做好剩下的都是可以慢慢磨的细节。
阅读完成 · 觉得有帮助?