RDP 实战与排错 — 抓包、mstsc/xfreerdp 与常见连接故障
Wireshark 抓 RDP、mstsc/xfreerdp/PowerShell 配置命令、连接失败与 CredSSP 报错排查 / 应用层 / TCP 3389
Table of Contents
这篇你能学到
- 怎么用 Wireshark / tcpdump / pktmon 抓到 RDP 流量,以及在密文里还能看出哪些线索(协商结果、失败码、通道列表)。
mstsc、xfreerdp、PowerShell 三套命令的常用参数,从连接、改端口到会话管理。- 六类高频故障(连不上、CredSSP 报错、NLA 不支持、证书告警、黑屏、卡顿)的结论先行排查路径,以及 RDP/VNC/SSH/SPICE/X11 的横向对比和面试速查。
1. 抓包观察
1.1 Wireshark 显示过滤式
这组过滤式能干什么:从一堆流量里精准捞出 RDP,并且按层次拆开看——想看谈判过程就用
cotp,想看通道分配就用t125,想确认加速通道有没有生效就看udp.port==3389。
| |
命令行等价抓取:
这组命令能干什么:在没有图形界面的服务器上把 RDP 流量落盘成 pcap 文件,再拿回本地慢慢分析。Windows 那三行尤其实用——不用装 Wireshark,系统自带的
pktmon就能抓包并转成 pcap。
| |
1.2 典型字段说明(看什么)
| 观察点 | 字段 / 现象 | 判读 |
|---|---|---|
| 第 1 个数据包 | cotp Connection Request,Cookie: mstshash=alice | 客户端已到达服务端;用户名明文可见(安全提示) |
| CR 中 | requestedProtocols:0x03 = TLS+CredSSP | 客户端愿意用的安全等级 |
| CC 中 | selectedProtocol:0x02=CredSSP、0x01=TLS、0x00=RC4 | 服务端最终选择;返回 Negotiation Failure(0x03) 说明双方安全策略不匹配 |
| CC 失败码 | SSL_REQUIRED_BY_SERVER(1) / SSL_NOT_ALLOWED_BY_SERVER(2) / HYBRID_REQUIRED_BY_SERVER(5) | 直指"服务端强制 NLA / 客户端不支持"类故障 |
| TLS 证书 | Subject: CN=<主机名>,Issuer 相同 | 自签名证书 → 客户端弹"证书不受信任" |
| MCS Connect-Initial | GCC 客户端核心数据:desktopWidth/Height、colorDepth、clientName、keyboardLayout | 确认分辨率/色深协商,排查显示异常 |
| Channel Join | 逐条 channelId(1003 是 I/O 通道) | 缺少 cliprdr/rdpdr → 剪贴板/磁盘重定向被策略禁用 |
| 稳态流量 | TPKT 0x03 消失,出现首字节 0x00/0x04 的短包 | 已切到 Fast-Path,属正常 |
| UDP 侧 | udp.port==3389 有持续双向流量 | UDP 传输生效;只有 TCP 有流量 → UDP 被防火墙拦,弱网下会卡 |
| 无任何响应 | 只有客户端 SYN 重传 | 端口未监听/防火墙丢弃(DROP 而非 REJECT) |
2. 常用命令 / 配置
2.1 Windows 客户端(mstsc)
这组命令能干什么:
mstsc是 Windows 自带的远程桌面客户端,命令行参数让你跳过图形界面直接连,并预设分辨率、屏幕数、凭据保存策略等。/restrictedAdmin尤其值得记住——它让你的密码不会落在远端机器上。
| |
2.2 Windows 服务端配置(PowerShell,管理员)
这组命令能干什么:在被连的那一端把远程桌面打开、放行防火墙、强制启用 NLA,并查看/管理当前有谁登着。排查"连不上"时,前四条基本就是标准体检项。
| |
2.3 Linux 客户端 / 服务端
这组命令能干什么:Linux 上用
xfreerdp连 Windows,参数覆盖了安全模式、证书信任、剪贴板与磁盘重定向、弱网优化、音频;后半段则是反过来——让 Linux 自己变成 RDP 服务端(xrdp),并查看它的日志。
| |
2.4 连通性与安全检测
这组命令能干什么:先确认"端口到底通不通",再用 nmap 脚本探出服务端的 NTLM 信息与加密配置;最后一段是最推荐的安全访问姿势——用 SSH 隧道把 3389 藏起来,不直接暴露在公网。
| |
2.5 修改 RDP 监听端口(降低扫描噪音)
这组命令能干什么:把监听端口从人尽皆知的 3389 换成别的,顺带把新端口的防火墙规则一起加上(TCP 和 UDP 都要加,否则弱网加速失效)。注意这只是降噪,不能替代 NLA、账户锁定等真正的安全措施。
| |
3. 常见故障与排错
3.1 “远程桌面无法连接到远程计算机”
先记住结论:这是最笼统的报错,九成落在"服务没开 / 防火墙拦了 / 端口被改了 / 你没权限 / 会话满了“这五类里,按下表从网络层往上逐级排除即可。
| 可能原因 | 排查方法 |
|---|---|
| 远程桌面未启用 | 服务端查 fDenyTSConnections 是否为 0;Get-Service TermService 是否 Running |
| 防火墙拦截 | Test-NetConnection srv01 -Port 3389;客户端只见 SYN 重传即为 DROP |
| 端口被改 | 服务端查 PortNumber 注册表值;netstat -ano | findstr LISTENING |
| 端口被占用 | Get-Process -Id (Get-NetTCPConnection -LocalPort 3389).OwningProcess |
| 用户无权限 | 用户需属于 Remote Desktop Users 或 Administrators 组 |
| 会话数超限 | 工作站版仅 1 个会话;query user 后 logoff <ID> 释放 |
3.2 “出现身份验证错误,要求的函数不受支持”(CredSSP 加密 Oracle 修正)
先记住结论:这不是你的密码错了,而是两台机器的补丁状态不一致——正确解法是给服务端打补丁,改客户端策略只是应急。
现象:打补丁后的客户端连未打 CVE-2018-0886 补丁的服务端时报错。
原因:CredSSP 加密 Oracle 修正策略默认 Mitigated,拒绝与未修补服务端协商。
正确做法:给服务端打补丁。临时绕过(有安全风险,仅内网应急):
下面这段能干什么:把客户端的 CredSSP 策略临时放宽到"允许连未修补的服务端”,让你先把活干完。修好服务端后一定要改回 0,否则等于长期留了个中间人攻击面。
| |
3.3 “远程计算机需要网络级别身份验证,而您的计算机不支持”
先记住结论:服务端强制要求 NLA,而你的客户端太老不会用——升级客户端是正解,降级服务端安全策略是下策。
- 客户端过旧(如 XP/老版 FreeRDP)不支持 CredSSP。
- 排查:抓包看 CC 返回
HYBRID_REQUIRED_BY_SERVER(0x05)。 - 方案:升级客户端;或
xfreerdp /sec:tls;或服务端UserAuthentication=0(降低安全性,不推荐)。
3.4 证书告警:“无法验证此远程计算机的身份”
先记住结论:这不是故障,是服务端在用自签名证书——功能完全可用,但你无法确认对面是不是真的那台机器。要消除告警就换成企业 CA 签发的证书。
- 原因:服务端使用自签名证书。
- 方案:部署企业 CA 签发证书并绑定:
下面这段能干什么:从本机证书库里按主体名找出证书的指纹,再把这个指纹绑定到 RDP 监听器上,让 RDP 改用受信任的证书而不是自签名证书。
3.5 连上后黑屏 / 卡在 “正在配置远程会话”
先记住结论:网络和认证都没问题了,问题出在"画面这一段"——重点怀疑图形管线(RemoteFX/EGFX/WDDM)、用户配置文件损坏,以及 VPN 场景下的 MTU 分片。
| 原因 | 排查 |
|---|---|
| 显卡驱动或 EGFX 管线异常 | 组策略关闭 “使用高级 RemoteFX 图形”;客户端 .rdp 加 bitmapcachepersistenable:i:0 |
| 用户配置文件损坏 | 事件查看器 应用程序和服务日志 → Microsoft → Windows → TerminalServices-LocalSessionManager/Operational |
| MTU / 分片问题(VPN 场景) | 降低 MTU 测试:netsh interface ipv4 set subinterface "以太网" mtu=1400 store=persistent |
| 显示驱动 WDDM 冲突 | 组策略:计算机配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程会话环境 → 对远程桌面连接使用 WDDM 图形显示驱动程序 设为"已禁用" |
3.6 卡顿 / 鼠标拖影 / 视频不流畅
先记住结论:头号嫌疑是 UDP 通道没打通——RDP 靠 UDP 承载图形音频来避开 TCP 重传,UDP 被拦就会明显拖影;其次才是画质设置过高和链路丢包。
- 确认 UDP 通道是否生效:抓
udp.port==3389有无双向流量;无则放行 UDP。 - 客户端体验设置降级:
.rdp中connection type:i:1(低速链路)、关闭桌面背景与字体平滑。 - 服务端组策略启用
H.264/AVC 444 图形模式(需 RDP 10+ 客户端)。 - 检查丢包与 RTT:
ping -t、pathping;RDP 对 >2% 丢包非常敏感。 xfreerdp /network:modem|broadband|lan让 FreeRDP 自动套用预设。
3.7 剪贴板 / 磁盘重定向失效
先记住结论:大概率是被组策略禁掉了,通道根本没建起来——抓包看 Channel Join 阶段有没有对应通道,一眼就能分辨是"策略禁用"还是"进程卡死"。
- 抓包看 Channel Join 阶段是否有
cliprdr/rdpdr;没有说明被组策略禁用。 - 服务端组策略:
远程桌面服务 → 远程桌面会话主机 → 设备和资源重定向,检查"不允许剪贴板重定向"等项。 - 客户端进程卡死:远端
taskkill /f /im rdpclip.exe后start rdpclip.exe可恢复剪贴板。
3.8 排查思路总览
这张图能干什么:按"卡在哪一步"分叉定位——从最外层的端口连通性,一路走到最内层的图形管线,每一层给出对应的怀疑对象。
提示:Kerberos 认证要求客户端与服务端时间偏差 ≤ 5 分钟,时间不同步会表现为莫名其妙的认证失败——这也是 RDP 与 NTP 的隐性关联。
4. 与其他协议对比
| 维度 | RDP | VNC (RFB) | SSH | SPICE | X11 Forwarding |
|---|---|---|---|---|---|
| 端口 | TCP/UDP 3389 | TCP 5900+N | TCP 22 | TCP 5900+ | 经 SSH 22 |
| 规范 | MS-RDPBCGR(微软开放规范) | RFC 6143 | RFC 4251~4254 | 红帽开放协议 | X Window System 协议 |
| 传输内容 | 绘图订单 + 编码图像 + 设备重定向 | 帧缓冲像素矩形 | 字符流 + 隧道 | 图形/音视频/USB(面向 KVM) | 图形绘制原语 |
| 带宽效率 | 高(订单+缓存+H.264) | 低~中(依赖编码,如 Tight/ZRLE) | 极高(纯文本) | 高 | 低(往返多,广域网体验差) |
| 加密 | TLS + CredSSP/NLA(内建) | 多数实现默认不加密,需隧道 | 内建强加密 | TLS 可选 | 由 SSH 提供 |
| 多用户会话 | 支持(RDS 多会话) | 通常单一屏幕共享 | 天然多会话 | 单虚机会话 | 多会话 |
| 设备重定向 | 剪贴板/磁盘/打印机/音频/USB/智能卡 | 一般仅剪贴板 | 端口转发/SFTP | 剪贴板/USB/音频 | 有限 |
| 跨平台 | 服务端以 Windows 为主(Linux 用 xrdp) | 全平台 | 全平台 | Linux/KVM | Unix 系 |
| 典型用途 | Windows 图形运维、VDI | 跨平台屏幕共享、嵌入式 | 服务器命令行运维 | KVM 虚机控制台 | 转发单个 Linux GUI 程序 |
选型口诀:管 Windows 用 RDP,管 Linux 命令行用 SSH,跨平台看屏幕用 VNC,只想转发一个 Linux 图形程序用 ssh -X。
5. 速查表 / 常见面试题
5.1 端口与标识速查
| 项目 | 值 |
|---|---|
| 标准端口 | TCP 3389 + UDP 3389(IANA 服务名 ms-wbt-server) |
| RD Gateway | TCP 443(RPC over HTTPS)+ UDP 3391 |
| RD Web Access | TCP 443 |
| RD 授权(License) | TCP 135 + 动态 RPC |
| RD Connection Broker | TCP 5504 / 3389 |
| 抓包特征字节 | TPKT 首字节 0x03 |
| 明文用户名位置 | X.224 CR 的 Cookie: mstshash= |
| 服务名(Windows) | TermService(远程桌面服务)、UmRdpService(重定向) |
| 关键日志 | TerminalServices-LocalSessionManager/Operational、TerminalServices-RemoteConnectionManager/Operational、安全日志 4624(登录类型 10 = RemoteInteractive) |
5.2 高频面试题
Q1:RDP 为什么要在 TCP 之上再叠 X.224 和 MCS? A:RDP 源自 ITU-T T.120 多点会议协议族,T.125 MCS 提供的"多通道复用 + 多点通信"能力被直接复用来实现虚拟通道;X.224 Class 0 + TPKT(RFC 1006)则是把面向 OSI 的传输原语搬到 TCP 上的适配层。历史包袱,但也带来天然的多通道能力。
Q2:RDP 和 VNC 最本质的区别? A:RDP 是语义级远程化——服务端理解 GDI 绘图语义,发送的是"画什么";VNC 是像素级同步——发送的是"屏幕哪块变成了什么样"。因此 RDP 在文字/窗口场景带宽低得多,且能重定向设备;VNC 胜在协议简单、跨平台、可共享物理屏幕。
Q3:什么是 NLA,为什么强烈建议开启? A:Network Level Authentication,基于 CredSSP,在建立 RDP 会话之前先在 TLS 内完成身份认证。好处:① 未认证请求不消耗服务端会话/图形资源,抗 DoS;② 大幅缩小攻击面(BlueKeep CVE-2019-0708 等预认证漏洞在开启 NLA 后无法被匿名利用);③ 支持单点登录。
Q4:RDP 的 UDP 通道是干什么用的?关掉会怎样? A:MS-RDPEUDP,用于承载对时延敏感、对丢包容忍的图形与音频数据(Lossy 模式),避免 TCP 重传导致的画面停顿。关掉后连接仍然可用(回退到纯 TCP),但弱网/高时延下会明显卡顿、鼠标拖影。
Q5:抓 RDP 包时能看到什么明文?
A:TCP 握手后的 X.224 Connection Request 里有明文 Cookie: mstshash=<用户名>,以及协商的安全协议标志;TLS 握手中可见服务端证书主体(通常是主机名)。此后全部加密。所以从抓包可枚举登录用户名,这也是不要把 3389 直接暴露公网的理由之一。
Q6:为什么公网暴露 3389 很危险?应该怎么做? A:3389 是被扫描最频繁的端口之一,长期面临口令爆破与勒索软件投递(BlueKeep、DejaBlue 等预认证 RCE 曾大规模利用)。正确做法:置于 VPN / RD Gateway(443) / 零信任网关之后;强制 NLA + MFA;账户锁定策略;改非标端口降噪;只允许白名单源 IP;及时打补丁。
Q7:Fast-Path 和 Slow-Path 有什么区别? A:Slow-Path 完整携带 TPKT+X.224+MCS+安全头,用于连接建立与控制类 PDU;Fast-Path 把这些头压缩成最少 2 字节(首字节即动作与标志),用于稳态的输入事件和图形更新,显著降低小包开销与时延。
Q8:远程桌面登录在 Windows 安全日志里是什么登录类型? A:类型 10(RemoteInteractive);若通过 RD Gateway 或某些代理场景可能表现为类型 3(Network)后再提权。审计爆破时应重点关注 4625 中 LogonType=10 的失败事件。
Q9:RDP 会话断开与注销的区别? A:断开(Disconnect)只切断网络连接,服务端会话与进程仍在运行,可重连恢复现场;注销(Logoff)终止会话与所有进程。运维中"服务器登录数满"多因大量断开会话未回收,可用组策略设置"已断开会话的时间限制"自动清理。
Q10:Linux 上如何提供 RDP 服务?与 xrdp 的关系?
A:xrdp 实现了 RDP 服务端协议栈,后端通过 xorgxrdp 或 VNC(Xvnc)驱动会话。它支持 TLS 与部分虚拟通道(剪贴板、磁盘),但不支持完整的 Windows 图形订单集,性能与兼容性弱于原生 Windows RDP。