用户无需在设备上安装 RDP 客户端或 Cloudflare One 客户端即可连接到 RDP 服务器。基于浏览器的 RDP 利用了 Cloudflare Tunnel,该服务在您的 RDP 服务器与 Cloudflare 的全球网络之间创建了安全且仅出站的连接。设置过程包括在 RDP 服务器(或私有网络中的任何其他主机)上运行 cloudflared 守护程序,并通过公共主机名路由 RDP 流量。
用户有两种方式可以在浏览器中访问 RDP 服务器:
- App Launcher(推荐):用户可以使用其 Cloudflare Access 凭据登录到 Access App Launcher,然后在浏览器中发起与 Windows 机器的 RDP 连接。用户将使用其预先配置的 Windows 用户名和密码对 Windows 机器进行身份验证。Cloudflare 不会管理 Windows 服务器上的任何凭据。
- 直接 URL:用户也可以直接导航到 Windows 服务器,地址为
https://<app-domain>/rdp/<vnet-id>/<target-ip>/<port>,其中vnet-id是分配给 Cloudflare Tunnel 路由的虚拟网络。身份验证流程与 App Launcher 相同;首先用户必须登录到 Cloudflare Access,然后使用其 Windows 凭据对 Windows 机器进行身份验证。
基于浏览器的 RDP 可以与 Cloudflare One 客户端结合使用,以便有多种连接到服务器的方法。在配置每种连接方法时,您可以重复使用相同的 Cloudflare Tunnel。
- Cloudflare 上的活动域。
- 该域使用完全设置或部分(CNAME)设置。
- 运行受支持的 Windows 操作系统的 RDP 服务器。
- RDP 服务器的安全层允许 TLS(设置为 Negotiate 或 SSL,而不是旧版 RDP 选项)。
-
在 Cloudflare 仪表板中,转到 Networking(网络) > Tunnels(隧道)。
Go to Tunnels ↗ -
创建新隧道或编辑现有的
cloudflared隧道。
-
在 Cloudflare 仪表板中,转到 Networking(网络) > Routes(路由)。
Go to Routes ↗ -
选择 Create route(创建路由) > Tunnel CIDR(隧道 CIDR)。选择您刚刚创建的隧道,输入您服务器的 IP 或 CIDR 地址(通常是私有 IP,但也允许公共 IP),然后选择 Create route(创建路由)。
目标代表您基础设施中的单个资源(例如服务器、Kubernetes 集群、数据库或容器),用户将通过 Cloudflare 连接到该资源。
为每台需要 RDP 访问的 Windows 机器创建一个目标。 要创建新目标:
- 在 Cloudflare 仪表板 ↗中,前往 Zero Trust > Access controls(访问控制) > Targets。
- 选择 Add a target(添加目标)。
- 在 Target hostname 中,为目标输入一个便于识别的名称。我们建议使用服务器主机名,例如
production-server。目标主机名不需要唯一,可以在多个目标中重复使用。主机名用于定义 Access 应用程序保护的目标;它们不用于 DNS 地址解析。主机名格式限制
- 不区分大小写
- 不超过 253 个字符
- 仅包含字母数字字符、
-或.(不允许空格) - 以字母数字字符开头和结尾
- 在 IP addresses 中,输入目标资源的 IPv4 和/或 IPv6 地址。只有输入完整 IP 地址后,下拉菜单才会显示内容。
- 在下拉菜单中,选择资源所在的 IP 地址和虚拟网络。此 IP 地址和虚拟网络配对现已分配给此目标,出于设计考虑,不能在另一个目标中重复使用。
- 选择 Add target(添加目标)。
向 Infrastructure Access Targets 端点发出 POST 请求:
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/infrastructure/targets" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"hostname": "infra-access-target",
"ip": {
"ipv4": {
"ip_addr": "187.26.29.249",
"virtual_network_id": "c77b744e-acc8-428f-9257-6878c046ed55"
},
"ipv6": {
"ip_addr": "64c0:64e8:f0b4:8dbf:7104:72b0:ec8f:f5e0",
"virtual_network_id": "c77b744e-acc8-428f-9257-6878c046ed55"
}
}
}'-
向您的
cloudflare_api_token↗ 添加以下权限:Zero Trust Write
-
配置
cloudflare_zero_trust_infrastructure_access_target↗ 资源:resource "cloudflare_zero_trust_infrastructure_access_target" "infra-ssh-target" { account_id = var.cloudflare_account_id hostname = "infra-access-target" ip = { ipv4 = { ip_addr = "187.26.29.249" virtual_network_id = "c77b744e-acc8-428f-9257-6878c046ed55" } ipv6 = { ip_addr = "64c0:64e8:f0b4:8dbf:7104:72b0:ec8f:f5e0" virtual_network_id = "c77b744e-acc8-428f-9257-6878c046ed55" } } }
接下来,创建一个 Access 应用程序来保护该目标。
为了使您的 RDP 目标(即您的 Windows 机器)可通过浏览器访问,您需要为用户将连接到的域和子域创建一个 Cloudflare DNS 记录。该域将用于访问可通过您的 Access 应用程序向用户开放的任何目标(请参阅步骤 4)。
例如,如果希望用户连接到 rdp.example.com 上的目标,请为 rdp.example.com 创建 DNS 记录。您可以创建 A、AAAA 或 CNAME 记录:
CNAME 记录
以下 CNAME 记录将您的公共子域(rdp)指向完全限定域名。
- 类型: CNAME
- 名称:
rdp - 目标:
www.rdp.example.com - 代理状态: 已开启
CNAME 目标字段与步骤 2 中配置的 RDP 目标无关。
DNS 记录不需要指向活动的外部目标 IP 地址或主机名;DNS 记录只需有效即可。Cloudflare 的 RDP 代理将处理向正确 RDP 目标的路由。
-
在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Access controls(访问控制) > Applications(应用程序)。
-
选择 Add an application(添加应用程序)。
-
选择 Self-hosted and private(自托管和私有)。
-
选择 Add public hostname(添加公共主机名)。
-
在 Domain(域) 下拉菜单中,选择代表该应用程序的域名。域名必须属于您 Cloudflare 账户中的活跃区域。您可以使用通配符来保护共享同一根路径的应用程序的多个部分。
或者,要使用 Cloudflare for SaaS 自定义主机名,请选择 Switch to custom input(切换到自定义输入) 并输入您的自定义主机名。
-
开启 Allow access through browser-based RDP, SSH, or VNC sessions,然后从下拉菜单中选择 RDP。
-
在 Target criteria(目标条件) 中,选择定义您的 RDP 服务器的目标主机名。应用程序定义将应用于共享所选目标主机名的所有目标,包括将来添加的任何目标。
-
在 Port(端口) 中,输入服务器的 RDP 监听端口。通常为端口
3389。 -
(可选)如果您在多个端口上运行 RDP,选择 Add new target criteria(添加新目标条件),并使用不同的端口号重新配置相同的目标主机名。
在 Access policies 下,添加现有策略或创建新策略,以控制哪些用户可以连接到您的应用程序。所有 Access 应用程序默认均为拒绝状态——用户必须匹配 Allow 策略才能被授予访问权限。
-
(可选)在您的 Access 策略中,配置连接设置以限制用户本地机器与基于浏览器的 RDP 会话之间的剪贴板和文件传输操作。
配置用户的身份验证方式:
选择您希望为应用程序启用的身份提供商。
(推荐)如果您计划仅允许通过单一 IdP 进行访问,请开启 Apply instant authentication。最终用户将不会看到 Cloudflare Access 登录页面,Cloudflare 将直接将用户重定向到您的 SSO 登录事件。
- Authenticate with Cloudflare One Client 不支持基于浏览器的 RDP,应保持关闭状态。
在 Session Duration 中,选择用户的应用程序令牌的过期频率。
Cloudflare 会检查对您应用程序的每个 HTTP 请求是否包含有效的应用程序令牌。如果用户的应用程序令牌(和全局令牌)已过期,系统将提示他们重新向 IdP 进行身份验证。有关更多信息,请参阅会话管理。
-
(可选)转到 Additional settings(其他设置) 选项卡以自定义应用程序体验:
-
App Launcher 自定义:App Launcher 允许用户查看他们可以使用基于浏览器的 RDP 访问的 Windows 服务器。Cloudflare 建议保持 Show application in App Launcher 开启。如果没有 App Launcher,用户将需要知道每个目标的直接 URL。
自定义拦截页面:选择用户被拒绝访问应用程序时将看到的内容。
- 跨域资源共享(CORS)设置
- Cookie 设置
- 401 响应用于服务身份验证策略:当用户(或机器)在请求应用程序时未携带正确的服务令牌,则返回
401响应代码。
-
-
选择 Create(创建)。
默认情况下,Cloudflare 会在评估所有 Gateway 网络策略之后再评估 Access 应用程序策略。要在特定 Gateway 策略之前或之后评估 Access 应用程序,请执行以下步骤:
在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Traffic policies(流量策略) > Firewall policies(防火墙策略)。在 Network(网络) 中,使用以下配置创建网络策略:
选择器 运算符 值 操作 Access Infrastructure Target is Present Allow(允许) - 确保已关闭 Enforce Cloudflare One Client session duration,否则用户将被阻止访问 RDP 目标。
使用仪表板或 API 更新策略的优先顺序。
该 Gateway 策略将应用于所有 Access for Infrastructure 目标,包括 RDP 和 SSH。
若要通过 RDP 连接到 Windows 机器:
-
打开浏览器并转到您的 App Launcher URL:
https://<your-team-name>.cloudflareaccess.com将
<your-team-name>替换为您的 Zero Trust 团队名称。 -
按照提示登录您的身份提供程序。
通过身份验证后,App Launcher 将显示磁贴,显示授权您使用的应用程序。通过基于浏览器的 RDP 可用的 Windows 服务器(目标)也将显示为磁贴。如果可以通过多个 Access 应用程序访问某个目标,则该目标在每个 Access 应用程序中都有一个磁贴。
-
选择您要连接的目标。
App Launcher 磁贴将启动格式为
https://<app-domain>/rdp/<vnet-id>/<target-ip>/<port>的 URL。您也可以直接导航到此 URL。 -
选择您要连接的端口。仅当 Access 应用程序允许在多个端口上使用 RDP 流量时,才会显示端口选择屏幕(例如端口
3389和端口65321)。 -
(可选)在浏览器设置中,允许 Access 应用程序访问剪贴板。剪贴板访问受管理员配置的策略限制的约束。
-
输入您的 Windows 用户名和密码。有关如何格式化用户名的更多信息,请参阅用户标识符格式。
您现在已可以访问远程 Windows 桌面。
连接设置限制了用户本地机器与基于浏览器的 RDP 会话之间的数据传输。您可以控制文本(复制和粘贴)和文件传输。文本控制管理剪贴板内容。文件控制 Beta 管理文件上传和下载。这些控制是按策略配置的,因此您可以为不同的用户组授予不同的权限。
对于新策略,默认情况下拒绝文本控制和文件控制。您必须显式允许每个操作。现有应用程序保留完整的文本剪贴板访问权限以实现向后兼容性。除非显式启用,否则文件控制将被拒绝。
文本控制和文件控制使用相同的方向选项:
| 设置 | 描述 |
|---|---|
| 允许从客户端到远程 RDP 会话 | 用户可以将数据从其本地客户端传输到基于浏览器的 RDP 会话中。 |
| 允许从远程 RDP 会话到客户端 | 用户可以将数据从基于浏览器的 RDP 会话传输到其本地客户端。 |
| 允许双向 | 用户可以双向传输数据。 |
| 禁用复制/粘贴 | 不允许用户在基于浏览器的 RDP 会话与其本地客户端之间传输数据。 |
例如,您可以允许文本在双向进行复制和粘贴,同时将文件传输限制为仅允许上传。
当用户尝试进行受限的剪贴板操作时,剪贴板内容将被替换为通知其操作不被允许的信息。当文件传输受限时,上传方法将被禁用,并且下载按钮不会出现在控制面板中。
- 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Access controls(访问控制) > Applications(应用程序)。
- 找到您的基于浏览器的 RDP 应用程序并选择 Configure(配置)。
- 选择 **Policies(策略)**选项卡。
- 创建一个新策略或选择一个现有的策略进行编辑。
- 展开 Connection context(连接上下文)。
- 在 Connection settings(连接设置) 下,配置以下设置:
- Text controls(文本控制) — 选择文本复制和粘贴的方向设置。
- File controls(文件控制) — 选择文件上传和下载的方向设置。
- 选择 Save policy(保存策略)。
当为 RDP 应用程序创建或更新 Access 策略时,配置每个方向上允许的格式。使用 text 代表文本剪贴板,使用 file 代表文件传输。例如,以下策略允许双向文本剪贴板,但仅允许文件上传(本地到远程)。
Required API token permissions
At least one of the following token permissions is required:Access: Apps and Policies Write
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "Allow engineers with clipboard and upload",
"decision": "allow",
"include": [
{
"email_domain": {
"domain": "example.com"
}
}
],
"connection_rules": {
"rdp": {
"allowed_clipboard_local_to_remote_formats": [
"text",
"file"
],
"allowed_clipboard_remote_to_local_formats": [
"text"
]
}
}
}'使用 cloudflare_zero_trust_access_policy ↗ 资源中的 connection_rules 属性,配置每个方向上允许的格式。使用 text 代表文本剪贴板,使用 file 代表文件传输。例如,以下策略允许双向文本剪贴板,但仅允许文件上传(本地到远程)。
resource "cloudflare_zero_trust_access_policy" "rdp-policy" {
account_id = var.cloudflare_account_id
name = "Allow engineers with clipboard and upload"
decision = "allow"
include = [
{
email_domain = {
domain = "example.com"
}
}
]
connection_rules = {
rdp = {
allowed_clipboard_local_to_remote_formats = ["text", "file"]
allowed_clipboard_remote_to_local_formats = ["text"]
}
}
}要管理传输,请选择 RDP 会话左侧的设置齿轮图标。您可以沿左边缘拖动此图标以重新定位它。
文件传输具有以下限制:
- 最大文件大小: 每个文件 2 GB(上传和下载)
- 每次上传最大文件数: 1,000 个文件
要将文件从您的本地机器传输到远程 Windows 会话,请将文件拖动到浏览器窗口上或使用控制面板。拖放支持单个文件和文件夹(包括子文件夹,最多共 1,000 个条目)。控制面板文件选择器仅选择单个文件。文件将存放在远程桌面的活动元素上。例如,如果您在文件资源管理器中打开了一个文件夹,文件将存放在该文件夹中。
要将文件从远程 Windows 会话传输到您的本地机器:
- 在远程 Windows 会话中,复制您想要下载的文件。右键单击该文件并选择 Copy(复制),或者选择该文件并按 Ctrl+C。
- 控制面板图标会轻微跳动以指示有文件可用。打开控制面板以查看文件。
- 选择以下选项之一:
- Download(下载):将文件下载到您的本地机器。
- Download zip(下载 zip):一次性将多个文件作为压缩文件夹下载到您的本地机器。
- Print(打印):将 PDF 文件打印到您网络上的本地打印机。
您可以将剪贴板面板中的 PDF 文件打印到本地打印机。要打印单个文件,请选择 PDF 旁边的打印图标。要一次打印多个文件,请在远程机器上将这些文件一起复制到剪贴板中,然后选择剪贴板面板中的 Print all PDFs(打印所有 PDF)。这些文件将合并为一个 PDF 并作为单个打印作业发送到您的浏览器。
- RDP 会话结束时,传输历史将被丢弃。
- 远程 Windows 服务器必须支持通过 RDP 剪贴板虚拟通道进行文件传输。Windows Server 2012 及更高版本默认支持此功能。
- 如果远程服务器不支持文件传输,文本剪贴板仍可正常工作。
基于浏览器的 RDP 支持连接到运行以下操作系统的 Windows 机器:
- Windows 11 Pro
- Windows 11 Enterprise
- Windows 10 Pro
- Windows 10 Enterprise
- Windows Server 2025
- Windows Server 2022
- Windows Server 2019
- Windows Server 2016
| 浏览器 | 兼容性 |
|---|---|
| Google Chrome | ✅ |
| Mozilla Firefox | ✅ |
| Safari | ✅ |
| Microsoft Edge (Chromium-based) | ✅ |
| 其他基于 Chromium 的浏览器 (Opera, Brave) | ✅ |
| Internet Explorer 11 及更低版本 | ❌ |
运行 Powershell 7 或更高版本,以减轻先前 Microsoft 按键未被记录的问题。
基于浏览器的 RDP 支持使用以下登录凭据连接到 Windows 机器:
支持带空格和不带空格的 SAM 格式的用户标识符。
示例:
DOMAIN\usernameDOMAIN\username with spaces.\username.\username with spacesusernameusername with spaces
字符限制
指定域的标识符(例如 DOMAIN\username)中,域最多可包含 20 个字符,用户名最多可包含 15 个字符。
不带域的标识符(例如 .\username)将使用默认域。用户名最多可包含 20 个字符。
支持带空格、带引号和不带引号的 UPN 格式的用户标识符。
示例:
"username with spaces"@domain.orgusername with [email protected][email protected]
绑定到 Microsoft Entra ID 域的用户标识符必须将其用户名输入为 AzureAD\[email protected] 或 AzureAD\user。AzureAD\ 前缀不区分大小写。
使用绑定到 Microsoft Entra ID 的用户名时,登录流程略有不同:
- 以前述格式之一输入您的用户名。
- 输入用户名后,密码框将消失,RDP 连接将发起。
- 随后,RDP 服务器会在授予对 RDP 服务器的访问权限之前提示输入密码。
使用 Access 自托管应用程序时,大多数 Cloudflare 产品与您的应用程序兼容。
但以下产品不受支持:
您可以使用配置规则(范围限定为应用程序域)为特定应用程序禁用 Zaraz,而不必在整个区域范围内禁用。
Google tag gateway 在区域级别配置,无法限定到特定主机名。要在主机名上使用 Access 绑定(binding) Cookie,请为整个区域禁用 Google tag gateway。
- TLS 证书验证:Cloudflare 使用 TLS 连接到 RDP 目标,但不验证源站的 TLS 证书。
- 设备身份验证身份:由于基于浏览器的 RDP 流量不经过 Cloudflare One 客户端,因此用户无法使用其 Cloudflare One 客户端会话身份进行身份验证。
- 基于 RDP 的音频:用户无法使用其麦克风和扬声器与远程机器进行交互。
- 剪贴板大小限制:在本地机器与基于浏览器的 RDP 会话之间复制的数据不得超过 500 KB。
- 剪贴板数据类型:文本剪贴板控制仅支持文本数据。不支持图像剪贴板传输。
- 文件传输可用性:文件传输功能处于 Beta 阶段。有关支持的功能和限制,请参阅传输文件。
- 打印到本地打印机:从基于浏览器的 RDP 会话中进行本地打印仅支持通过文件传输控制面板打印 PDF 文件。
- 加入 Entra 的账户的网络级别身份验证:基于浏览器的 RDP 不支持 PKU2U 身份验证,而这是使用加入 Entra 账户进行网络级别身份验证(NLA) ↗所必需的。连接到加入 Entra 的账户需要禁用远程 Windows 机器上 NLA 的强制执行。您可以通过 Settings(设置) > System(系统) > Remote Desktop(远程桌面) 禁用 NLA,或使用本地组策略编辑器禁用 Require user authentication for remote connections by using Network Level Authentication(要求使用网络级别身份验证对远程连接的用户进行身份验证)。禁用 NLA 时,仅关闭 NLA 本身——不要将安全层切换到旧版 RDP 选项,因为基于浏览器的 RDP 仍需要 TLS(请参阅 RDP 安全层必须允许 TLS 的限制)。
- RDP 安全层必须允许 TLS:基于浏览器的 RDP 通过 TLS 连接到远程机器,因此该机器的 RDP 安全层必须至少设置为 Negotiate 或 SSL。如果服务器设置为使用旧版 RDP 安全层,连接将失败。您可以在本地组策略编辑器中通过将 Require use of specific security layer for remote (RDP) connections(远程(RDP)连接要求使用特定的安全层) 设置为 Negotiate 或 SSL 来进行配置。
- 剪贴板浏览器兼容性:默认情况下,本地和远程机器之间的自动剪贴板共享仅在基于 Chromium 的浏览器中可用(Google Chrome、Microsoft Edge、Opera、Brave)。要在 Firefox 中启用此功能:
- 在浏览器地址栏中输入
about:config并按 Enter(回车)。 - 如果显示警告提示,请接受。
- 搜索
dom.events.testing.asyncClipboard并将其设置为true。 - 搜索
dom.events.asyncClipboard.clipboardItem并将其设置为true。 - 搜索
dom.events.asyncClipboard.readText并将其设置为true。
- 在浏览器地址栏中输入