适用于 Linux 的 HDX Direct
访问 Citrix 提供的资源时,如果可以进行直接通信,HDX Direct 将允许内部和外部客户端设备与会话主机建立安全的直接连接。
系统要求
下面是使用 HDX Direct 的系统要求:
-
控制平面
- Citrix DaaS
- Citrix Virtual Apps and Desktops 2503 或更高版本
-
Virtual Delivery Agent (VDA)
- Linux:版本 2503 或更高版本
-
Workspace 应用程序
- Windows:版本 2503 或更高版本
- Linux:版本 2411 或更高版本
- Mac:版本 2411 或更高版本
-
访问层
- Citrix Workspace
- Citrix StoreFront 2503 或更高版本
- Citrix Gateway 服务
- Citrix NetScaler Gateway
网络要求
下面是使用 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 | Internet(请参阅下面的注释) | 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 连接过程。
- 客户端通过 Gateway Service 建立 HDX 会话。
- 成功连接后,VDA 通过 HDX 连接向客户端发送 VDA 计算机的 FQDN、其 IP 地址列表以及 VDA 计算机的证书。
- 客户端探测 IP 地址以查看其是否可以直接到达 VDA。
- 如果客户端可以通过共享的任何 IP 地址直接访问 VDA,客户端将使用与步骤 (2) 中交换的证书匹配的证书与 VDA 建立直接连接,通过 (D)TLS 保护其安全。
- 成功建立直接连接后,会话将转移到新连接,与 Gateway Service 的连接将终止。
注意:
在上述步骤 2 中建立连接后,会话将处于活动状态。 后续步骤不会延迟或干扰用户使用虚拟应用程序或桌面的能力。 如果任何后续步骤失败,则会在不中断用户会话的情况下保持通过网关建立的连接。
外部用户
下图概述了外部用户的 HDX Direct 连接过程:
- 客户端通过 Gateway Service 建立 HDX 会话。
- 成功连接后,客户端和 VDA 都会发送 STUN 请求以发现其公用 IP 地址和端口。
- STUN 服务器使用其相应的公用 IP 地址和端口响应客户端和 VDA。
- 通过 HDX 连接,客户端和 VDA 交换其公用 IP 地址和 UDP 端口,VDA 将其证书发送给客户端。
- VDA 将 UDP 数据包发送到客户端的公用 IP 地址和 UDP 端口。 客户端向 VDA 的公用 IP 地址和 UDP 端口发送 UDP 数据包。
- 收到来自 VDA 的消息后,客户端会使用安全连接请求进行响应。
- 在 DTLS 握手期间,客户端将验证证书是否与在步骤 4 中交换的证书相匹配。 验证后,客户端将发送其授权令牌。 现已建立安全的直接连接。
- 成功建立直接连接后,会话将转移到新连接,与 Gateway Service 的连接将终止。
注意:
在上述步骤 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 行为:
如果测试失败,绑定测试和/或行为测试报告失败。
- 运行以下命令:
./stunclient stunserver2024.stunprotocol.org --mode filtering
-
记下输出。
请参见下表,根据客户端和会话主机的测试结果,确定面向外部用户的 HDX Direct 是否预期有效: | 客户端 NAT 行为 | 客户端 NAT 过滤 | 会话主机 NAT 行为 | 会话主机 NAT 过滤 | 是否预期可以工作 | | — | — | — | — | — | | 端点独立映射 | 任意 | 端点独立映射 | 任意 | 是 | | 端点独立映射 | 端点独立过滤 | 地址相关映射 | 任意 | 是 | | 端点独立映射 | 地址相关过滤 | 地址相关映射 | 任意 | 否 | | 端点独立映射 | 地址和端口相关过滤 | 地址相关映射 | 任意 | 否 | | 端点独立映射 | 端点独立过滤 | 地址和端口相关映射 | 端点独立过滤 | 是 | | 端点独立映射 | 地址相关过滤 | 地址相关映射 | 任意 | 否 | | 端点独立映射 | 地址和端口相关过滤 | 地址相关映射 | 任意 | 否 | | 地址相关映射 | 任意 | 端点独立映射 | 端点独立过滤 | 是 | | 地址相关映射 | 任意 | 端点独立映射 | 地址相关过滤 | 否 | | 地址相关映射 | 任意 | 端点独立映射 | 地址和端口相关过滤 | 否 | | 地址相关映射 | 任意 | 地址相关映射 | 任意 | 否 | | 地址相关映射 | 任意 | 地址和端口相关映射 | 任意 | 否 | | 地址和端口相关映射 | 任意 | 端点独立映射 | 端点独立过滤 | 是 | | 地址和端口相关映射 | 任意 | 端点独立映射 | 地址相关过滤 | 否 | | 地址和端口相关映射 | 任意 | 端点独立映射 | 地址和端口相关过滤 | 否 | | 地址和端口相关映射 | 任意 | 地址相关映射 | 任意 | 否 | | 地址和端口相关映射 | 任意 | 地址和端口相关映射 | 任意 | 否 | | 失败 | 任意 | 任意 | 任意 | 否 | | 任意 | 任意 | 失败 | 任意 | 否 | | 失败 | 任意 | 失败 | 任意 | 否 |