ソースポートはどのように決定され、特定のポートを使用するように強制するにはどうすればよいですか?



How Are Source Ports Determined



解決:

ローカルポートはどのように決定されますか

ポート番号は、TCP実装ソフトウェアによって、エフェメラルポートと呼ばれる一連のポート番号から選択されます。

使用するポート番号と範囲を選択するための正確なメカニズムは、オペレーティングシステムによって異なります。




63999にする方法はありますか?

これは、TCP実装ソフトウェアの構成を変更することで実行できます。

さまざまなオペレーティングシステム用にエフェメラルポート範囲を構成する手順については、「エフェメラルポート範囲の変更」を参照してください。



  • LinuxおよびWindowsの手順は、参照用に以下のこの回答に含まれています。

ただし、たとえば、範囲を単一のポートに制限することはお勧めできません。63999。

  • 実際、Windowsでは、これは次のようには不可能です。

    設定できるポートの最小範囲は255です。




エフェメラルポートの範囲

TCP / IPv4接続は2つのエンドポイントで構成され、各エンドポイントはIPアドレスとポート番号で構成されます。したがって、クライアントユーザーがサーバーコンピューターに接続する場合、確立された接続は、(サーバーIP、サーバーポート、クライアントIP、クライアントポート)の4つのタプルと見なすことができます。

通常、4つのうち3つはすぐにわかります。クライアントマシンは独自のIPアドレスを使用し、リモートサービスに接続するときは、サーバーマシンのIPアドレスとサービスポート番号が必要です。

すぐにはわからないのは、接続が確立されると、接続のクライアント側がポート番号を使用することです。クライアントプログラムが特定のポート番号を明示的に要求しない限り、使用されるポート番号は一時的なポート番号です。

エフェメラルポートは、マシンのIPスタックによって割り当てられる一時的なポートであり、この目的のために指定された範囲のポートから割り当てられます。接続が終了すると、エフェメラルポートを再利用できますが、ほとんどのIPスタックは、エフェメラルポートのプール全体が使用されるまでそのポート番号を再利用しません。

したがって、クライアントプログラムが再接続すると、新しい接続の側に異なるエフェメラルポート番号が割り当てられます。

ソースエフェメラルポート範囲


エフェメラルポート範囲の変更

Linux:

Linuxでは、ファイルを使用するだけで、エフェメラルポートの範囲を表示および変更できます。/ proc / sys / net / ipv4 / ip_local_port_range。たとえば、これはカーネル2.2システムのデフォルト構成を示しています。

$ cat / proc / sys / net / ipv4 / ip_local_port_range 1024 4999

これを優先範囲に変更するには、(スーパーユーザーとして)次のようにします。

#echo '49152 65535'> / proc / sys / net / ipv4 / ip_local_port_range

システムが起動するたびにこれを行う必要があることに注意してください。そのため、次のようなシステム起動スクリプトに必ず行を追加してください。/etc/rc.localなので、範囲は常に使用されます。

また、十分なカーネルメモリが利用可能な場合、Linux 2.4カーネルはデフォルトで32768〜61000の範囲になるため、新しいLinuxシステムでは範囲を変更する必要がない場合があることにも注意してください。

最後に、あなたが使用できるかもしれないことにも注意してくださいsysctlインターフェースを使用して、設定を変更するのではなく、/ procファイルシステム。の名前sysctlパラメーターは「net.ipv4.ip_local_port_range」です。編集する/etc/sysctl.confファイルがある場合、または起動スクリプトで実行する場合を使用してこのパラメーターを変更する場合は、sysctlコマンドを手動で使用しますsysctl。

Windows Vista / Windows Server 2008以降:

WindowsVistaおよびWindowsServer 2008の時点で、Microsoftサポート技術情報929851によると、Windowsはデフォルトで広い範囲(49152-65535)を使用するようになりました。同じ記事で、必要に応じて範囲を変更する方法も示されていますが、デフォルトの範囲は現在ほとんどのサーバーには十分です。

エフェメラルポート範囲を変更するソース

以下を使用して、WindowsVistaまたはWindowsServer2008コンピューターを実行しているコンピューターの動的ポート範囲を表示できます。netshコマンド:

netsh int ipv4 show dynamicport tcp netsh int ipv4 show dynamicport udp netsh int ipv6 show dynamicport tcp netsh int ipv6 show dynamicport udp

ノート:

  • 範囲は、トランスポートごと、およびIPのバージョンごとに個別に設定されます。
  • ポート範囲は、実際には開始点と終了点のある範囲になります。
  • Windows Server 2008を実行しているサーバーを展開しているMicrosoftのお客様は、ファイアウォールが内部ネットワークで使用されている場合、サーバー間のRPC通信で問題が発生する可能性があります。
  • このような場合は、ファイアウォールを再構成して、次の動的ポート範囲のサーバー間のトラフィックを許可することをお勧めします。49152から65535。
  • この範囲は、サービスおよびアプリケーションによって使用される既知のポートに追加されます。
  • または、サーバーが使用するポート範囲をサーバーごとに変更できます。

この範囲は、次のように、netshコマンド:

netsh int set dynamic start = number num = range

このコマンドは、TCPの動的ポート範囲を設定します。開始ポートはnumberで、ポートの総数はrangeです。以下にサンプルコマンドを示します。

netsh int ipv4 set dynamicport tcp start = 10000 num = 1000 netsh int ipv4 set dynamicport udp start = 10000 num = 1000 netsh int ipv6 set dynamicport tcp start = 10000 num = 1000 netsh int ipv6 set dynamicport udp start = 10000 num = 1000

これらのサンプルコマンドは、動的ポート範囲をポート10000で開始し、ポートで終了するように設定します。10999(1000ポート)。

ノート:

  • 設定できるポートの最小範囲は255。
  • 設定できる最小の開始ポートは1025。
  • 最大エンドポート(構成されている範囲に基づく)を超えることはできません65535。
  • Windows Server 2003のデフォルトの動作を複製するには、次を使用します。開始ポートとして1025を使用し、次に使用しますTCPとUDPの両方の範囲として3976。これにより、開始ポートは1025とのエンドポート5000。

ソースマイクロソフトサポート技術情報929851:

Windows XP以前:

古いWindowsオペレーティングシステム(Windows XP以前)の場合、Windowsはエフェメラルポート範囲として1024から4999の従来のBSD範囲を使用します。残念ながら、エフェメラルポート範囲の上限しか設定できないようです。マイクロソフトサポート技術情報196271から抜粋した情報は次のとおりです。

  • レジストリエディタを起動します(Regedt32.exe)。
  • レジストリで次のキーを見つけます。

    HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services Tcpip Parameters

  • [編集]メニューの[値の追加]をクリックして、次のレジストリ値を追加します。

    値の名前:MaxUserPortデータ型:REG_DWORD値:65534(例)

    有効範囲:5000-65534(10進数)デフォルト:0x1388(10進数で5000)

    説明:このパラメーターは、アプリケーションがシステムに使用可能なユーザーポートを要求するときに使用される最大ポート番号を制御します。通常、エフェメラル(つまり、短命)ポートは、の値の間に割り当てられます。1024および5000を含みます。

  • レジストリエディタを終了します。

注:除外範囲を設定できると主張する別の関連KB記事(812873)があります。これは、ポートを除外できることを意味する可能性があります。1024-9999(たとえば)エフェメラルポートの範囲を10000-65534。ただし、これを機能させることはできませんでした(2004年10月現在)。

エフェメラルポート範囲を変更するソース


デビッドポスティルの答えは完全に正しいです。エフェメラルポートの範囲を変更することを強調して、それに追加したいと思います Linux 非常に単純なので、OPには肯定的な答えがあります。

次のようにEPRを変更します。

echo '40000 60000'> / proc / sys / net / ipv4 / ip_local_port_range

次のスクリプトを使用して、(例として)ポート50000を選択できます。

OLD_RANGE = $(cat / proc / sys / net / ipv4 / ip_local_port_range)MY_PORT = 50000 echo '$ MY_PORT $ MY_PORT'> / proc / sys / net / ipv4 / ip_local_port_range sudo -u SomeUser SomeApplication&echo $ OLD_RANGE '> / proc / sys / net / ipv4 / ip_local_port_range

ここでの1つの注意点:範囲内に1つのポートがあるため、上記の3行目と4行目の実行の間に、別のアプリケーションがポートを奪う可能性があります。また、競合状態がない場合でも、大きなEPRを復元するまで、他のすべてのアプリケーションが麻痺します。そのため、できるだけ早く元の範囲を復元しました。

したがって、 もしも OPのオペレーティングシステムはLinuxでしたが、答えは簡単に実行できるというものでした。

驚くべきことに、これはBSDではそれほど単純ではなく、一部のBSDにはEPRのランタイムカーネル設定すらありません。 MacOS X、FreeBSD、OpenBSDではファイルを変更する必要があります /etc/sysctl.conf 、ただし、EPRにはさまざまな選択肢があります。

上記とOSに関係なく、何かが できる 行われることはそれを意味するものではありません すべきです やるべきこと:なぜ地球上でこれが必要なのですか?私は単一のユースケースを考えることはできません。