Product Documentation

使虚拟 IP 地址对应用程序可用

Sep 15, 2015

一些应用程序(例如 CRM 和 CTI)将 IP 地址用于寻址、许可、身份验证或其他目的,因此,这些应用程序在会话中需要使用唯一的 IP 地址或环回地址。其他应用程序可能绑定到某个静态端口,但由于该端口已在使用中,因此会导致在多用户环境中多次尝试启动应用程序失败。要使这些应用程序能够在 XenApp 环境中正常运行,需要为每个设备设置唯一的 IP 地址。

使用虚拟 IP 地址功能允许为每个会话动态分配 IP 地址,这样该会话中运行的已配置应用程序就看起来好象都具有唯一的地址。

在以下任一种情况下,进程需要使用虚拟 IP:

  • 进程使用硬编码 TCP 端口号,或者
  • 进程执行以下两个操作:
    • 使用 Windows 套接字
    • 需要唯一的 IP 地址或指定的 TCP 端口号

此外,借助此功能还可以将依赖于与 localhost(默认为 127.0.0.1)通信的应用程序配置为:使用 localhost 范围 (127.*) 之内的唯一虚拟环回地址。

在以下任一种情况下,进程需要使用虚拟环回:

  • 进程使用 Windows 套接字环回 (localhost) 地址 (127.0.0.1),或者
  • 进程使用硬编码 TCP 端口号

如果应用程序需要 IP 地址的原因仅仅是为了身份验证,请将您的服务器配置为使用客户端 IP 地址。

虚拟 IP 地址工作原理

Microsoft 远程桌面 (RD) IP 虚拟化功能的工作原理如下:

  • 在 Microsoft Server Manager 中,展开远程桌面服务 > 远程桌面会话主机连接,以启用 RD IP 虚拟化功能并对设置进行配置。有关详细信息,请参阅 Microsoft 帮助和文档,包括 Microsoft TechNet Web 站点。
    • 启用了此功能时,服务器将在会话启动时从动态主机配置协议 (DHCP) 服务器中请求动态分配的 IP 地址。
    • RD IP 虚拟化功能根据您配置的虚拟 IP 策略和设置,在每会话或每程序基础上将 IP 地址分配到远程桌面连接。如果为多个程序分配 IP 地址,则它们将共享每会话 IP 地址。
    • 将地址分配给会话后,该会话会在进行以下调用时使用分配的虚拟地址,而不是系统的主 IP 地址:
      Bind、closesocket、connect、WSAConnect、WSAAccept、getpeername、getsockname、sendto、WSASendTo、WSASocketW、gethostbyaddr、getnameinfo 和 getaddrinfo
  • XenApp 允许gethostbynameAPI 返回虚拟 IP 地址,从而扩展了 Windows 虚拟 IP 功能。此外,XenApp 可以将虚拟环回添加到所有 API。
    注意:必须将所有需要使用 XenApp 功能的进程添加到您启用的虚拟 IP 策略的程序列表中。子进程并不会自动继承此功能。添加进程时可以使用完整路径,也可以仅使用可执行文件名称。出于安全考虑,Citrix 建议您使用完整路径。

绑定应用程序

在“远程桌面”会话托管配置中使用 Microsoft IP 虚拟化功能时,在应用程序和 Winsock 函数调用之间插入“过滤器”组件,可将该应用程序绑定到特定的 IP 地址。然后,应用程序只查看它应该使用的 IP 地址。该应用程序对侦听 TCP 或 UDP 通信的任何尝试都会自动绑定到其分配的虚拟 IP 地址(或环回地址),并且该应用程序打开的任何原始连接都源自绑定到该应用程序的 IP 地址。

GetHostByName()(由 XenApp 策略控制)和GetAddrInfo()(由 Windows 策略控制)这类返回地址的函数中,如果请求本地主机 IP 地址,则虚拟 IP 将查看返回的 IP 地址并将其更改为会话的虚拟 IP 地址。尝试通过此类名称函数获得本地服务器 IP 地址的应用程序,仅会看到分配给该会话的唯一虚拟 IP 地址。此 IP 地址通常用于后续套接字调用(例如 bind 或 connect)。

通常,应用程序会请求绑定到一个端口以侦听地址 0.0.0.0。如果应用程序发出此请求并使用静态端口,您无法启动该应用程序的多个实例。虚拟 IP 地址功能也会在这些类型的调用中查找 0.0.0.0,然后将调用更改为侦听特定虚拟 IP 地址。这样,多个应用程序便可侦听同一台计算机上的同一端口,因为这些应用程序侦听的地址是各不相同的。请注意,仅当调用在 ICA 会话中进行并且虚拟 IP 地址功能处于启用状态时,才可以更改调用。例如,如果在不同会话中运行的应用程序的两个实例同时尝试绑定到所有接口 (0.0.0.0) 和特定端口(例如 9000),它们将分别绑定到 VIPAddress1:9000 和 VIPAddress2:9000,因而不会发生冲突。

确定应用程序是否需要使用虚拟 IP 地址

在 XenApp 上,一些应用程序无法在多个会话中运行。例如,如果应用程序绑定到特定 IP 地址(例如 0.0.0.0 或 127.0.0.1)上的固定 TCP 端口,则会阻止多个应用程序实例在多个会话中运行,原因是该端口已被占用。XenApp 的虚拟 IP 功能可帮助您解决此问题。

要确定应用程序是否需要使用虚拟 IP 地址:

  1. 获得 Microsoft 提供的 TCPView 工具。 此工具可以列出所有绑定特定 IP 地址和端口的应用程序。
  2. 禁用“解析 IP 地址”功能,这样您看到的将是地址而不是主机名。
  3. 启动应用程序,然后使用 TCPView 查看该应用程序打开了哪些 IP 地址和端口以及哪些进程名称正在打开这些端口。

要使用虚拟 IP 地址功能,请配置所有打开服务器 IP 地址(0.0.0.0 或 127.0.0.1)的进程。

为确保应用程序不会在其他端口上打开相同的 IP 地址,请启动该应用程序的另一实例。

使虚拟 IP 地址对会话中运行的应用程序可用

启用这些虚拟 IP 策略设置可增加对 Windows IP 虚拟化功能的额外支持。虚拟 IP 地址为已发布应用程序提供在会话中使用的唯一 IP 地址。这对于在呼叫中心广泛使用的计算机电话集成 (CTI) 应用程序尤为重要。用户可以在 XenApp 服务器上访问这些应用程序,访问方式与访问任何其他已发布应用程序的方式相同。有关详细信息,请参阅确定应用程序是否需要使用虚拟 IP 地址

在开始之前,请在 Microsoft Server Manager 控制台上启用远程桌面 IP 虚拟化功能,并通过配置使其能够在每会话或每程序基础上使用 DHCP 服务器动态分配 IP 地址。

要扩展 IP 虚拟化功能,请为虚拟 IP 配置以下 Citrix 策略设置:
  • 虚拟 IP 增强兼容性。如果应用程序使用GetHostByNameAPI,则使用此设置。启用后,在会话中调用GetHostByName会返回该会话的虚拟 IP 地址(默认情况下处于禁用状态)。此功能仅适用于在虚拟 IP 兼容性程序列表中列出的应用程序。
  • 虚拟 IP 兼容性程序列表。列出使用虚拟 IP 增强兼容性策略的应用程序。
  • 虚拟 IP 适配器地址过滤。应用程序返回大量地址而导致性能降低时,使用此设置。启用此设置后,GetAdaptersAddresses返回的地址列表仅包括会话虚拟 IP 地址和环回地址,这样可提升性能(默认情况下处于禁用状态)。此功能仅适用于在虚拟 IP 过滤器适配器地址程序列表中列出的应用程序。
  • 虚拟 IP 过滤器适配器地址程序列表。列出使用 IP 适配器地址过滤策略的应用程序。

使虚拟环回地址对会话中运行的应用程序可用

将虚拟环回策略应用于使用环回地址进行进程间通信的应用程序。启用此虚拟 IP 策略设置后,每个会话都可以拥有其自己的通信用虚拟环回地址。如果应用程序在 Winsock 调用中使用了 localhost 地址 (127.0.0.1),虚拟环回功能只将 127.0.0.1 替换为 127.X.X.X,其中 X.X.X 表示会话 ID + 1。例如,会话 ID 为 7 的地址是 127.0.0.8。万一会话 ID 超过第四个八位字节(大于 255),地址将滚动到下一个八位字节 (127.0.1.0),直至达到最大值 127.255.255.255。

除了需要在程序列表中指定哪些进程使用此功能以外,虚拟环回功能不需要进行任何其他配置。虚拟环回不依赖于虚拟 IP,因此,无需使用 Microsoft 服务器配置即可启用虚拟环回。

有关详细信息,请参阅确定应用程序是否需要使用虚拟 IP 地址

请为虚拟 IP 配置以下 Citrix 策略设置:
  • 虚拟 IP 环回支持。此设置允许每个会话拥有其自己的通信用虚拟环回地址(默认情况下禁用)。此功能仅适用于在虚拟 IP 虚拟环回程序列表中列出的应用程序。
  • 虚拟 IP 虚拟环回程序列表。列出使用虚拟 IP 环回支持策略的应用程序。

向服务器上的已发布应用程序提供客户端 IP 地址

如果应用程序因出于身份验证或许可目的必须使用唯一地址而导致运行故障,且该应用程序不需要虚拟地址进行通信,请使用客户端 IP 地址功能。该功能仅挂接可返回主机 IP 地址的调用,如 gethostbyname()。仅应将该功能应用于将此类调用中的值发送到服务器应用程序进行身份验证或许可的应用程序。

如果要部署此功能,请考虑每个客户端设备所使用的 IP 地址。例如,如果两个远程用户使用同一个 IP 地址,则会由于地址重复而导致冲突。

配置了这些值之后,在策略的虚拟 IP 兼容性程序列表设置或虚拟 IP 虚拟环回程序列表设置中,使用相同进程名配置“虚拟 IP 进程”或“虚拟环回进程”。此函数可创建并管理以下注册表项(“客户端 IP”功能生效仍需要该注册表项):HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\ CtxHook\AppInit_Dlls\VIPHook\Processname

在 XenApp(32 位版本)中,此注册表项如下:HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\CtxHook\ AppInit_Dlls\VIPHook\Processname

注意:虚拟 IP 地址功能仅对加载 user32.dll 系统动态链接库的应用程序有效。

出于身份验证目的,某些应用程序要求单个会话的 IP 地址必须唯一。但是绑定或寻址时不需要此类 IP 地址。在这种情况下,可将会话配置为使用客户端设备的 IP 地址。

  1. 在应用程序所在的服务器上,启动注册表。
    警告:注册表编辑不当会导致严重问题,可能导致需要重新安装操作系统。Citrix 无法保证因“注册表编辑器”使用不当导致出现的问题能够得以解决。使用“注册表编辑器”需自担风险。在编辑注册表之前,请务必进行备份。
  2. 创建以下两个注册表项:
    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\VIP\

      名称:UseClientIP

      类型:REG_DWORD

      数据:1(启用)或 0(禁用,默认值)

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\VIP\

      名称:HookProcessesClientIP

      类型:REG_MULTI_SZ

      数据:多个可执行程序名称,表示使用客户端 IP 地址的应用程序进程

    注意:在 XenApp(32 位版本)中,以上项位于 HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\VIP\ 下。
  3. 关闭注册表并重新启动服务器。
  4. 对注册表进行指定的修改之后,在策略的程序列表中添加应用程序进程。 如果出现以下情况,请不要配置使用客户端 IP 地址:
    • 使用除 TCP/IP 以外的其他网络协议连接插件
    • 插件重新连接到已断开与其他用户设备之间的连接的会话
    • 会话使用传递插件