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通信に問題が発生する可能性があります
- このような場合は、
49152
~65535
の動的なポート範囲のサーバー間のトラフィックを許可するようにファイアウォールを再設定することをお勧めします- この範囲は、サービスやアプリケーションによって使用されるよく知られたポートに加えて
- あるいは、サーバが使用するポート範囲をサーバごとに変更することも可能です
この範囲を以下のように
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