NSX Advanced Load Balancer 使用父虚拟服务和子虚拟服务概念进行 SNI 虚拟托管。在创建(通过高级模式)或编辑操作中选择虚拟托管虚拟服务选项时,虚拟服务将参与虚拟托管。必须将虚拟托管虚拟服务配置为父虚拟服务或子虚拟服务。

父虚拟服务



父虚拟服务管理用于与客户端协商 TCP 和 SSL 的网络属性。如果客户端请求的域名不存在或与配置的子虚拟服务之一不匹配,还可以将父虚拟服务作为通用虚拟服务。

在父虚拟服务上配置以下属性:

网络

侦听器 IP 地址、服务端口、网络配置文件和 SSL 配置文件。不会在子虚拟服务上配置任何网络属性。

(可选)为父虚拟服务指定一个池。只有在没有与客户端请求的域名匹配的子虚拟服务时,才会使用该池。

SSL 证书

可以配置 SSL 证书,该证书可能是通配符证书,也可能是特定的域名。如果客户端不发送 SNI 主机名 TLS 扩展,或者客户端的 TLS SNI 主机名与子虚拟服务的任何域名都不匹配,则使用父虚拟服务的 SSL 证书。如果将具有特定域名的 SSL 证书返回到客户端,例如,在发送友好的错误消息时,客户端将收到 SSL 名称不匹配消息。因此,建议在父虚拟服务上使用通配符。

父虚拟服务接收所有新的客户端 TCP 连接握手,这会反映在统计信息中。在选择子虚拟服务后,连接将在内部切换到子虚拟服务。因此,仅在子虚拟服务上记录后续的衡量指标,例如,数据包、并发连接、吞吐量、请求、日志和其他统计信息。同样,子虚拟服务不包含初始 TCP 或 SSL 握手的日志(例如 SSL 版本不匹配错误),这些握手是在父虚拟服务中记录的。

在 TLS 握手的 SNI 阶段,父虚拟服务委派给子虚拟服务。

如果从客户端收到 SNI 消息,并且 SNI 主机名与为任何子虚拟服务配置的主机名匹配,连接将在此时切换到子虚拟服务。此外,子虚拟服务的所有 SSL 证书和 L7 状态(例如,策略、DataScript 等)将应用于 HTTP 请求。日志最终位于子虚拟服务上。

如果没有切换到子虚拟服务,将在父虚拟服务上处理连接/请求。因此,将应用父虚拟服务的 SSL 和 L7 状态,并向客户端提供父虚拟服务上的默认证书。在收到并解析请求后,您可以通过无池机制、具有关闭操作的池机制或安全策略关闭客户端 TCP 连接。如果父虚拟服务上的通配符证书涵盖子虚拟服务的所有子域,您可以从父虚拟服务中提供该证书,然后按照上面所述关闭连接。

只能根据 SNI 子虚拟服务上配置的 FQDN(完全限定域名)选择子虚拟服务。确保在子虚拟服务 FQDN 中不存在重复或重叠的项。在选择 SNI 流量的子虚拟服务时,虚拟服务证书中的公用名称或主体备用名称不起任何作用。

必须将 SNI 子虚拟服务的 vh_domain_name 明确添加到父虚拟服务 VIP 列表中,才能正确填充 DNS 记录。

在选择子虚拟服务(使用客户端 Hello 的服务器名称 TLS 扩展)后,将在连接上提供其证书,并且进一步的 HTTP 请求的主机标头必须与其中的一个子虚拟服务的 FQDN 匹配,否则,连接将失败,并在应用程序日志上显示虚拟主机错误。

如果连接无法选择子虚拟服务,将由父虚拟服务处理连接。

子虚拟服务

子虚拟服务没有 IP 地址或服务端口,而是指向父虚拟服务,必须先创建父虚拟服务。域名字段是启用了 SNI 的客户端在 SSL 握手中请求的完全限定名称。父虚拟服务将客户端请求与为子虚拟服务配置的域名进行匹配。它不会与配置的 SSL 证书进行匹配。子虚拟服务可以使用通配符证书或域特定的证书。

如果没有与客户端请求匹配的子虚拟服务,则使用父虚拟服务的 SSL 证书和池。如果 TLS SNI 父虚拟服务具有支持 TLS 版本 1、1.1 和 1.2 的 TLS/SSL 配置文件,而 TLS 子虚拟服务仅配置了 TLS 1.2,子虚拟服务将继续使用 TLS 1.2。

在这种设置中,父虚拟服务和子虚拟服务使用不同 SSL 配置文件,SSL 握手流程如下所示:

  1. TCP 握手 -> 父虚拟服务

  2. 客户端 Hello -> 父虚拟服务。客户端 Hello 包含 SNI。因此,NSX Advanced Load Balancer 选择子虚拟服务。

  3. 将使用子虚拟服务的 SSL 配置文件。子虚拟服务 SSL 配置文件用于根据 SSL/TLS 版本允许或拒绝,并选择一个密码。

  4. 子虚拟服务使用包含密码和子虚拟服务证书的服务器 Hello 进行响应。

日志

用户界面上的应用程序日志选项显示 SNI 主机名信息以及其他 SSL 相关信息。可以通过应用程序日志中的 SNI 信息更深入地了解入站请求,以及帮助排查各种问题。在子虚拟服务看到具有 SNI 标头的 SSL 连接时,将在应用程序日志中记录 SNI 标头中的主机名以及 SSL 版本、PFS 和密码相关信息。要检查启用了 SNI 的虚拟服务的相关日志,请导航到应用程序 > 虚拟服务,选择所需的虚拟服务,然后导航到日志

注:

在客户端请求的主机标头与子虚拟服务上配置的 FQDN 不匹配时,请求将失败并在子虚拟服务上显示应用程序日志,而不是使用父虚拟服务的默认池进行代理。