アプリケーション用のポートをどのように予約しますか?

アプリケーション用のポートをどのように予約しますか?

私のカスタムアプリケーションのポートリストをどのように維持しますか?

具体的に私が作っている製品には多くのプロセスとプロセス間のコミュニケーションがたくさんあります。

私が経験している問題は、時々OSが私のポートを盗むということです。これはまれですが、実際に発生します。

これは、ポートを指定せずに「::bind」を使用する他のアプリケーションによるものです。

または、時にはバインドされていないソケットを使用して "::connect" を呼び出すと、アプリケーションがポートを盗みます。マニュアルページには次のものがあります。

ソケットがまだローカルアドレスにバインドされていない場合、connect()はソケットを未使用のローカルアドレスにバインドする必要があります(ソケットのアドレス系列がAF_UNIXではない場合)。

だから私の質問は、OSがそのポートを使用しないように必要なポートを予約できるかどうかということです。 /etc/servicesでこれを行うことはできますか?それとも別のアプローチがありますか?

答え1

Linuxのサーバーで使用しようとしているので、カーネルが49000と49001をクライアントに渡していないことを確認してください。

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

それを投げて/etc/sysctl.conf実行してくださいsysctl -p

これはテストされていないことに注意してください。

引用する

答え2

技術的に「予約済みポート」というものはありません。

TCP / UDPでポートを「予約」する唯一の方法は、実際にbind()そのポートのソケットを設定することです。バインドされたポートは他のアプリケーションでは使用されません。未使用のポートは使用されないため、他のアプリケーションで自由に使用できます。

サーバーソフトウェアを作成している場合は、アプリケーションコードでできるだけ早く特定のポートにソケットをバインドできます。ポート番号を設定可能にするか、少なくとも文書に明確に指定して、システム管理者が迅速に競合を識別し、競合するアプリケーションを別のサーバーに移動できるようにします。

答え3

実際、上記の答えは完全に正確ではありません。 sysctls net.inet.ip.portrange.firstおよびnet.inet.ip.portrange.lastは、オペレーティングシステムが任意のポートに割り当てることができるポート範囲を指定します。アプリケーションの予約済みポート範囲がこれらの変数の範囲に属していないことを確認する必要があります。

FreeBSD マニュアルの次のセクションを見てください。12.14。カーネル制限の調整。ただし、同じ基本前提をLinuxにも適用する必要があります。

関連情報