はじめに:

SSLを利用しているVirtual Serverにおいて、振分け先Poolの全メンバーがダウンしている場合、BIG-IPがSSLハンドシェークを実施した上でクライアントのコネクションを拒否します

つまりサーバに接続できないにも関わらずSSLの接続が確立され、ユーザへのレスポンスに時間がかかってしまいます。(これはBIG-IPの仕様による動作です。)

ユーザへストレスを与えないためには、Poolの全メンバーがダウンしている場合に、SSLセッションを確立せずにコネクションを拒否する、あるいはSorry Serverへ転送する、などのアクションが望ましいのではないでしょうか?

今月は、SSLのVirtual Server配下のPoolがダウンの場合、SSLセッションを確立しない簡単なiRuleをご紹介します。

詳細はこちらでも確認いただけます: http://devcentral.f5.com/wiki/default.aspx/iRules/HowToAvoidSSLHandshakeWhenNoPoolMemberAvailable.html

メリット:
rejectでクライアントのTCPセッション拒否(RST返答)や非SSLのRedirectなどのアクションを簡単に実現し、ユーザへのレスポンスタイムを短縮する。

動作概要:
*Virutal Serverに関連付けられたPoolの全てのMemberがダウンであることを検出
*全Memberがダウンの場合にSSL::disableコマンドでSSL処理を無効化


使い方:
*HTTPSのVirtual ServerにiRuleを関連付ける

【iRule定義】 

バージョン1:TCP接続を拒否(RSTを返答)

# This event is triggered when a TCP connection is established with the client
when CLIENT_ACCEPTED {
   # Check if the default pool of the VIP has no active members
   if {[active_members [LB::server pool]] < 1}{
      # Disable the client SSL profile and send a TCP reset to the client
      SSL::disable
      reject
   }
}
バージョン2:非SSLのRedirectを実行

when CLIENT_ACCEPTED {
   # Check if the default pool of the VIP has no active members
   if {[active_members [LB::server pool]] < 1}{
      # Disable the client SSL profile and send a TCP reset to the client
      SSL::disable
set redirect_client 1
   } else {
      set redirect_client 0
}

when HTTP_REQUEST {
  if { $redirect_client } {
     HTTP::redirect "http://sorryserver.com"
  }
}

 ※F5ネットワークスジャパンでは、サンプルコードについて検証を実施していますが、お客様の使用環境における動作を保証するものではありません。実際の使用にあたっては、必ず事前にテストを実施することを推奨します。