SaaS平台如何在香港服务器的Windows Server中启用RDS会话虚拟化,降低跨境远程桌面的带宽消耗?

那天凌晨,香港PCCW机房的客户运营群里不断刷屏:“远程桌面一卡一顿”“Excel 滚动都花屏”。我手里攥着一杯便利店的美式,盯着 Grafana 上来自内地用户的链路:广州—>香港延迟 42~68ms,抖动 10~30ms,丢包 0.5~2%。这对 RDP 来说不算灾难,但用户侧 2~5Mbps 的公网出口让“高清桌面”变成奢望。
我决定两件事同时做:
- 把 RDS 会话虚拟化跑起来,让应用在香港“就近渲染”;
- 用一套可回滚的编码/视觉/传输策略,在不牺牲太多可读性的前提下把带宽压到 1Mbps 附近。
一、现场环境与目标
目标
- 让内地用户通过 RD Gateway 穿到香港,使用发布的 SaaS 客户端(和必要的办公组件)。
- 高峰 200+ 并发会话下,人均带宽 ≤ 1Mbps(常态办公场景),页面滚动流畅,文字不糊。
硬件与网络(真实上架参数)
- 机房:香港(PCCW/HKT 双线 BGP,向内地有 CN2/GIA 回程)
- 物理宿主:Supermicro 1U(单路 AMD EPYC 7313P 16C/32T,256GB RAM)
- 存储:2 × 3.84TB NVMe(RAID1,存放 RDSH 镜像和用户 Roaming Profile 缓存)
- 网络:2 × 10GbE(bond 做冗余),对外 200Mbps 保障带宽
- 延迟:华南用户 42~68ms,华东 70~95ms
- OS:Windows Server 2022 Datacenter(中文化 + 最新累积补丁)
- 证书:Let’s Encrypt(win-acme 自动续期)
- 目录:单域 AD,香港为资源域控
- 许可:RDS CAL 2022 Per User(KMS/AVMA 无关,正规授权)
RDS 角色拓扑(3 台虚拟机)
- CB01:Connection Broker(4C/8G)
- SH01 / SH02:Session Host ×2(各 8C/24G,后期可水平扩展)
- GW01:RD Gateway + RD Web + RD Licensing(4C/8G;对外 443/3391)
- 内部端口:3389(RDP),443(RDWeb/RDG TCP),3391(RDG UDP),5985/5986(WinRM)
二、一步到位的部署脚本(我当时真这么敲的)
提示:如果你第一次做,建议“先脚本后向导”。脚本可复现、可回滚。
1) 角色安装(在各自节点)
# 在 CB01
Install-WindowsFeature RDS-Connection-Broker -IncludeManagementTools
# 在 SH01 / SH02
Install-WindowsFeature RDS-RD-Server -IncludeManagementTools
# 在 GW01
Install-WindowsFeature RDS-Gateway,RDS-Web-Access,RDS-Licensing -IncludeManagementTools
2) 建立基础部署(在 CB01 运行)
Import-Module RemoteDesktop
# 初始化部署(Broker + Session Host + Web Access)
New-RDSessionDeployment `
-ConnectionBroker "CB01.domain.hk" `
-SessionHost "SH01.domain.hk" `
-WebAccessServer "GW01.domain.hk"
# 把第二台会话主机加入
Add-RDServer -Role RDS-RD-SERVER -Server "SH02.domain.hk" -ConnectionBroker "CB01.domain.hk"
# 建集合并发布我们 SaaS 的 RemoteApp(示例用 notepad 占位)
New-RDSessionCollection `
-CollectionName "SaaS-Session" `
-SessionHost "SH01.domain.hk","SH02.domain.hk" `
-ConnectionBroker "CB01.domain.hk" `
-CollectionDescription "SaaS 多租户会话集群"
# 示例发布 RemoteApp
New-RDRemoteApp `
-CollectionName "SaaS-Session" `
-Alias "SaaSClient" -DisplayName "SaaS 客户端" `
-FilePath "C:\Program Files\SaaSClient\SaaS.exe" `
-ConnectionBroker "CB01.domain.hk"
3) 配置许可(很关键,否则 120 天后掉坑)
# 在 GW01 安装 Licensing 后
Set-RDLicenseConfiguration `
-ConnectionBroker "CB01.domain.hk" `
-LicenseServer "GW01.domain.hk" `
-Mode PerUser
4) 配置 Gateway(统一外网入口)
# 证书建议用 Let’s Encrypt + win-acme (wacs.exe) 生成,安装到本机“个人”存储并设置自动续期
# 然后在 RD 部署属性里统一替换证书(RD Broker、RD Web、RD Gateway)
# Gateway 外网 FQDN
$gwFqdn = "rdg.saas.example.hk"
Set-RDDeploymentGatewayConfiguration `
-GatewayMode Custom `
-GatewayExternalFqdn $gwFqdn `
-LogonMethod Password `
-BypassLocal $true `
-UseCachedCredentials $true `
-ConnectionBroker "CB01.domain.hk"
CAP/RAP(授权/资源策略)我用 NPS 控制,仅允许“RDS-Users”AD 组通过,资源指向“RDG组内所有计算机”。
三、带宽优化:我最终落地的“稳妥组合拳”
跨境链路的本质问题是:带宽紧 + 抖动丢包。RDP 自 8.x 起已经很聪明,但想把人均压到 1Mbps 还得下刀子。以下策略均在 Windows Server 2019/2022 + 新版 MSTSC 客户端下验证。
1) 图形编码:优先 AVC/H.264 4:2:0,禁用 4:4:4
“4:4:4”画质更锐利,但在文档/表格滚动时显著增带宽。
我在 RDS 会话主机 GPO里如下设置:
组策略路径与建议值
| 路径 | 策略 | 值 | 说明 |
|---|---|---|---|
| 计算机配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程桌面会话主机 → 远程会话环境 | 优先使用 H.264/AVC 444 图形模式 | 已禁用 | 让 RDP 退回 4:2:0,明显降带宽 |
| 同上 | 自动检测连接质量 | 已启用 | 让客户端/服务器协商更保守 |
| 同上 | 限制最大颜色深度 | 16 位 | 文字依旧清晰,带宽立降 |
| 同上 | 不允许桌面背景、不允许字体平滑 | 已启用 | 小幅节流,配合 16bpp 更稳 |
说明:有 GPU 的主机可以开启“为所有 RDS 会话使用硬件图形适配器”,但务必仍禁用 4:4:4,否则图形更丝滑、带宽却起飞。
2) UDP 传输:能用就用,测到抖动/丢包大就果断停
RD Gateway 支持 UDP/3391,在良好跨境路由下,它能降低输入延迟。
但某些运营商路径对 UDP 不友好(NAT/丢包),我按区域开关:
- 华南/电信 CN2:保留 UDP;
- 华北/某些移动/铁通:禁用 UDP(只走 443/TCP),抖动更可控。
测试口令(客户端)
# TCP
Test-NetConnection rdg.saas.example.hk -Port 443
# UDP(Windows 的 UDP 探测有限,但可参考)
Test-NetConnection rdg.saas.example.hk -UdpPort 3391 -InformationLevel Detailed
客户端禁用 UDP(策略)
用户配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程桌面连接客户端 → 关闭 UDP:已启用
3) 重定向与多媒体:把不必要的都关掉
我在会话集合级别下推一组自定义 RDP 属性(Broker 上统一下发):
Set-RDSessionCollectionConfiguration `
-CollectionName "SaaS-Session" `
-ConnectionBroker "CB01.domain.hk" `
-CustomRdpProperty @"
redirectclipboard:i:1
redirectprinters:i:0
redirectcomports:i:0
redirectsmartcards:i:1
redirectdrives:i:0
audiocapturemode:i:0
audiomode:i:2
videoplaybackmode:i:1
compression:i:1
bandwidthautodetect:i:1
networkautodetect:i:1
disable full window drag:i:1
disable menu anims:i:1
bitmapcachepersistenable:i:1
session bpp:i:16
"@
解释:
- 禁重定向:打印机/盘符最耗带宽,统一关闭。
- 音频:audiomode:i:2(不播放),audiocapturemode:i:0(不采集)。
- 视频播放模式:videoplaybackmode:i:1(服务器端解码,压带宽)。
- 缓存:bitmapcachepersistenable:i:1(位图持久缓存,多开/频繁窗口切换很有用)。
- 16bpp + 关闭窗口拖动/菜单动画:视觉差别不大,节省可观。
4) 会话与资源治理
- 会话超时与回收(防“挂着不动还占带宽”)
- 活动但空闲:30 分钟强制断开
- 断线会话:8 小时清理
- Dynamic Fair Share(Server 2012 R2+):默认已启用,避免“带宽土豪”
- Profile:用户漫游配置文件走 NVMe 本地缓存 + 后台异步写回,降低登录尖刺
四、真实数据:三轮 A/B 的对比
场景:Excel/浏览器/内部 SaaS 客户端为主;无高清视频、无 3D;用户端带宽 2~10Mbps 不等。
表 1:图形编码与颜色深度
| 方案 | 颜色深度 | AVC 模式 | 人均带宽(p50/p95) | 主观体验 |
|---|---|---|---|---|
| A(默认) | 32bpp | 允许 4:4:4 | 1.8 / 3.2 Mbps | 文字锐利,但滚动时带宽峰值高 |
| B(推荐) | 16bpp | 禁用 4:4:4(退 4:2:0) | 0.85 / 1.6 Mbps | 文字清晰度略降,但滚动顺滑、峰值温和 |
| C(更省) | 16bpp | 4:2:0 + 禁桌面特效 | 0.65 / 1.2 Mbps | 进一步省带宽,UI 动效变少 |
表 2:UDP 取舍
| 路由区域 | UDP 状态 | 人均带宽(p95) | 输入延迟(主观) | 备注 |
|---|---|---|---|---|
| 华南(电信 CN2) | 开启 UDP | 1.4 Mbps | 更顺手 | 丢包低,UDP 有益 |
| 华北(移动/铁通) | 关闭 UDP(TCP only) | 1.2 Mbps | 稳定,不突刺 | 避免 NAT/丢包导致的卡断 |
表 3:重定向与音频
| 设置 | 成果 |
|---|---|
| 关闭打印机/盘符重定向 | 高峰期 p95 带宽下降 ~12% |
| 音频不播放/不采集 | 再降 ~6% |
| 位图持久缓存 | 窗口切换/重复界面带宽峰值降低,操作更稳 |
五、客户端分发与体验设置
我最终给用户两种入口:
- RDWeb 门户:https://rdg.saas.example.hk/rdweb(绑定同一张公有证书)
- 签过名的 .rdp 快捷文件(内含自定义属性,上面那段 CustomRdpProperty 基本就这堆)
在 MSTSC 客户端(高级 → 体验)里,我让默认选项是:
- 勾选 “检测连接质量自动调整”
- 开启 “持久位图缓存”
- 其他视觉特效按 GPO 统一控制,避免用户自作聪明改坏。
六、运维侧的隐性工作(别忽略)
- 证书与 SNI:RD Web / RD Gateway / Broker 都替换为同一 FQDN 证书链,省掉 90% 的用户证书报错工单。
- DNS 与健康检查:rdg.saas.example.hk 做 HTTP/443 与 UDP/3391 双向健康检测,发现单点异常时切退 TCP。
- 时间同步:网关与域控统一 NTP,避免 Kerberos/NLA 偶发失败。
- 登录画像:把 Microsoft-Windows-TerminalServices-LocalSessionManager/Operational 与 RemoteFX Network 计数器打到 Loki/Prom,方便复盘。
七、我踩过的坑 & 解决过程
UDP 看似通,实际抖动大
症状:用户“鼠标能动,但屏幕卡住一两秒”;
处理:在客户端侧 策略禁用 UDP(只走 443/TCP),立即稳定;同时在边界做区域化策略,华南保留、华北关闭。
RDS 许可未配置完全
症状:120 天宽限期后,用户随机被踢;
处理:确认 RDS Per User、CAL 导入与分配,Set-RDLicenseConfiguration 后重启相关服务。
证书不匹配
症状:连接时报“证书错误”,用户恐惧;
处理:统一证书,网关管理器内HTTPS 绑定与 SSL 证书指向同一张,RD 部署属性里三处证书同时替换。
GPO 不生效(最阴险)
症状:用户桌面还是有背景/动画,带宽降不下来;
处理:在会话主机 OU 上启用用户策略环回(合并/替换),并强制刷新;这一步是很多人忽略的关键。
重定向放开过头
症状:有人把几百 MB 的图拖来拖去,瞬时带宽拉满;
处理:统一关闭盘符重定向,只保留剪贴板文本;对少数需要文件传输的人开单独安全通道(SFTP/内网中转)。
八、完整的可复用清单(我现在上线必做)
系统/角色
- CB01/SH01/SH02/GW01 角色安装、补丁一致
- New-RDSessionDeployment 成功、集合建立、RemoteApp 发布
- RD Licensing 设置 Per User,CAL 到位
- RD Gateway FQDN + 证书 + CAP/RAP 策略生效
图形与视觉
- 禁用 AVC 4:4:4;启用连接质量自动检测
- 颜色深度 16bpp;禁桌面背景/字体平滑/动画
- 位图持久缓存开启
传输策略
- 区域化 UDP 策略(华南开、华北关)
- 443/TCP 健康检测常开,发现 UDP 异常自动降级
重定向/多媒体
- 关闭打印机/盘符重定向
- 音频不播放、不采集;视频服务器端解码
会话治理
- 空闲 30 分钟断开;断线 8 小时清理
- Loopback 处理启用;GPO RSOP 验证通过
可观测
- 采集 RemoteFX Network、RDP-UDP、登录事件
- p50/p95 带宽、输入延迟、丢包趋势面板
九、附:我常用的监控计数器(PerfMon)
RemoteFX Network:
- Average Encoding Time, Frames Skipped/Second, Total Bytes Sent
TCPv4:
- Segments Retransmitted/sec, Connections Established
RDP-UDP:
- Datagrams Sent/sec, Datagrams Retransmitted/sec
Process(mstsc / rdpshell):
- Handle Count, Private Bytes
抓这些就够你定位 80% 的体验问题。
十、凌晨 4:35,噪声与静默
我从机房走出来时,天还没亮。手机上最后一条报警收敛成绿,运营群也安静了。带宽曲线像被按住的弹簧,人均 p95 从 3.2Mbps 掉到 1.2Mbps,最终稳定在 0.8~1.6Mbps。
后来新同事问我:“这套 RDS 方案的关键是什么?”
我说:不是某一个魔法开关。是策略组合、是按地区的差异化传输、是敢于牺牲一点点‘好看’,保住‘好用’。
如果你也在凌晨的机房里和带宽博弈,愿这份笔记能让你少走几步弯路。
附录:一键回滚 / 调整的两段脚本
A. 改回“更清晰但更耗带宽”的配置(谨慎)
# 打开 AVC 4:4:4 & 32bpp(只在带宽很充足的专线环境使用)
Set-RDSessionCollectionConfiguration `
-CollectionName "SaaS-Session" `
-ConnectionBroker "CB01.domain.hk" `
-CustomRdpProperty @"
session bpp:i:32
"@
# 组策略里把“优先使用 H.264/AVC 444 图形模式”设置为“已启用”
B. 在问题区域彻底关掉 UDP(只走 443/TCP)
# 客户端侧(通过 GPO 下发)
# 用户配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程桌面连接客户端
# “关闭 UDP”:已启用