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
カーネルモジュールをロードする必要があります。以下のコマンドを管理者ユーザーとしてシェルで実行し、このモジュールを読み込み、再起動してモジュールが読み込まれることを確認します。
echo "ip_vs_ftp" >> /etc/modules-load.d/ip_vs_ftp.conf systemctl enable systemd-modules-load systemctl start systemd-modules-load
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:20000
を 1024: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 アドレスに置き換える必要があります。
上記のコマンドは即座に有効になりますが、保存されていないとシステムの再起動後に保持されません。変更を保存するには、以下のコマンドを実行します。
# iptables-save > /etc/sysconfig/iptables
システムの起動時に iptables サービスが開始されるようにするには、以下のコマンドを実行します。
# systemctl enable iptables
再起動時も変更が維持されていることを確認するには、以下のコマンドを実行して変更を確認してください。
# systemctl restart iptables