whyすべてのFTPサーバーでパッシブモードのデータチャネルにport rangeを使用する必要があるので、すべての着信に1つのデータポートだけを使用するのではなく、把握するのに苦労していますデータチャネル接続。
FTPサーバーは、ポート21で同時に接続されている多くのクライアントを処理します。Webサーバーは、ポート80で同時に接続されている多くのクライアントを処理します。
では、FTPサーバーがすべての着信パッシブデータ接続に1つのデータチャネルポートしか使用できないのはなぜですか(そのポートで同時に接続されている多数のクライアント(ポート1024など)を処理できる)はなぜですか?
それともできますか?
これが不可能または推奨されない理由の技術的な詳細を知りたいです。
データポートを1つのポートにのみロックする場合の複数の同時FTPセッションの問題に関する明確で技術的な説明は、私が最も深く知りたいものです。いつ機能するか、いつ機能しないか、なぜ推奨されないかなど。
これは大まかな推測になります。私はテストしていないため、自分で試してみて、他に見逃していない問題があるかどうかを確認してください。
パッシブポートの範囲を1つのポートに制限することもできますと思います。実際、あなたは この質問 でそれを見ることができます実際には小さなポート範囲が使用されます。理論的には、複数の同時接続をサポートするには、ローカルIP、ローカルポート、リモートIP、リモートポートの4つの値のみが一意である必要があります。これは、異なる接続を識別する方法です。
サーバーのポートを1つの値にロックダウンした場合、残っている唯一の変数は、クライアントが使用するポートです。これには、クライアントに十分な空きプールがある限り、問題はありません ephemeral から選択できます。重いNATを実行しているのでなければ、これについて心配する必要はありません。 ここで、これは純粋に理論的なものになることに注意してください:サーバーで複数のポートを使用している場合、_number of ports in range
_接続ごとに1つのポートのクライアント側。しかし、これをサポートするFTPクライアントの実装が疑われるため、実際には起こりません(あまり意味がないため)。さらに、クライアントがこのようにエフェメラルポートを共有する必要があり、新しいポートを単に開くことができない場合、対処する必要のあるはるかに深刻な問題があります。したがって、この観点からは、単一のポートを使用して完全に安全である必要があります。
単一のポートでは不十分な理由と考えてみましょう。
まず、本当にバグの多いFTPサーバーの実装では、クライアントのデータ転送を識別する方法としてローカルポート番号のみを使用するという状況が考えられます。繰り返しますが、適切なFTPdでそれができるとは思いません。
本当の問題(はい、あなたは主要な余談として上記すべてを無視することができます;-))それはパッシブポート範囲が非特権範囲。
つまり、選択したポート番号は予約されていませんそれ自体、そして実際には任意のユーザープロセス(必要ない) root権限)は、FTPサーバーが取得する前に取得できます。選択できるポートのプールが豊富にある場合は、ランダムな空きポートを取得します。 1つだけを使用することにバインドされていて、それがすでに使用されている場合は、転送を適切に処理できません。
申し訳ありませんが、答えが少し投機的であると思われる場合。正直なところ、理由を突き止めようと努力しました単一のポートを使用してはいけない理由、そして最後のビットは別として、それに対する確固たる証拠は考えられませんでした。それにもかかわらず、あなたが提起する興味深く、挑戦的な質問。
FTPは2つの別々の接続に依存しています。1つは制御またはコマンドストリーム用で、もう1つはデータファイルとディレクトリリストなどの他の情報を渡すためです。制御ストリームは従来のTCP接続を介して伝送されます。クライアントは特権のない高いポートにバインドし、ポート21にバインドされているFTPサーバーに接続要求を送信します。この接続は、コマンドを渡します。
ポートモードまたはアクティブモードでは、クライアントはサーバーに、待機するセカンダリの非特権ポートを通知します。次に、サーバーはポート20からクライアントが指定した非特権ポートへのデータ接続を開始します。
クライアントがWebブラウザーの場合、新しいメカニズムであるパッシブモードがデフォルトです。サーバーはポート20に拘束される代わりに、データ転送に使用するハイポートをクライアントに通知します。次に、データはクライアントとサーバーの間の非特権ポートを介して送信されます。
詳細については、以下を参照してください。
http://tools.ietf.org/html/rfc959
[〜#〜]編集[〜#〜]
サーバーを特定の単一ポートにロックすることに関しては、一部のサーバーでは可能である場合があります。たとえば、vsftpdでは、次の構成オプションがあります。
pasv_max_port
The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.
Default: 0 (use any port)
pasv_min_port
The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.
Default: 0 (use any port)
両方のポートを同じに設定した場合、たとえば、 pasv_max_port = 12345、pasv_min_port = 12345を使用すると、目的を達成できる場合があります。これにより、サーバーがサポートする同時FTPセッションの数が制限されると思います。確認してください。
FTPサーバーmight使用されるポート番号ではなく、ソースIPのみに基づいて、クライアントのデータポート接続を制御ポート接続に一致させることができます。
これは [〜#〜] fxp [〜#〜] (これは悪いことではないかもしれません)を壊し、クライアントは2つのサーバー(1つはパッシブモード)に接続し、その後、パッシブサーバーのPORT情報。アクティブモードサーバーがパッシブモードサーバーに接続できるように、それをPORTコマンドとしてアクティブモードサーバーに渡します。
I suspect多くのサーバーは、クライアントがパッシブモードを要求するまでデータソケットを作成しません。その場合、2つのクライアントが同時にパッシブモードを要求した場合、作成されるソケットには一意のポート番号が必要になります。
[〜#〜] edit [〜#〜]:FTPサーバーがこれを行わないもう1つの理由:サーバーが複数のユーザーに通知できなかった同じIPアドレスが離れている。
ポート21または80(よく知られているすべてのポートと同様)には、クライアントが使用するプロトコルを設定するプロトコルがあります。このようにして、サーバーは接続先を認識します。データ接続ポートには、プロトコルはありません。サーバーが知っているのは、その接続で唯一のことですが、接続するポート番号だけです。
毎回同じポートに接続すると、サーバーは接続先のファイルを判別できなくなります。ポート番号は、制御接続の転送要求とデータ接続の間のリンクとして機能します。
2つのクライアントが同時に転送を要求した場合、サーバーが単一のポートで接続を受け入れると、サーバーは転送するファイルを通知できません。もちろん、サーバーは決定にクライアントIPを使用できます(実際には、多くのFTPサーバーは、クライアントIPがセキュリティのために制御接続で使用されているIPと一致することを検証します)。
しかし、これはうまくいきません:
FTPデータ接続の再利用 も参照してください。