跳转到内容
搜索文档

在浏览器中连接到 RDP

最后更新 查看 MarkdownAgent 设置

用户无需在设备上安装 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。

前提条件

1. 将服务器连接到 Cloudflare

  1. 在 Cloudflare 仪表板中,转到 Networking(网络) > Tunnels(隧道)

    Go to Tunnels ↗
  2. 创建新隧道或编辑现有的 cloudflared 隧道。

  1. 在 Cloudflare 仪表板中,转到 Networking(网络) > Routes(路由)

    Go to Routes ↗
  2. 选择 Create route(创建路由) > Tunnel CIDR(隧道 CIDR)。选择您刚刚创建的隧道,输入您服务器的 IP 或 CIDR 地址(通常是私有 IP,但也允许公共 IP),然后选择 Create route(创建路由)

2. 添加目标

目标代表您基础设施中的单个资源(例如服务器、Kubernetes 集群、数据库或容器),用户将通过 Cloudflare 连接到该资源。

为每台需要 RDP 访问的 Windows 机器创建一个目标。 要创建新目标:

  1. Cloudflare 仪表板中,前往 Zero Trust > Access controls(访问控制) > Targets
  2. 选择 Add a target(添加目标)
  3. Target hostname 中,为目标输入一个便于识别的名称。我们建议使用服务器主机名,例如 production-server。目标主机名不需要唯一,可以在多个目标中重复使用。主机名用于定义 Access 应用程序保护的目标;它们不用于 DNS 地址解析。

    主机名格式限制

    • 不区分大小写
    • 不超过 253 个字符
    • 仅包含字母数字字符、-.(不允许空格)
    • 以字母数字字符开头和结尾
  4. IP addresses 中,输入目标资源的 IPv4 和/或 IPv6 地址。只有输入完整 IP 地址后,下拉菜单才会显示内容。
  1. 在下拉菜单中,选择资源所在的 IP 地址和虚拟网络。此 IP 地址和虚拟网络配对现已分配给此目标,出于设计考虑,不能在另一个目标中重复使用。
  2. 选择 Add target(添加目标)

Infrastructure Access Targets 端点发出 POST 请求:

Create new targetbash
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"
				}
		}
	}'
  1. 向您的 cloudflare_api_token 添加以下权限:

    • Zero Trust Write
  2. 配置 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 应用程序来保护该目标。

3. 创建 DNS 记录

为了使您的 RDP 目标(即您的 Windows 机器)可通过浏览器访问,您需要为用户将连接到的域和子域创建一个 Cloudflare DNS 记录。该域将用于访问可通过您的 Access 应用程序向用户开放的任何目标(请参阅步骤 4)。

例如,如果希望用户连接到 rdp.example.com 上的目标,请为 rdp.example.com 创建 DNS 记录。您可以创建 AAAAACNAME 记录:

A 记录

以下 DNS 记录将您的公共子域(rdp)指向 Class E 地址空间中的 IPv4 地址。

  • 类型: A
  • 名称: rdp
  • IPv4 地址: 240.0.0.0
  • 代理状态: 已开启

AAAA 记录

以下 DNS 记录将您的公共子域(rdp)指向 IPv6 丢弃地址范围

  • 类型: AAAA
  • 名称: rdp
  • IPv6 地址: 100::
  • 代理状态: 已开启

CNAME 记录

以下 CNAME 记录将您的公共子域(rdp)指向完全限定域名。

  • 类型: CNAME
  • 名称: rdp
  • 目标: www.rdp.example.com
  • 代理状态: 已开启

CNAME 目标字段与步骤 2 中配置的 RDP 目标无关。

DNS 记录不需要指向活动的外部目标 IP 地址或主机名;DNS 记录只需有效即可。Cloudflare 的 RDP 代理将处理向正确 RDP 目标的路由。

4. 创建 Access 应用程序

  1. Cloudflare 仪表板中,转到 Zero Trust > Access controls(访问控制) > Applications(应用程序)

  2. 选择 Add an application(添加应用程序)

  3. 选择 Self-hosted and private(自托管和私有)

  4. 选择 Add public hostname(添加公共主机名)

  5. Domain(域) 下拉菜单中,选择代表该应用程序的域名。域名必须属于您 Cloudflare 账户中的活跃区域。您可以使用通配符来保护共享同一根路径的应用程序的多个部分。

    或者,要使用 Cloudflare for SaaS 自定义主机名,请选择 Switch to custom input(切换到自定义输入) 并输入您的自定义主机名。

  6. 开启 Allow access through browser-based RDP, SSH, or VNC sessions,然后从下拉菜单中选择 RDP

  7. Target criteria(目标条件) 中,选择定义您的 RDP 服务器的目标主机名。应用程序定义将应用于共享所选目标主机名的所有目标,包括将来添加的任何目标。

  8. Port(端口) 中,输入服务器的 RDP 监听端口。通常为端口 3389

  9. (可选)如果您在多个端口上运行 RDP,选择 Add new target criteria(添加新目标条件),并使用不同的端口号重新配置相同的目标主机名。

  10. Access policies 下,添加现有策略或创建新策略,以控制哪些用户可以连接到您的应用程序。所有 Access 应用程序默认均为拒绝状态——用户必须匹配 Allow 策略才能被授予访问权限。

  11. (可选)在您的 Access 策略中,配置连接设置以限制用户本地机器与基于浏览器的 RDP 会话之间的剪贴板和文件传输操作。

  12. 配置用户的身份验证方式:

    1. 选择您希望为应用程序启用的身份提供商

    2. (推荐)如果您计划仅允许通过单一 IdP 进行访问,请开启 Apply instant authentication。最终用户将不会看到 Cloudflare Access 登录页面,Cloudflare 将直接将用户重定向到您的 SSO 登录事件。

    3. Authenticate with Cloudflare One Client 不支持基于浏览器的 RDP,应保持关闭状态。
  13. Session Duration 中,选择用户的应用程序令牌的过期频率。

    Cloudflare 会检查对您应用程序的每个 HTTP 请求是否包含有效的应用程序令牌。如果用户的应用程序令牌(和全局令牌)已过期,系统将提示他们重新向 IdP 进行身份验证。有关更多信息,请参阅会话管理

  14. (可选)转到 Additional settings(其他设置) 选项卡以自定义应用程序体验:

    • App Launcher 自定义App Launcher 允许用户查看他们可以使用基于浏览器的 RDP 访问的 Windows 服务器。Cloudflare 建议保持 Show application in App Launcher 开启。如果没有 App Launcher,用户将需要知道每个目标的直接 URL。

    • 自定义拦截页面:选择用户被拒绝访问应用程序时将看到的内容。

      • Cloudflare default(Cloudflare 默认):重新加载登录页面,并在 Cloudflare Access 徽标下方显示拦截消息。默认消息为 That account does not have access,您也可以输入自定义消息。
      • Redirect URL(重定向 URL):重定向到指定网站。
      • Custom page template(自定义页面模板):显示托管在 Cloudflare One 中的自定义拦截页面
  15. 选择 Create(创建)

5.(推荐)在 Gateway 中修改优先顺序

默认情况下,Cloudflare 会在评估所有 Gateway 网络策略之后再评估 Access 应用程序策略。要在特定 Gateway 策略之前或之后评估 Access 应用程序,请执行以下步骤:

  1. Cloudflare 仪表板中,转到 Zero Trust > Traffic policies(流量策略) > Firewall policies(防火墙策略)。在 Network(网络) 中,使用以下配置创建网络策略

    选择器 运算符 操作
    Access Infrastructure Target is Present Allow(允许)
  2. 确保已关闭 Enforce Cloudflare One Client session duration,否则用户将被阻止访问 RDP 目标。
  3. 使用仪表板或 API 更新策略的优先顺序

该 Gateway 策略将应用于所有 Access for Infrastructure 目标,包括 RDP 和 SSH。

6. 以用户身份连接

若要通过 RDP 连接到 Windows 机器:

  1. 打开浏览器并转到您的 App Launcher URL:

    https://<your-team-name>.cloudflareaccess.com

    <your-team-name> 替换为您的 Zero Trust 团队名称

  2. 按照提示登录您的身份提供程序。

    通过身份验证后,App Launcher 将显示磁贴,显示授权您使用的应用程序。通过基于浏览器的 RDP 可用的 Windows 服务器(目标)也将显示为磁贴。如果可以通过多个 Access 应用程序访问某个目标,则该目标在每个 Access 应用程序中都有一个磁贴。

  3. 选择您要连接的目标。

    App Launcher 磁贴将启动格式为 https://<app-domain>/rdp/<vnet-id>/<target-ip>/<port> 的 URL。您也可以直接导航到此 URL。

  4. 选择您要连接的端口。仅当 Access 应用程序允许在多个端口上使用 RDP 流量时,才会显示端口选择屏幕(例如端口 3389 和端口 65321)。

  5. (可选)在浏览器设置中,允许 Access 应用程序访问剪贴板。剪贴板访问受管理员配置的策略限制的约束。

  6. 输入您的 Windows 用户名和密码。有关如何格式化用户名的更多信息,请参阅用户标识符格式

您现在已可以访问远程 Windows 桌面。

连接设置

连接设置限制了用户本地机器与基于浏览器的 RDP 会话之间的数据传输。您可以控制文本(复制和粘贴)和文件传输。文本控制管理剪贴板内容。文件控制 Beta 管理文件上传和下载。这些控制是按策略配置的,因此您可以为不同的用户组授予不同的权限。

默认行为

对于新策略,默认情况下拒绝文本控制和文件控制。您必须显式允许每个操作。现有应用程序保留完整的文本剪贴板访问权限以实现向后兼容性。除非显式启用,否则文件控制将被拒绝。

可用设置

文本控制和文件控制使用相同的方向选项:

设置 描述
允许从客户端到远程 RDP 会话 用户可以将数据从其本地客户端传输到基于浏览器的 RDP 会话中。
允许从远程 RDP 会话到客户端 用户可以将数据从基于浏览器的 RDP 会话传输到其本地客户端。
允许双向 用户可以双向传输数据。
禁用复制/粘贴 不允许用户在基于浏览器的 RDP 会话与其本地客户端之间传输数据。

例如,您可以允许文本在双向进行复制和粘贴,同时将文件传输限制为仅允许上传。

当用户尝试进行受限的剪贴板操作时,剪贴板内容将被替换为通知其操作不被允许的信息。当文件传输受限时,上传方法将被禁用,并且下载按钮不会出现在控制面板中。

配置连接设置

  1. Cloudflare 仪表板中,转到 Zero Trust > Access controls(访问控制) > Applications(应用程序)
  2. 找到您的基于浏览器的 RDP 应用程序并选择 Configure(配置)
  3. 选择 **Policies(策略)**选项卡。
  4. 创建一个新策略或选择一个现有的策略进行编辑。
  5. 展开 Connection context(连接上下文)
  6. Connection settings(连接设置) 下,配置以下设置:
    • Text controls(文本控制) — 选择文本复制和粘贴的方向设置。
    • File controls(文件控制) — 选择文件上传和下载的方向设置。
  7. 选择 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
Create an Access reusable policybash
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"]
		}
	}
}

传输文件 Beta

要管理传输,请选择 RDP 会话左侧的设置齿轮图标。您可以沿左边缘拖动此图标以重新定位它。

文件传输具有以下限制:

  • 最大文件大小: 每个文件 2 GB(上传和下载)
  • 每次上传最大文件数: 1,000 个文件

上传文件(本地到远程)

要将文件从您的本地机器传输到远程 Windows 会话,请将文件拖动到浏览器窗口上或使用控制面板。拖放支持单个文件和文件夹(包括子文件夹,最多共 1,000 个条目)。控制面板文件选择器仅选择单个文件。文件将存放在远程桌面的活动元素上。例如,如果您在文件资源管理器中打开了一个文件夹,文件将存放在该文件夹中。

下载文件(远程到本地)

要将文件从远程 Windows 会话传输到您的本地机器:

  1. 在远程 Windows 会话中,复制您想要下载的文件。右键单击该文件并选择 Copy(复制),或者选择该文件并按 Ctrl+C
  2. 控制面板图标会轻微跳动以指示有文件可用。打开控制面板以查看文件。
  3. 选择以下选项之一:
    • Download(下载):将文件下载到您的本地机器。
    • Download zip(下载 zip):一次性将多个文件作为压缩文件夹下载到您的本地机器。
    • Print(打印):将 PDF 文件打印到您网络上的本地打印机。

打印 PDF

您可以将剪贴板面板中的 PDF 文件打印到本地打印机。要打印单个文件,请选择 PDF 旁边的打印图标。要一次打印多个文件,请在远程机器上将这些文件一起复制到剪贴板中,然后选择剪贴板面板中的 Print all PDFs(打印所有 PDF)。这些文件将合并为一个 PDF 并作为单个打印作业发送到您的浏览器。

限制

  • RDP 会话结束时,传输历史将被丢弃。
  • 远程 Windows 服务器必须支持通过 RDP 剪贴板虚拟通道进行文件传输。Windows Server 2012 及更高版本默认支持此功能。
  • 如果远程服务器不支持文件传输,文本剪贴板仍可正常工作。

兼容性

RDP 服务器操作系统

基于浏览器的 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

运行 Powershell 7 或更高版本,以减轻先前 Microsoft 按键未被记录的问题。

用户标识符格式

基于浏览器的 RDP 支持使用以下登录凭据连接到 Windows 机器:

安全账户管理器 (SAM)

支持带空格和不带空格的 SAM 格式的用户标识符。

示例:

  • DOMAIN\username
  • DOMAIN\username with spaces
  • .\username
  • .\username with spaces
  • username
  • username with spaces

字符限制

指定域的标识符(例如 DOMAIN\username)中,域最多可包含 20 个字符,用户名最多可包含 15 个字符。

不带域的标识符(例如 .\username)将使用默认域。用户名最多可包含 20 个字符。

用户主体名称 (UPN)

支持带空格、带引号和不带引号的 UPN 格式的用户标识符。

示例:

Microsoft Entra ID

绑定到 Microsoft Entra ID 域的用户标识符必须将其用户名输入为 AzureAD\[email protected]AzureAD\userAzureAD\ 前缀不区分大小写。 使用绑定到 Microsoft Entra ID 的用户名时,登录流程略有不同:

  1. 以前述格式之一输入您的用户名。
  2. 输入用户名后,密码框将消失,RDP 连接将发起。
  3. 随后,RDP 服务器会在授予对 RDP 服务器的访问权限之前提示输入密码。

Cloudflare 产品

使用 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 安全层必须至少设置为 NegotiateSSL。如果服务器设置为使用旧版 RDP 安全层,连接将失败。您可以在本地组策略编辑器中通过将 Require use of specific security layer for remote (RDP) connections(远程(RDP)连接要求使用特定的安全层) 设置为 NegotiateSSL 来进行配置。
  • 剪贴板浏览器兼容性:默认情况下,本地和远程机器之间的自动剪贴板共享仅在基于 Chromium 的浏览器中可用(Google Chrome、Microsoft Edge、Opera、Brave)。要在 Firefox 中启用此功能:
    1. 在浏览器地址栏中输入 about:config 并按 Enter(回车)
    2. 如果显示警告提示,请接受。
    3. 搜索 dom.events.testing.asyncClipboard 并将其设置为 true
    4. 搜索 dom.events.asyncClipboard.clipboardItem 并将其设置为 true
    5. 搜索 dom.events.asyncClipboard.readText 并将其设置为 true

这篇文档对您有帮助吗?