Skip to main content
用 Mac 上的 Windows App(原 Microsoft Remote Desktop)连家里的 Ubuntu。 文中地址、端口、主机名、用户名都是占位符,以本机 SSH config / frp / 组网配置为准。 先判断走哪条路,再写 .rdp。两条路的认证和客户端开关不一样,混用会表现为窗口还没出来就没了。

选哪条路

同一用户本机已经有 GNOME 时,不要再给 xrdp 起第二套 gnome-session。GNOME 50 会直接报 A graphical session is already running!,窗口管理器 1–2 秒 SIGABRT,客户端闪退。这时应镜像本机会话。 GNOME 46 仍有 X11 会话时,也可以走 xrdp 独立会话,但本机 seat 上不该再挂着同一用户的 gnome-shell

怎么连

公网(frp): 组网已通时,可直连 overlay 上的 <overlay-ip>:<listen-port>,不必绕 frp。这条应走组网网卡,不经过 Clash TUN。 连之前先完全断开旧会话,不要点「重连」到已经死掉的 XFCE / 黑屏会话。客户端里若缓存了旧端口,改 .rdp 后仍可能连错。

.rdp 开关

xrdp(0.9 / 0.10 对 CredSSP / GFX 都不完整,Mac Windows App 尤其容易黑屏或秒断):
GNOME 远程桌面(服务端只接受 NLA):
full address 里的端口必须等于服务端真实监听端口。xrdp 默认 3389,以 /etc/xrdp/xrdp.iniport=ss -lntp 为准,不要沿用旧文件里的自定义端口。

链路

xrdp + frp:
对照已有的 SSH 穿透:<vps-public-ip>:<ssh-remote-port> → 家用主机 :22。RDP 按同一套 frp 习惯另开一个远程端口。 相关角色:
  • 家用主机:用户 <linux-user>,xrdp 听 <xrdp-port>,本机 UFW 未开
  • 入口 VPS:<vps-public-ip>,frps,UFW 默认 DROP
frpc 片段:
改完后 systemctl restart frpc。SSH 也走这条 frp,重启会短暂断开 <ssh-remote-port> GNOME 远程桌面(镜像本机,组网直连示例):
用户态服务:systemctl --user enable --now gnome-remote-desktop.servicegrdctl rdp enable、关 view-only、设 TLS 证书、grdctl rdp set-credentials。空凭据会直接 Credentials are not set, denying client 3389 只能有一个占用方。xrdp 和 GNOME 远程桌面不要同时听这个端口。

假连通

公网或 overlay 上 TCP「能连上」还不等于对面在说 RDP。
  1. Clash Party TUN
    覆盖规则里若把入口 IP 丢进国内代理组,TUN 会假连通,Windows App 报 0x204
    改成 DIRECT,并在 tun 里排除:
    源文件在 Clash Party 的 override 目录(~/Library/Application Support/mihomo-party/override/)里你自己的覆盖 YAML。订阅重载可能把 work/config.yaml 盖回去,覆盖规则要留着。
  2. 入口 VPS 的 UFW
    frps 已经在听 <rdp-remote-port>,但 INPUT 默认 DROP,公网 SYN 被丢。SSH 远程端口若早已放行,RDP 新端口要单独加:
  3. 组网 overlay 用户态 TCP
    开启用户态协议栈 / KCP 代理时,客户端对 服务端并未监听 的端口也可能 SYN-ACK,随后立刻断开。本机探测会显示「通」,服务器上 127.0.0.1:<port> 却是 Connection refused。以服务器本机 ss / 本机回环探测为准,不要用客户端 TCP 通当作 xrdp 在听。
xrdp 进程还要读得了 TLS 私钥。官方做法:
系统用户 xrdp 原先不在 ssl-cert 组时,微软客户端要的 TLS 会失败,日志里是 Cannot read private key file /etc/xrdp/key.pem: Permission denied

桌面怎么起

xrdp 独立会话

xrdp + xorgxrdp + ubuntu-session,不要投本机那套没接显示器的 :0 ~/.xsession
/etc/xrdp/startwm.sh 在 exec Xsession 之前:
GNOME 46 若出现 能登录但纯黑:查 gsettings get org.gnome.mutter experimental-featuresscale-monitor-framebuffer 会画到离屏缓冲,xrdp 抓到的是黑根窗口。xrdp 会话里把它清掉:
本机显示器若还要用分数缩放,和 xrdp 会冲突。 GDM 关掉自动登录,否则同一用户的本机 gnome-shell 会占住会话,远程再起一套会秒退:
改完后本机 seat 上只应剩下 gdm 的登录界面,<linux-user> 名下不能再有 gnome-shell 较新的 Ubuntu(GNOME 49/50)已经没有 X11 的 GNOME Shell 会话。这时不要指望 xrdp + gnome-session --session=ubuntu;本机已登录就走镜像,本机未登录就用 GNOME 远程登录(系统服务,虚拟显示器),或换非 GNOME 的 X11 会话。

镜像本机会话

本机已经用同一用户登录时:
  • screen-share-modemirror-primary
  • view-only 关掉,否则只能看不能操作
  • 锁屏时 Mutter 会 Session creation inhibited,Windows App 窗口还没出来就消失。连之前确认 loginctl show-sessionLockedHint=no,或关掉空闲自动锁屏
  • 本机 GNOME 退出后共享即停

走过的弯路

xrandr 在没插显示器时所有 HDMI/DP 都是 disconnectedcurrent 1024 x 768。这种画面投到远程没有意义。

排障

Clash 若再次把入口公网 IP 送进代理,route -n get <vps-public-ip> 会走 Clash TUN,RDP 握手超时。排除后应走物理网卡。组网直连时确认走 overlay 网卡,而不是 Clash 的假 IP。

Citations

Last modified on August 23, 2026