3.5. FTP の設定

ファイル転送プロトコル (FTP) は旧式の複雑なマルチポートプロトコルで、ロードバランサーを使用する環境では扱いが難しくなります。扱いの難しさを理解するには、初めに FTP の仕組みで重要となる点を理解する必要があります。

3.5.1. FTP の動作

ほとんどのサーバー/クライアント関係では、クライアントマシンが特定のポート上でサーバーへ接続を開いて、サーバーがそのポートのクライアントに応答します。FTP クライアントが FTP サーバーに接続する場合、FTP 制御ポート 21 への接続を開きます。そして、その クライアントが FTP サーバーアクティブ パッシブ のどちらの接続を開くかを指示します。クライアントが選択した接続タイプにより、サーバーの対応方法とトランザクションが発生するポートを決定します。
データ接続は以下の 2 種類です。
アクティブ接続
アクティブ接続が確立されると、サーバーはポート 20 からクライアントマシン上の高い範囲のポートにクライアントへデータ接続を開きます。サーバーからのすべてのデータは、この接続を通じて送信されます。
パッシブ接続
パッシブ接続が確立されると、クライアントは FTP サーバーに対してパッシブ接続ポートを確立するように依頼します。これは 10,000 より高いポートになります。するとサーバーは、この特定のセッション用に高い数値のポートをバインドして、このポート番号をクライアントに中継します。クライアントは、データ接続のために新規にバインドされたポートを開きます。クライアントが作成するデータ要求それぞれ、別個のデータ接続となります。最近の FTP クライアントのほとんどは、 サーバーからデータを要求する場合、パッシブ接続を試みます。

注記

接続タイプを決定するのは、サーバーではなく クライアント です。つまり、効果的に FTP をクラスター化するには、アクティブ接続とパッシブ接続の両方を処理するように LVS ルーターを設定する必要があることになります。
HTP のクライアントとサーバーの関係によって、Keepalived が認識しない多くのポートが開かれる可能性があります。

3.5.2. ロードバランサーのルーティングへの影響

IPVS パケット転送は、それをベースにしたクラスターへの接続とそのクラスターからの接続のみを許可し、そのポート番号やファイアウォールマークを認識します。クラスター外のクライアントが IPVS で処理するように設定されていないポートを開こうとした場合、接続は切断されます。同様に、実サーバーが IPVS が認識できないポート上でインターネット接続を開こうとした場合も、接続は切断されます。つまり、インターネット上の FTP クライアントからのすべての接続は、それらに割り当てられているファイアウォールマークと同じである必要があり、FTP サーバーからの全接続は、ネットワークパケットのフィルタリングルールを使用して正常にインターネットに転送される必要があることを意味します。

注記

パッシブ FTP 接続を有効にするには、ip_vs_ftp カーネルモジュールがロードされていることを確認します。これは、シェルプロンプトで管理ユーザーとして modprobe ip_vs_ftp コマンドを実行することで可能です。

3.5.3. ネットワークパケットフィルタルールの作成

FTP サービスの iptables ルールを割り当てる前に、「マルチポートサービスとロードバランサー」 で既存のネットワークパケットフィルタールールをチェックするためのマルチポートサービスおよびテクニックに関する情報を確認してください。
以下のルールは、ファイアウォールマーク 21 をFTP トラフィックへ割り当てます。

3.5.3.1. アクティブ接続のルール

アクティブ接続のルールは、ポート 20 (FTP データポート) 上で 内部 のフローティング IP アドレス宛の接続を許可および転送するようカーネルに指示します。
以下の iptables コマンドにより、LVS ルーターは IPVS が認識していない実サーバーからの外向けの接続を受け付けることが可能になります。
/usr/sbin/iptables -t nat -A POSTROUTING -p tcp -s n.n.n.0/24 --sport 20 -j MASQUERADE
この iptables コマンドの n.n.n は、keepalived.conf ファイルの virtual_server セクションで定義され、NAT インターフェースの内部ネットワークインターフェースに割り当てられるフローティング IP の最初の 3 つの値に置き換える必要があります。

3.5.3.2. パッシブ接続のルール

パッシブ接続のルールは、10,000 から 20,000 までの広い範囲のポートで、インターネットからフローティング IP アドレスへの接続に適切なファイアウォールマークを割り当てます。

警告

パッシブ接続でポート範囲を制限している場合、FTP サーバーである vsftpd を設定し、同じポートの範囲を使用するようにする必要があります。これには、以下の行を /etc/vsftpd.conf に追加します。
pasv_min_port=10000
pasv_max_port=20000
実際の FTP サーバーアドレスを上書きする pasv_address の設定は使用しないでください。LVS により仮想 IP アドレスに更新されるためです。
他の FTP サーバーの設定については、個別のドキュメンテーションを参照してください。
この範囲はほとんどの状況では十分なものです。しかし、以下のコマンド内の 10000:200001024:65535 に変更することで、利用可能な非保護ポートすべてを含めることができます。
以下の iptables コマンドは、適切なポート上のフローティング IP 宛のトラフィックにファイアウォールマーク 21 を割り当てます。これにより、IPVS で認識され、適切に転送されます。
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n.n/32 --dport 21 -j MARK --set-mark 21
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n.n/32 --dport 10000:20000 -j MARK --set-mark 21
この iptables コマンドの n.n.n.n は、keepalived.conf ファイルの virtual_server サブセクションで定義される FTP 仮想サーバーのフローティング IP アドレスに置き換える必要があります。
上記のコマンドは即座に有効になりますが、保存されていないとシステムの再起動後に保持されません。変更を保存するには、以下のコマンドを入力します。
# systemctl save iptables