私はFTPモードのアクティブとパッシブの種類について調べていましたが、現在のシナリオに関するいくつかの質問に少し混乱しています。
シナリオ: 組織が使用するクライアントとして Android デバイスがあり、その組織はサーバーやサーバー上のデータなどのセキュリティについて非常に懸念しています。良い例としては銀行のサーバーがあります。
現在、1,000 ~ 1,500 台の Android デバイスを所有できます。各デバイスはダウンロード アイテムのリストを取得し、各デバイスはリストを 1 つずつ反復処理してそのアイテムをダウンロードし、アイテムごとに新しい接続を作成します。
さて、上記の FTP 使用例におけるセキュリティとデバイスの数に関する懸念について考えてみると、次のような疑問が湧いてきます。
アクティブモード: 私の理解によれば、アクティブ モードを使用する必要があると思います。これは、クライアントの Android デバイスがコマンドとデータ接続の両方を開始するため、サーバー上で複数のポートを開くことに関する組織上の懸念に対処します。しかし、一方で、サーバーはアクティブ モードで単一のポートから 1000 ~ 1500 台のデバイスを送信するためにデータ チャネルを送信または開くことができますか? 失敗しませんか?
パッシブモード: パッシブ モードについて考える場合、セキュリティが重視される組織で複数のポートを開くことに関する懸念を考慮する必要があります。また、最悪の場合、1,000 ~ 1,500 台の Android デバイスに対してパッシブ モード用にいくつのポートを開く必要があるでしょうか。ファイルのダウンロードのシナリオは上記で説明しました。
答え1
FTP は 1 つの制御 TCP 接続と 1 つ以上のデータ接続を使用しています。
制御接続は、クライアントとサーバーの間で何をすべきか、何が起きているかに関するメッセージを転送するために使用されます。データ接続は、データを転送するために使用されます。基本的に、クライアントは制御接続でサーバーに「そのファイルをください」と伝え、サーバーはファイルのバイトをデータ接続に送信します。
ご質問はセキュリティに関するものなので、ここでもう少し詳しく説明します。TCP 接続は、クライアントが TCP SYN をサーバーに送信することで「開かれます」。これらの SYN は通常、ファイアウォール ルールの対象です。例: <ALL_IPS_IN_THE_INTERNET> がポート 21 で <MY_FTP_SERVER> に接続できるようにします。
FTP アクティブ モードでは、クライアントが制御接続を開き、サーバーがデータ接続を開く IP とポートをサーバーに伝えます。
FTP パッシブ モードでは、クライアントが制御接続を開き、サーバーがクライアントにデータ接続を開く IP とポートを指示します。
FTP アクティブ モードは、クライアントが NAT ルーターの背後にあり、複数のクライアント間で 1 つのパブリック IP アドレスを共有している場合に問題になります。クライアントは自身のプライベート IP アドレスしか認識しておらず、ルーターのパブリック IP を特定して FTP サーバーに送信できたとしても、サーバーが IP に接続しようとすると、多くのクライアントが背後にいる状態で要求がルーターに到着し、どのクライアントに SYN を転送すればよいかがわかりません。
この問題の解決策は、ディープ パケット インスペクションです。ルータは、制御接続がポート 21 に送信されることを認識し、接続を調べます。クライアントがサーバーにデータ接続を開くポートを指示すると、ルータは FTP サーバーからのパッケージ用にそのポートに一時的なポート転送を追加します。ルータは、制御接続が閉じられるとポート転送を無効にします。
セキュリティを気にしない限り、それは素晴らしいことであり、良いことです。つまり、それは悪いことです。機密データを認証または転送するときは、常に暗号化を使用してください。
暗号化すると、ルータは制御接続を監視できなくなり、アクティブ モードの FTP クライアントに対して動的ポート転送を作成できなくなります。
両方の接続がクライアントによって開かれるため、この問題は FTP パッシブ モードによって解決されます。
しかし、これによって別の問題が発生します。クライアントの問題ではなく、サーバーのファイアウォール管理者の問題です。パッシブ モードでクライアントが接続するポートはランダムなため、結果として生じるファイアウォール ルールは次のようになります。ポート 21 およびポート 1024 ~ 65535 で <ALL_IPS_IN_THE_INTERNET> が <MY_FTP_SERVER> に接続するのを許可します。適切な FTP サーバー デーモンがある場合は、データ接続に使用するポートの範囲を構成して、ファイアウォールを少し改善することができます。ポート 21 およびポート 20000 ~ 21500 で <ALL_IPS_IN_THE_INTERNET> が <MY_FTP_SERVER> に接続するのを許可します。これにより、1500 の同時データ接続が可能になります。
それも可能ですが、お勧めしません。FTP よりも優れた代替手段である HTTP があります。
- HTTP は制御接続とデータ接続を使用していませんが、これは大きな欠点がない利点です。
- HTTPは、セキュリティデバイス/ファイアウォール/Webアプリケーションファイアウォールなどで十分にサポートされています。これらの製品は、クライアントのSSL接続を中間者攻撃したり、HTTPSでコンテンツフィルタリングを実行したりすることもできます。
- ほとんどの HTTP サーバーは、ディレクトリ リストをサーバーするように構成できます。
- すべての HTTP サーバーはダウンロードをサポートしており、そのほとんどは再開も可能です。
- HTTPクライアントライブラリはAndroidおよびiPhoneデバイスですでに利用可能です
したがって、クライアントを次のように実装します。
- ダウンロード可能なすべてのファイルをリストするように設定された URL のディレクトリ リストを取得します。
- ファイルをダウンロードする
HTTP はアップロードと失敗したアップロードの再開もサポートします。
ここで HTTP をうまく売り込めたらいいなと思います。FTP は悪だからです。
編集: vsftpd の PASV モードの動作における最大接続数を表示する優れた投稿へのリンクを追加します。https://serverfault.com/questions/563582/passive モードでの vsftp の接続数