RDP 通讯协议详解

2023-07-16 linux

有过 Windows 使用经验的人对于远程桌面(Remote Desktop Protocol ,RDP)一定不会陌生。RDP 是由微软公司开发的一种专有协议,它为用户提供了通过网络连接到另一台计算机的图形界面。在使用上,用户需要使用 RDP 客户端软件,而在远程另一台计算机则需要运行 RDP 服务器软件。

简介

可以通过如下命令安装。

apt install xrdp

默认 xrdp 使用 /etc/ssl/private/ssl-cert-snakeoil.key 配置文件,不过仅对 ssl-cert 用户组成员可读,可以通过如下命令将 xrdp 添加到这个用户组。

adduser xrdp ssl-cert

另外,xrdp 不支持 Gnome 直接链接会报 Oh no! Something has gone wrong 的错误,详细可以查看 Issues 2293 的内容。

所以,可以安装 xface 进行适配,命令如下。

----- 安装相关的软件包
apt install xfce4
----- 选择默认的管理器,选择 startxfce4
update-alternatives --config x-session-manager
----- 如果已经安装,那么重启
systemctl restart xrdp xrdp-sesman

协议详解

可以通过 tcpdump 进行抓包,以 xrdp 为例,命令如下。

tcpdump -nnX -i lo tcp port 3389
tcpdump -nnX -i lo tcp port 3389 -w /tmp/rdp.cap

通过 Wireshark 分析的时候可能 TLS 加密,此时参考 Wireshark TLS 进行分析,对应的私钥文件可以通过 /var/log/xrdp.log 查看,一般是 /etc/xrdp/key.pem 文件。

 Client                                                                   Server
   |-------------------- X.224 Connection Request PDU ---------------------->|
   |<------------------- X.224 Connection Confirm PDU -----------------------|
   |                                                                         |
   |------ MCS Connect Initial PDU With GCC Conference Create Request ------>|
   |<---- MCS Connect Response PDU With GCC Conference Create Response ------|
   |                                                                         |
   |------------------- MCS Erect Domain Request PDU ----------------------->|
   |------------------- MCS Attach User Request PDU ------------------------>|
   |<------------------- MCS Attach User Confirm PDU ------------------------|
   |================== MCS Channel Join Request PDU(s) =====================>|
   |<================= MCS Channel Join Confirm PDU(s) ======================|
   |
   |------ Authentication Type Selected By Client ------>|
   |<------ Authentication Challenge From Server --------|
   |-------- Authentication Response From client ------->|
   |<------------- Authentication Result ----------------|
   |                                                     |
   |---------------- Share Desktop Flag ---------------->|
   |<---- Server Init(FrameBuffer PixelFormat Name) -----|

参考

协议

实现

一些常见的实现。

  • XRDP 通过 C 语言实现的服务端,本来以为是很古老的,没想到现在仍然在更新。
  • RDPY Python 的实现,支持代理、截图等操作。
  • rdesktop 同样通过 C 语言实现,是一个客户端,不过最近没有太多更新。
  • grdp 通过 GoLang 实现的协议层,不过很多功能是不完善的。
  • rdp-rs 通过 Rust 实现的协议层,同时包含了一个客户端。
  • Remmina 基于 GTK 的 RDP 客户端实现。