このセクションでは、パッシブ FTP のロード バランシングのために NSX Advanced Load Balancer 仮想サービスを構成する方法について説明します。
パッシブ FTP では、クライアントはポート 21 で PASV コマンドをサーバに送信します。サーバは、接続先の 1023 より大きいサーバ IP アドレス データ ポートで応答します。パッシブ FTP にロード バランサの仮想 IP アドレスを使用する場合、クライアントがサーバに直接接続するのではなくロード バランサに接続できるように、サーバ IP をロード バランサの仮想 IP に変更する必要があります。DataScript は、サーバ IP をサーバ応答の FTP ペイロードで構成された仮想 IP に変更するために使用されます。
NSX Advanced Load Balancer の構成
パッシブ FTP のロード バランシングに NSX Advanced Load Balancer を構成するには、次の手順を実行します。
FTP の健全性モニターを構成する
必要な FTP サーバを使用してプールを構成する
FTP のレイヤー 4 応答 DataScript を構成する
データ チャネルのポート構成を使用してレイヤー 4 仮想サービスを構成する
健全性モニターの構成
FTP 用の外部健全性モニターを構成するには、NSX Advanced Load Balancer ユーザー インターフェイスで の順に移動し、[作成] をクリックします。
健全性モニターの名前を入力します。
[タイプ] のドロップダウンをクリックし、[外部] を選択します。
[送信間隔] フィールドに関連する値を入力します。
[外部設定] で、
[健全性モニター ポート] フィールドにポート番号 21 を入力します。
FTP 健全性モニターの次の bash スクリプトを [スクリプト コード] セクションに貼り付けます。
#!/bin/bash curl -s ftp://$IP/$path --ftp-pasv -u $user:$pass
[スクリプト変数] セクションに、[ユーザー名]、[パスワード]、[ファイルパス] を入力します。
ファイル パスは、健全性モニターでチェックするファイルの絶対パスです。curl は、プール内のサーバに提供されるユーザー名とパスワードを使用して FTP 接続を開き、指定されたパスのディレクトリ リストを要求します。curl はサイレント モード(オプション「-s」で指定)で実行され、ファイル パスにファイルが存在し、健全性モニターが成功する場合にのみディレクトリ一覧の出力を返します。ファイル パスにファイルが存在しない場合、健全性モニターは失敗します。パスはオプションです。指定しない場合、curl はルート ディレクトリのリストを取得します。
プールの構成
必要な FTP サーバを使用してプールを構成するには、NSX Advanced Load Balancer ユーザー インターフェイスで に移動し、[プールの作成] をクリックします。
プールの名前を入力します。
[デフォルトのサーバ ポート] フィールドにポート番号 21 を入力します。
[ロード バランシング] で、 を選択します。
仮想サーバが複数のサービス エンジンにスケール アウトされた場合に各 SE によって異なるサーバが選択されないようにするため、ロード バランシング アルゴリズムとして、送信元 IP アドレスによるコンシステント ハッシュが選択されます。
[+アクティブ モニターの追加] をクリックし、ドロップダウン メニューから前の手順で構成した健全性モニター (FTP) を選択します。
[サーバ] タブに移動し、関連するサーバを選択します。
[詳細] タブに移動します。
[その他] 設定で、[ポート変換の無効化] チェックボックスをクリックしてオプションを有効にします。
DataScript の構成
レイヤー 4 応答 DataScript を構成するには、NSX Advanced Load Balancer ユーザー インターフェイスで の順に移動し、[作成] をクリックします。
次の DataScript を [VS Datascript Evt L4 応答イベント スクリプト] セクションに追加し、[保存] をクリックします。
-- Handle passive FTP 227 response rewrite (server IP to VIP) function string.tohex(str) return (str:gsub('.', function (c) return string.format('%02X', string.byte(c)) end)) end -- Do not run DS for data ports if avi.vs.port() ~= '21' then avi.l4.ds_done() end -- Read entire payload (assumption that entire response we are looking for is a single packet) local payload = avi.l4.read() local p1, p2 = string.match(payload, '227 Entering Passive Mode %(%d+,%d+,%d+,%d+,(%d+),(%d+)%)%.\r\n') if p1 ~= nil then local vip_ip = string.gsub(avi.vs.ip(), '%.', ',') local rewrite = '227 Entering Passive Mode (' .. vip_ip .. ',' .. p1 .. ',' .. p2 ..').\r\n' avi.l4.modify(string.tohex(rewrite)) rewrite_len = rewrite:len() payload_len = payload:len() if rewrite_len < payload_len then avi.l4.discard(payload_len-rewrite_len, rewrite_len) end end
仮想サービスの構成
NSX Advanced Load Balancer ユーザー インターフェイスで FTP のレイヤー 4 仮想サービスを構成するには、次の手順を実行します。
[仮想サービスの作成] をクリックして、[詳細設定] を選択します。
の順に移動し、[プロファイル] で、
[アプリケーション プロファイル] の場合は、ドロップダウンをクリックし、[System-L4-Application] を選択します。
[TCP/UDP プロファイル] の場合は、ドロップダウンをクリックし、[System-TCP-Proxy] を選択します。
[サービス ポート] で、[詳細に切り替え] をクリックします。
[サービス] で、ポート範囲として 1024 ~ 65534 を入力します。
注:セキュリティの観点から、FTP サーバで構成されている特定のパッシブ ポート範囲を特定し、このポート範囲を高ポートの全範囲ではなく、仮想サービスで構成することをお勧めします。
[プール] でドロップダウンをクリックし、構成済みのプール (FTP) を選択します。
[次へ] をクリックします。
[ポリシー] タブの [DataScripts] で、[DataScript の追加] をクリックします。ドロップダウンから、前のセクションで構成した DataScript (FTP-DataScript) を選択します。
[DataScript の保存] をクリックします。
[次へ] をクリックして次の 2 つのタブに移動し、[保存] をクリックして構成を保存します。
その他の構成
FTP サーバは、制御接続とデータ接続が同じ IP から送信されるように強制できます。したがって、制御トラフィックとデータ トラフィックのロード バランシングを行うサービス エンジンは同じである必要があります。これを実現するには、アクティブ/スタンバイ高可用性モードでサービス エンジンを展開します。
ネイティブ レイヤー 2 スケールアウトを使用してアクティブ/アクティブ モードで展開する場合、同じサービス エンジンが FTP サーバへのトラフィックを確実にロード バランシングするには、CLI を使用して仮想サービスで次のように構成します。
[admin:10-10-10-1]: > configure virtualservice virtual-service-name [admin:10-10-10-1]: virtualservice> flow_dist consistent_hash_source_ip_address [admin:10-10-10-1]: virtualservice> save
BGP/ECMP スケールアウトを使用すると、Azure または GCP で FTP ロード バランシングを行う展開と同様に、フローはアップストリーム デバイスで行われたルーティング ハッシュに基づいてサービス エンジンに到達します。したがって、上記の CLI 構成は BGP/ECMP スケールアウトには適用されません。
これで、仮想サービスで FTP のロード バランシングの準備が整いました。クライアントの FTP サーバ IP は、FTP 仮想サービスで構成された仮想 IP アドレスになります。