适用于 Linux 的 HDX™ 直连
访问 Citrix 交付的资源时,如果可以直接通信,HDX Direct 允许内部和外部客户端设备与会话主机建立安全的直接连接。
系统配置要求
以下是使用 HDX Direct 的系统要求:
-
控制平面
- 思杰 桌面即服务™
- 思杰虚拟应用和桌面™ 2503 或更高版本
-
虚拟投递代理 (VDA)
- Linux:版本 2503 或更高版本
-
工作区应用程序
- Windows:版本 2503 或更高版本
- Linux:版本 2411 或更高版本
- Mac:版本 2411 或更高版本
-
访问层
- 思杰工作区™
- 思杰 店面™ 2503 或更高版本
- 思杰网关服务
- 思杰 NetScaler® 网关设备
网络连接要求
以下是使用 HDX Direct 的网络要求。
会话主机
如果您的会话主机有防火墙,则必须允许以下入站流量用于内部连接。
| 描述信息 | 源 | 协议 | 端口 |
|---|---|---|---|
| 直接的内部连接 | 客户端 | TCP | 443 |
| 直接的内部网络连接 | 客户端 | UDP | 443 |
客户端网络
下表详细描述了内部和外部用户所使用的客户端网络。
内部用户
| 功能描述 | 协议 | 源 | 源端口 | 目标地址 | 目标端口 |
|---|---|---|---|---|---|
| 直接的内部网络连接 | TCP | 客户端网络 | 1024–65535 | VDA 网络 | 443 |
| 直接的内部网络连接 | UDP | 客户端网络 | 1024–65535 | VDA 网络 | 443 |
外部用户
| 详细描述 | 协议 | 源 | 源端口 | 目的地 | 目标端口 |
|---|---|---|---|---|---|
| STUN(仅限外部用户) | UDP | 客户端网络 | 1024–65535 | Internet(请参阅下面的注释) | 3478, 19302 |
| 外部用户连接 | UDP | 客户端网络 | 1024–65535 | 数据中心的公共 IP 地址 | 1024–65535 |
数据中心网络
下表详细阐述了适用于内部和外部用户的数据中心网络要求。
内部用户
| 详细说明 | 协议 | 源 | 源端口 | 目标地址 | 目标端口 |
|---|---|---|---|---|---|
| 直接的内部连接 | TCP | 客户端网络 | 1024–65535 | VDA 网络 | 443 |
| 直接的内部连接 | UDP | 客户端网络 | 1024–65535 | VDA 网络 | 443 |
外部用户
| 详细说明 | 协议 | 源 | 源端口 | 目标地址 | 目标端口 |
|---|---|---|---|---|---|
| STUN(仅限外部用户) | UDP | VDA 网络 | 1024–65535 | 互联网(参见下文注释) | 3478, 19302 |
| 外部用户连接 | UDP | DMZ / 内部网络 | 1024–65535 | VDA 网络 | 55000–55250 |
| 外部用户连接 | UDP | VDA 网络 | 55000–55250 | 客户端的公共 IP | 1024–65535 |
注意:
VDA 和 Workspace 应用程序都尝试按以下相同顺序向以下服务器发送 STUN 请求:
- stun.cloud.com:3478
- stun.cloudflare.com:3478
- stun.l.google.com:19302
如果您使用 HDX Direct 端口范围策略设置更改外部用户连接的默认端口范围,则相应的防火墙规则必须与您的自定义端口范围匹配。
配置说明
HDX Direct 默认处于禁用状态。您可以使用 Citrix 策略中的 HDX Direct 设置配置此功能。
- HDX Direct:用于启用或禁用功能。
- HDX Direct 模式:确定 HDX Direct 仅适用于内部客户端,还是同时适用于内部和外部客户端。
- HDX Direct 端口范围:定义 VDA 用于来自外部客户端连接的端口范围。
注意事项
以下是使用 HDX Direct 的注意事项:
- 面向外部用户的 HDX Direct 仅在 EDT (UDP) 作为传输协议时可用。因此,必须启用自适应传输。
- 如果您正在使用 HDX Insight,请注意使用 HDX Direct 会阻止 HDX Insight 数据收集,因为会话将不再通过 NetScaler Gateway 代理。
- 目前不支持将您自己的证书与 HDX Direct 结合使用。
工作原理
当直接通信可用时,HDX Direct 允许客户端与会话主机建立直接连接。当使用 HDX Direct 建立直接连接时,将使用自签名证书通过网络级加密 (TLS/DTLS) 保护直接连接。
内部用户
下图描绘了内部用户的 HDX Direct 连接过程概述。

- 客户端通过网关服务建立 HDX 会话。
- 连接成功后,VDA 通过 HDX 连接向客户端发送 VDA 计算机的 FQDN、其 IP 地址列表以及 VDA 计算机的证书。
- 客户端探测 IP 地址,以查看是否可以直接访问 VDA。
- 如果客户端可以使用共享的任何 IP 地址直接访问 VDA,则客户端将与 VDA 建立直接连接,并使用与步骤 (2) 中交换的证书匹配的证书通过 (D)TLS 进行保护。
- 一旦直接连接成功建立,则该会话将被转移到新的连接上,而与网关服务之间的连接则会被终止。
注意:
在上述步骤 2 中建立连接后,会话处于活动状态。后续步骤不会延迟或干扰用户使用虚拟应用程序或桌面的能力。如果任何后续步骤失败,则通过网关的连接将保持不变,而不会中断用户的会话。
外部用户
下图描绘了外部用户的 HDX Direct 连接过程概述:

- 客户端通过网关服务建立 HDX 会话。
- 连接成功后,客户端和 VDA 都会发送 STUN 请求以发现其公共 IP 地址和端口。
- STUN 服务器向客户端和 VDA 响应其相应的公共 IP 地址和端口。
- 通过 HDX 连接,客户端和 VDA 交换其公共 IP 地址和 UDP 端口,并且 VDA 将其证书发送给客户端。
- VDA 将 UDP 数据包发送到客户端的公共 IP 地址和 UDP 端口。客户端将 UDP 数据包发送到 VDA 的公共 IP 地址和 UDP 端口。
- 收到来自 VDA 的消息后,客户端会响应一个安全连接请求。
- 在 DTLS 握手期间,客户端会验证证书是否与步骤 4 中交换的证书匹配。验证后,客户端会发送其授权令牌。此时已建立安全的直接连接。
- 一旦直接连接成功建立之后,会话便会转移至新的连接,同时,与网关服务的连接也将随之终止。
注意:
在上述步骤 2 中建立连接后,会话处于活动状态。后续步骤不会延迟或干扰用户使用虚拟应用程序或桌面的能力。如果后续任何步骤失败,通过网关的连接将保持不变,而不会中断用户会话。
NAT 兼容性
为了在外部用户设备和会话主机之间建立直接连接,HDX Direct 利用打洞技术进行 NAT 遍历,并使用 STUN 促进客户端设备和会话主机的公共 IP 地址和端口映射的交换。这类似于 VoIP、统一通信和 P2P 解决方案的工作方式。
只要防火墙和其他网络组件配置为允许 STUN 请求和 HDX 会话的 UDP 流量,HDX Direct 预计可供外部用户使用。但是,在某些情况下,用户和会话主机网络的 NAT 类型会导致不兼容的组合,从而导致 HDX Direct 失败。
验证事项
您可以使用 STUNTMAN 的 STUN 客户端实用程序 验证客户端和会话主机上的 NAT 类型和筛选:
- 从 stunprotocol.org 下载适用于目标平台的相应软件包,并解压内容。
- 打开一个终端提示符,然后导航到内容已解压的目录。
- 运行以下命令:
./stunclient stunserver2024.stunprotocol.org --mode behavior -
请记录下输出。
如果绑定和行为测试成功,则 绑定测试 和 行为测试 均报告成功并指定 NAT 行为:
NAT 连接成功(/zh-cn/linux-virtual-delivery-agent/2511/media/nat-compatibility-report-success.png)
如果测试失败,则 绑定测试 和/或 行为测试 报告失败。

- 运行以下命令:
./stunclient stunserver2024.stunprotocol.org --mode filtering -
请记录下输出。

请参阅下表,根据客户端和会话主机的测试结果确定 HDX Direct 是否适用于外部用户:
| 客户端 NAT 行为 | 客户端 NAT 筛选 | 会话主机 NAT 行为 | 会话主机 NAT 过滤 | 预期是否有效? |
|---|---|---|---|---|
| 独立于端点的映射 | 任意 | 独立于端点的映射 | 任意 | 是 |
| 独立于端点的映射 | 独立于端点的过滤 | 依赖于地址的映射 | 任意 | 是 |
| 独立于端点的映射 | 依赖于地址的过滤 | 基于地址的映射 | 任何 | 否 |
| 独立于端点的映射 | 地址和端口相关过滤 | 基于地址的映射 | 任何 | 否 |
| 独立于端点的映射 | 独立于端点的过滤 | 地址和端口相关映射 | 独立于端点的过滤 | 是 |
| 独立于端点的映射 | 基于地址的过滤 | 地址依赖型映射 | 任何 | 否 |
| 端点独立型映射 | 地址和端口相关过滤 | 地址依赖型映射 | 任何 | 否 |
| 地址依赖型映射 | 任何 | 端点独立型映射 | 不依赖于端点的过滤 | 是 |
| 地址依赖型映射 | 任何 | 端点独立的映射 | 地址相关的过滤 | 否 |
| 地址相关的映射 | 任何 | 端点独立的映射 | 地址和端口相关过滤 | 否 |
| 地址相关的映射 | 任何 | 地址相关的映射 | 任何 | 否 |
| 地址相关的映射 | 任何 | 地址和端口相关映射 | 任何 | 否 |
| 地址和端口相关映射 | 任何 | 端点独立映射机制 | 端点独立过滤机制 | 是 |
| 地址和端口相关映射 | 任何 | 端点独立映射机制 | 地址依赖过滤机制 | 否 |
| 地址和端口相关映射 | 任何 | 端点独立的映射 | 地址和端口相关过滤 | 否 |
| 地址和端口相关映射 | 任意 | 地址相关的映射 | 任意 | 否 |
| 地址和端口相关映射 | 任意 | 地址和端口相关映射 | 任意 | 否 |
| 失败 | 任意 | 任何 | 任何 | 否 |
| 任何 | 任何 | 失败 | 任何 | 否 |
| 失败 | 任何 | 失败 | 任何 | 否 |