web-dev-qa-db-ja.com

アプリケーション用にポートを予約するにはどうすればよいですか?

カスタムアプリケーション用にポートのリストを予約するにはどうすればよいですか?

具体的には、私が作成している製品には、多くのプロセスとそれらの間の相互通信がたくさんあります。

私が抱えている問題は、時々-OSが私のポートを盗むということです。まれですが、起こります。

これは、別のアプリケーションがポートを指定せずに ":: bind"を使用したことが原因である可能性があります。

または、バインドされていないソケットで ":: connect"を呼び出すと、自分のアプリケーションがポートを盗むことがあります。 manページからわかるように:

ソケットがまだローカルアドレスにバインドされていない場合、connect()は、ソケットのアドレスファミリがAF_UNIXでない限り、未使用のローカルアドレスであるアドレスにバインドします。

だから私の質問は、必要なポートを予約して、OSがそれらを使用しないようにすることはできますか?これは/ etc/servicesで実現できますか?それとも別の方法がありますか?

31
Michael Baker

技術的には、「予約済みポート」などはありません。

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

サーバーソフトウェアを作成している場合は、アプリケーションコードで必要なだけ早くソケットを特定のポートにバインドできます。システム管理者が衝突をすばやく特定し、競合するアプリケーションを別のサーバーに移動できるように、ポート番号を構成可能にするか、少なくともドキュメントに明確に記載してください。

15
Riccardo Murri

カーネルが49000と49001をクライアントに提供しないようにするために、Linux上のサーバーでそれらを使用したい。

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

/etc/sysctl.confにドロップしてから、sysctl -pを実行します。

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

参考文献

19
Hal Ashburner

実際、上記の答えは完全に正確ではありません。 sysctls net.inet.ip.portrange.firstおよびnet.inet.ip.portrange.lastは、OSがランダムポートに割り当てることができるポートの範囲を指定します。アプリケーション用に予約されているポートの範囲がこれらの変数に含まれないようにする必要があります。

FreeBSDハンドブックのセクション 12.14。カーネル制限のチューニング をご覧ください。しかし、同じ基本的な前提がLinuxにも適用されるはずです。

15
MattK