カスタムアプリケーション用にポートのリストを予約するにはどうすればよいですか?
具体的には、私が作成している製品には、多くのプロセスとそれらの間の相互通信がたくさんあります。
私が抱えている問題は、時々-OSが私のポートを盗むということです。まれですが、起こります。
これは、別のアプリケーションがポートを指定せずに ":: bind"を使用したことが原因である可能性があります。
または、バインドされていないソケットで ":: connect"を呼び出すと、自分のアプリケーションがポートを盗むことがあります。 manページからわかるように:
ソケットがまだローカルアドレスにバインドされていない場合、connect()は、ソケットのアドレスファミリがAF_UNIXでない限り、未使用のローカルアドレスであるアドレスにバインドします。
だから私の質問は、必要なポートを予約して、OSがそれらを使用しないようにすることはできますか?これは/ etc/servicesで実現できますか?それとも別の方法がありますか?
技術的には、「予約済みポート」などはありません。
TCP/UDPでは、ポートを「予約」する唯一の方法は、実際にポートへのソケットをbind()
することです。バインドされたポートは他のアプリケーションでは使用されません。未使用のポートはまあ、未使用なので、他のアプリケーションが自由に使用できます。
サーバーソフトウェアを作成している場合は、アプリケーションコードで必要なだけ早くソケットを特定のポートにバインドできます。システム管理者が衝突をすばやく特定し、競合するアプリケーションを別のサーバーに移動できるように、ポート番号を構成可能にするか、少なくともドキュメントに明確に記載してください。
カーネルが49000と49001をクライアントに提供しないようにするために、Linux上のサーバーでそれらを使用したい。
sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001
/etc/sysctl.conf
にドロップしてから、sysctl -p
を実行します。
これはテストされていないことに注意してください。
実際、上記の答えは完全に正確ではありません。 sysctls net.inet.ip.portrange.firstおよびnet.inet.ip.portrange.lastは、OSがランダムポートに割り当てることができるポートの範囲を指定します。アプリケーション用に予約されているポートの範囲がこれらの変数に含まれないようにする必要があります。
FreeBSDハンドブックのセクション 12.14。カーネル制限のチューニング をご覧ください。しかし、同じ基本的な前提がLinuxにも適用されるはずです。