NSX Advanced Load Balancer では、SNI 仮想ホスティングで親仮想サービスと子仮想サービスの概念を利用します。作成アクション(詳細モードによる)または編集アクションで仮想ホスティング仮想サービスのオプションがオンになっている場合、仮想サービスは仮想ホスティングに参加します。仮想ホスティング仮想サービスは、親仮想サービスまたは子仮想サービスとして構成する必要があります。

親仮想サービス



親仮想サービスでは、TCP や SSL とクライアントとのネゴシエートに使用されるネットワーク プロパティを制御します。また、クライアントから要求されたドメイン名が存在しない場合や、構成した子仮想サービスのいずれとも一致しない場合は、キャッチオールになります。

次のプロパティは親仮想サービスで構成します。

ネットワーク

リスナーの IP アドレス、サービス ポート、ネットワーク プロファイル、SSL プロファイル。ネットワーク プロパティは、子仮想サービスでは構成しません。

プール

オプションで、親仮想サービスのプールを指定します。プールが使用されるのは、クライアントから要求されたドメイン名に一致する子仮想サービスがない場合のみです。

SSL 証明書

SSL 証明書は、ワイルドカード証明書か、特定のドメイン名のいずれかになるよう構成することができます。親の SSL 証明書が使用されるのは、クライアントから SNI ホスト名 TLS 拡張子を送信しない場合か、クライアントの TLS SNI ホスト名が子仮想サービスのドメイン名のいずれとも一致しない場合です。たとえば、フレンドリーなエラー メッセージを送信する場合などに、SSL 証明書が特定のドメイン名でクライアントに返されると、クライアントは SSL 名不一致メッセージを受信します。したがって、ワイルドカードは親で使用することをお勧めします。

親仮想サービスでは、すべての新しいクライアント TCP 接続ハンドシェイクを受信しますが、これは統計情報に反映されます。子仮想サービスが選択されると、接続は内部で子仮想サービスに引き渡されます。そのため、それより後のメトリック(パケット数、同時接続数、スループット、要求数、ログ数などの統計情報)は、子仮想サービスにのみ記録されます。同様に、子仮想サービスには、TCP ハンドシェイクや SSL ハンドシェイクの初期のログはありません。SSL バージョン不一致エラーなどは、親仮想サービスで記録されます。

親から子への委任は、TLS ハンドシェイクの SNI フェーズで行われます。

クライアントから受信した SNI メッセージがあり、いずれかの子仮想サービスに構成したホスト名と SNI ホスト名とが一致する場合、その時点で接続が子仮想サービスに切り替わります。また、子仮想サービスのすべての SSL(たとえば、証明書)と L7 状態(たとえば、ポリシー、DataScript など)が HTTP 要求に適用されます。ログは最終的に子仮想サービスで記録されます。

子仮想サービスへの切り替えがなかった場合、接続/要求は親仮想サービスで処理されます。そのため、親の SSL と L7 状態が適用されます。親のデフォルトの証明書がクライアントに提示されます。要求が受信され解析されたら、プールなしで、プールの終了アクションで、またはセキュリティ ポリシー経由で、クライアント側の TCP 接続を閉じます。子仮想サービスのすべてのサブドメインをカバーするワイルドカード証明書が親に存在する場合は、その証明書を親から提供し、前述のように接続を閉じます。

子仮想サービスでの選択は、SNI の子で構成した FQDN(完全修飾ドメイン名)にのみ基づいています。子 FQDN 間での重複がないようにします。仮想サービス証明書のコモン ネームやサブジェクト代替名には、SNI トラフィックの子の選択で果たすロールはありません。

DNS レコードが正しくポピュレートされるようにするには、SNI 子仮想サービスの vh_domain_name を親仮想サービス VIP のリストに明示的に追加する必要があります。

子が選択される(client hello のサーバ名 TLS 拡張子を使用)と、その証明書が接続で提供されるため、それより後の HTTP 要求の Host ヘッダーは、いずれかの子の FQDN と一致する必要があります。一致しないと、仮想ホスト エラーが発生して接続が失敗し、AppLog に記録されます。

接続で子を選択できなかった場合は、親仮想サービスによって処理されます。

子仮想サービス

子仮想サービスには、IP アドレスやサービス ポートはありません。代わりに、親仮想サービスを参照します。親は先に作成されている必要があります。ドメイン名フィールドにあるのは、SSL ハンドシェイク内で SNI 対応クライアントによって要求された完全修飾名です。親ではクライアント要求を、子の構成済みドメイン名と照合します。構成済み SSL 証明書とは照合しません。子は、ワイルドカード証明書またはドメイン固有の証明書を使用できます。

子がクライアント要求に一致しない場合、親の SSL 証明書とプールが使用されます。TLS バージョン 1、1.1、1.2 をサポートする TLS/SSL プロファイルを持つ TLS SNI 親と、TLS 1.2 のみが構成されている TLS 子との場合、子ではそのまま TLS 1.2 を使用します。

親仮想サービスと子仮想サービスとで使用する SSL プロファイルが異なる設定の場合、SSL ハンドシェイクのフローは次のようになります。

  1. TCP ハンドシェイク -> 親仮想サービス

  2. client hello -> 親仮想サービス。client hello には SNI が含まれています。したがって、NSX Advanced Load Balancer では子仮想サービスを選択します。

  3. 子の SSL プロファイルが使用されます。子仮想サービス SSL プロファイルは、SSL/TLS バージョンに基づいて許可あるいは拒否するため、また暗号を選択するために使用されます。

  4. 子仮想サービスは、暗号と子証明書を含む server Hello で応答します。

ログ

ユーザー インターフェイスのアプリケーション ログ オプションには、SNI ホスト名情報などの SSL 関連情報が表示されます。アプリケーション ログの SNI 情報は、受信される要求に関する詳細情報を提供し、さまざまな問題のトラブルシューティングにも役立ちます。子仮想サービスに SNI ヘッダーとの SSL 接続があると、その SNI ヘッダーのホスト名が、SSL バージョン、PFS、暗号関連情報とともに、アプリケーション ログに記録されます。SNI 対応の仮想サービス関連のログを確認するには、[アプリケーション ] > [仮想サービス] の順に移動し、目的の仮想サービスを選択して [ログ] に移動します。

注:

クライアント要求の Host ヘッダーが、子仮想サービスに構成されている FQDN と一致しない場合、要求は失敗し、子のアプリケーション ログに記録されます。親仮想サービスのデフォルトプールを使用してプロキシされるのではありません。