FreeRDP

关注
义项:远程桌面协议客户端实现
FreeRDP

FreeRDP 是一个免费、开源的远程桌面协议(Remote Desktop Protocol, RDP)实现,以 Apache 2.0 许可证发布,既提供可直接使用的客户端程序,也提供可供二次开发的 C 语言库[1]。它使 Linux、macOS、Android 等非 Windows 平台能够连接到微软 Windows 的远程桌面服务,与官方客户端使用同一协议,因而被众多图形前端和终端设备采用[2]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

FreeRDP 是对微软远程桌面协议的开源实现,以 Apache 2.0 许可证发布,代码主要由 C 语言写成[1]。它不是一个单一程序,而是一套分层结构:底层是与操作系统无关的协议核心库,上层是若干图形界面客户端,此外还包括虚拟通道插件和服务器端接口[3]。因此,同一套代码既能编译成命令行客户端,也能被第三方程序当作库来调用[1]。

由于 RDP 是 Windows 远程桌面服务的原生协议,FreeRDP 让非 Windows 系统可以直接使用该协议完成远程登录和桌面画面传输,而不必改用其他屏幕共享方案[4]。

原理

FreeRDP 按连接建立、能力协商、数据交换的顺序组织会话。客户端先通过 TCP 与服务器建立连接,随后完成 X.224/TPKT 握手和协议协商,在 RDP、TLS 与网络级身份验证之间选择安全模式;若协商成功,NLA 环节会借助 CredSSP,以 NTLM 或 Kerberos 完成凭据校验[3]。此后双方交换 MCS 连接与能力数据块,进入许可证阶段,再初始化虚拟通道并开始绘制桌面[3]。

会话的全部状态保存在上下文对象中,包括设置、通道管理器、输入接口、显示与更新回调,以及位图、字形和指针缓存[5]。图形数据以快速路径(FastPath)报文承载,报文按最大请求尺寸分片,必要时启用批量压缩,并按安全标志附加校验签名或加密[6]。

为屏蔽平台差异,项目把 Windows 风格的类型与线程、SSPI、日志、流处理等原语抽成独立的可移植运行库 WinPR,FreeRDP 自身只使用这套类型,从而让同一份源码可在多个系统上编译[3]。WinPR 提供的是应用程序接口兼容,而非二进制兼容,在 Windows 上仍会调用系统原生接口。

音频、剪贴板、驱动器、打印机、智能卡、USB 重定向等功能由可加载的虚拟通道插件实现,插件分为静态通道与动态通道两种接口,以独立共享库的形式编译[3]。以剪贴板通道为例,客户端与服务端通过格式列表、格式数据请求和格式数据响应等报文协商并传递内容,文本通常优先采用 UTF-16 编码[7]。

发展历程

在微软把远程桌面协议引入 Windows 之初,官方客户端只面向 Windows,其他系统缺少原生支持,系统管理员只能退而使用 VNC 之类方案或另备一台 Windows 机器。约 1999 年,Matthew Chapman 以逆向工程方式实现了当时尚未公开的 RDP 4.0 客户端,项目名为 rdesktop,按 GPL 第 2 版发布[4]。此后 rdesktop 逐渐成为 Unix 与 Linux 上的标准远程桌面客户端,也出现了多种图形前端[4]。

2008 年 2 月,微软宣布公开 RDP 协议规范,围绕是否采用官方规范,rdesktop 社区出现分歧;到 2009 年,其代码约 3 万行,大多来自逆向工程,难以加入较新的协议特性[4]。因键盘处理等改造引发争议,加之原团队对变更与采用规范持保留态度,Marc-André Moreau、Jay Sorg 等开发者在 2009 年 5 月从 rdesktop 分叉出 FreeRDP[4]。项目早期的目标是对代码进行模块化改造,并依据微软公开规范重新实现协议部分[4]。

早期版本沿用 GPL 第 2 版,不利于商业公司或专有产品使用。项目决定改用 Apache 许可证,但因部分版权持有人不同意而无法直接变更,于是选择放弃原有代码,依据公开规范从零重写,这一决定在 2011 年 7 月公布[4]。重写启动约 6 个月后,2012 年 1 月 16 日,Marc-André Moreau 宣布 FreeRDP 1.0 正式发布,该版本成为首个以 Apache 许可证发布的稳定版,支持 RemoteFX 编解码、NSCodec、RemoteApp、多媒体重定向、网络级身份验证与 FIPS 兼容的 RDP 安全机制[8]。

重写后确定的架构被拆分为协议核心、缓存、编解码、键盘映射、虚拟通道、便携式 GDI 等若干库,客户端则包括面向 X11 的 xfreerdp 和面向 Windows 的 wfreerdp[8]。项目此前也曾获得 Open Thin Client Alliance 的支持,该联盟由多家厂商与自由软件项目组成,关注瘦客户端领域的标准化与许可证问题[9]。后续版本继续扩展平台与功能,当前代码以 3.x 系列发布,Debian 等发行版中的对应源码包即命名为 freerdp3。

应用

FreeRDP 最常见的用途是从非 Windows 系统连接运行远程桌面服务的 Windows 主机,可连接的 Windows 版本覆盖 NT 服务器版、2000、XP、Vista、7、8、10 以及对应的服务器版本。命令行客户端 xfreerdp 支持指定分辨率、色深、全屏、多显示器、动态分辨率以及剪贴板、驱动器、音频、打印机等重定向选项[10]。

除命令行形式外,项目还提供面向 X11、Wayland、SDL2/SDL3、Windows、macOS、Android 和 iOS 的客户端,其中 Android 版以 aFreeRDP、iOS 版以 iFreeRDP 的名称在各应用商店发布[1]。许多第三方图形客户端并不自行实现协议,而是把 FreeRDP 作为底层库调用,由界面负责收集参数并驱动会话,例如 Remmina 的 RDP 插件即属于这一模式[10]。基于 FreeRDP 的客户端也常被用于 Linux 瘦客户端等场景[2]。

项目还包含服务器侧的接口,开发者可实现能力交换、连接后处理、激活和登录等回调,从而构建 RDP 服务端;仓库中提供影子服务器作为参考实现,并附带一个 RDP 代理[1][3]。在需要让浏览器访问远程桌面的场合,也有人把 FreeRDP 与负责协议转换的网关程序组合使用[11]。

局限

FreeRDP 实现的是微软公开规范所描述的协议,因此其能力受规范本身约束:服务器的部分私有扩展、与新版本 Windows 独占特性绑定的功能未必能被完整复现,某些高级图形特性还取决于编译时是否启用了相应依赖[10]。不同的发行版打包方式也会造成差异,若打包时关闭了图形客户端或插件通道,可用的功能就会减少[12]。

作为广泛部署的网络协议实现,该项目历史版本中曾出现多起内存安全问题,受影响的多为较早的 3.x 版本。其中有关于证书身份校验的缺陷:受影响的版本自行实现了主机名匹配逻辑,而非调用底层库的长度感知校验接口,可能导致在证书链可信或被错误签发的情况下绕过服务器身份验证;该问题在 3.29.0 中修复[13]。另有解码路径中的越界写入问题,恶意服务器可借此在客户端上造成堆越界写,修复版本为 3.23.0[14]。

同类问题还涉及音频通道的释放后使用,即通道关闭并释放内部状态后,异步播放线程仍可能处理已排队的报文,该问题在 3.22.0 中修复[15]。远程桌面网关处理环节亦曾存在越界读取,攻击者控制网关时可通过构造不一致的消息长度使客户端读取超出分配的缓冲区,该问题在 3.32.0 中修复[16]。此外,Windows 平台上的证书缓存文件名格式化逻辑曾因未保证字符串终止而产生越界读取,仅在 Windows 构建上受影响,3.20.0 已修补[17]。

从使用角度看,客户端本身并不解决远程桌面服务暴露带来的风险,连接是否安全取决于服务端配置、身份验证方式与网络通路;客户端侧对证书警告的处理方式直接影响校验是否真正生效[10]。

参见

  • 远程桌面协议 —— FreeRDP 所实现的网络协议,由微软定义。

  • rdesktop —— FreeRDP 在 2009 年分叉自这一早期开源 RDP 客户端项目。

  • Remmina —— 调用 FreeRDP 作为底层库的图形化远程桌面客户端。

  • 网络级身份验证 —— RDP 会话在建立桌面连接前校验凭据的安全机制。

  • 瘦客户端 —— FreeRDP 客户端的主要应用载体之一。

参考资料

  1. Introduction [引用日期2026-10-14]
  2. FreeRDP [引用日期2026-10-14]
  3. Architecture [引用日期2026-10-14]
  4. Hi! - The history of the FreeRDP project [引用日期2026-10-14]
  5. Client Context [引用日期2026-10-14]
  6. fastpath [引用日期2026-10-14]
  7. cliprdr [引用日期2026-10-14]
  8. FreeRDP 1.0 released [引用日期2026-10-14]
  9. linux-magazin.de 上的网页 [引用日期2026-10-14]
  10. Linux 远程桌面连 Windows:Remmina、xfreerdp 与排错 | rdp.monster [引用日期2026-10-14]
  11. 问在我的Ubuntu服务器上配置FreeRDP客户端以访问其他桌面EN [引用日期2026-10-14]
  12. freerdp [引用日期2026-10-14]
  13. CVE-2026-66402 in FreeRDP [引用日期2026-10-14]
  14. FKIE_CVE-2026-26965 - Vulnerability-Lookup [引用日期2026-10-14]
  15. CVE-2026-24684 in FreeRDP [引用日期2026-10-14]
  16. Information Technology Laboratory [引用日期2026-10-14]
  17. CVE-2025-68118 | Ubuntu [引用日期2026-10-14]
词条评价
词条统计

浏览次数:4 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T21:14:10Z

历史版本

本条目引用的词条
远程桌面协议 rdesktop Remmina 网络级身份验证 瘦客户端