web-dev-qa-db-ja.com

サーバー用のエフェメラルポートの使用

一般に、エフェメラルポートは、サーバーとの接続を確立するときにクライアントによって使用されます。

例えば:

  1. サーバーはポート80でリッスンします
  2. クライアント(ブラウザ、FTPクライアント、bittorentクライアント)は、OSによって割り当てられたエフェメラルポートを含むリクエストをサーバーに送信します
  3. サーバーは、提供されたエフェメラルポートを宛先ポートとして使用して応答します

そして今の質問:

起動するたびにランダムな空きポートで起動したいサーバーアプリケーションを作成しました(この質問を一貫させるために、なぜこの動作が必要なのかは説明しません)。ここで私の質問は、サーバーがリッスンするためにエフェメラルポートの1つを使用した場合にどのような影響があるかということです。これを行うことの(セキュリティの観点からも)欠点はありますか?

実際にエフェメラルポートも利用しているサーバーの例を知っていますか?

私の懸念の1つは、TCP/IPガイド:包括的で図解されたインターネットプロトコルリファレンス (705ページ)からの声明でもあります。 :

既知の登録済みポート番号がサーバープロセスに使用されるのと同様に、エフェメラルポート番号はクライアントプロセス専用です。

4
PrimosK

エフェメラルポートでリッスンすると、 TCP自己接続 のリスクが発生する可能性があります。

1
Tom Seddon

ヘルプとして、 エフェメラルポート のウィキペディアページには、OSで実際に使用されているポート番号に関する詳細情報が記載されています。

これから、サーバー(プロセス)によって通常は使用されず、一時的な範囲にない利用可能なポートが多数あることがすぐにわかります。

したがって、明らかな解決策は、これらの他のポートの1つからランダムに選択することです。これにより、OSが一時的な範囲からどのように割り当てるかについて推測する必要がなくなります。新しい割り当ての衝突を回避するために、実際の使用をチェックするのか、それとも割り当てだけをチェックするのか。

その質問は些細なことに思えるかもしれませんが、クライアントポートでは、プロセスは通常、ポート番号を直接使用しません(プロセスが接続を開くときに割り当てられます。ソケットのプロパティを確認するだけで、プロセスは番号を見つけることができます。通常、これは完全に不要)。ただし、着信接続を受け入れるには、ソケットを特定のポートにバインドする必要があるため、サーバープロセスがポート番号を取得する必要があります。

1
Richard