ネットワーク – ソースポートはどのように決定され、特定のポートを強制的に使用するにはどうすればよいのでしょうか?

networking port tcp

https://www.google.co.ukに接続すると、216.58.198.228:443に変わります。その後、私への接続が [My IP Address]:63998で開かれます

質問なのですが、63998のポートの選択方法と、強制的に63999にする方法はありますか?

  30  None  2016-08-29


ベストアンサー

ローカルポートはどのようにして決定されるのでしょうか

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

ポート番号と使用する範囲を選択する正確なメカニズムは、オペレーティングシステムに依存します


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

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

エフェメラルポート の範囲をさまざまなオペレーティングシステム用に設定する方法は、エフェメラルポート範囲の変更 にあります

  • LinuxとWindowsの説明書は、参考のために以下の回答に含まれています

ただし、63999のように、範囲を1つのポートに限定するのはよくありません

  • 実際には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 システムでは範囲を変更する必要はないかもしれないことに注意してください

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

Windows Vista/Windows Server 2008以降

Windows Vista および Windows Server 2008 の時点で、Windows は現在、Microsoft Knowledgebase の記事 929851 によると、デフォルトでは大きな範囲 (49152-65535) を使用しています。同じ記事では、必要に応じて範囲を変更する方法も紹介されていますが、現在ではほとんどのサーバーではデフォルトの範囲で十分です

出典 エフェメラルポートの範囲を変える

Windows VistaまたはWindows Server 2008を実行しているコンピュータでは、以下の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

Notes:

  • 範囲はトランスポートごと、IPのバージョンごとに個別に設定されています
  • ポート範囲は、始点と終点を持つ範囲になりました
  • Windows Server 2008が動作するサーバーを導入しているマイクロソフトのお客様は、内部ネットワークでファイアウォールを使用している場合、サーバー間のRPC通信に問題が発生する可能性があります
  • このような場合は、4915265535の動的なポート範囲のサーバー間のトラフィックを許可するようにファイアウォールを再設定することをお勧めします
  • この範囲は、サービスやアプリケーションによって使用されるよく知られたポートに加えて
  • あるいは、サーバが使用するポート範囲をサーバごとに変更することも可能です

この範囲を以下のようにnetshコマンドで調整します

netsh int <ipv4|ipv6> set dynamic <tcp|udp> 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ポート)で終了するように動的なポート範囲を設定します

Notes:

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

ソースMicrosoft Knowledgebaseの記事929851

Windows XP以降の方

古い Windows オペレーティングシステム (Windows XP とそれ以前) では、Windows は伝統的な BSD の範囲である 1024 から 4999 までのエフェメラルポートの範囲を使用しています。残念ながら、エフェメラルポートの範囲の上限を設定することしかできないようです。以下は Microsoft Knowledgebase の記事 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) には、除外範囲を設定することができると主張しているものがあります。しかし、これを動作させることはできませんでした (2004年10月現在)

出典 エフェメラルポートの範囲を変える

41  DavidPostill  2016-08-29


David Postill氏の回答は完全に正しい。私は、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

ここで一つ注意点があります: 範囲内に単一のポートがあるので、上記の3行目と4行目の実行の間に別のアプリケーションがそれを奪い取ってしまうかもしれません

このように、OPのOSがLinuxであれば、簡単にできるという答えが出ていたはずです

驚くべきことに、これは BSD 上ではそれほど簡単ではなく、いくつかの BSD 上では EPR のためのランタイムカーネルの設定さえありません。MacOS X、FreeBSD、OpenBSD では、/etc/sysctl.conf ファイルの変更が必要ですが、EPR については異なる選択肢があります

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

9  MariusMatutiae  2016-08-29


Linuxカーネルにもあることを付け加えておきましょう

net.ipv4.ip_local_reserved_ports

ノブは、多少反対のことをしますが、それにもかかわらず、それは非常に便利かもしれません

docsからの簡単な抜粋です

既知のサードパーティ製アプリケーション用に予約されているポートを指定します。これらのポートは、自動ポート割り当てでは使用されません (ポート番号 0 で connect() や bind() を呼び出した場合など)。明示的なポート割り当ての動作は変更されません

入力と出力の両方に使用されるフォーマットは、カンマで区切られた範囲のリストです (例: ポート 1,2,3,4,10,10 の場合は “1,2-4,10-10” となります)。ファイルに書き込むと、以前に予約されていたポートはすべてクリアされ、現在のリストは入力で与えられたもので更新されます

1  poige  2018-12-13


タイトルとURLをコピーしました