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


29

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

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

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

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

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

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

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


1
代わりにAF_UNIXソケットを使用できますか?
アレックス

2
なぜ自分のアプリケーションが「ポートを盗む」のか心配ですか?
EightBitTony

ソフトウェアを調べて、各接続のクライアント側を特定のポートにバインドする必要があるかどうかを議論していました。私のアプリケーションには多くの接続パスがあるため、これを更新するのは非常に仕事です。OSでポートを予約することは、これを行う時間を見つけるまで、ストップギャップの解決策として適切でした。
マイケルベイカー

SELinuxEnforcingモードで要件を満たすことができるかどうかはわかりませんが、まだ学習中です。したがって、推測にすぎないかもしれませんが、のようなポートSELinux予約するための独自のポリシーを定義できますmy_server_port_t tcp 1111, 2222, 3333, 4444-4600。アプリケーションが(サーバーアプリケーションではなく)どこでも実行される場合、SELinuxオンまたはオフを制御できないのではないでしょうか。
LiuYan刘研

「盗む」とは、サードパーティアプリが0へのバインドを要求し、OSが選択したポート番号をランダムに割り当てたため、サードパーティアプリがチャンスを得る前に選択したポート番号にバインドしていることを意味すると思いますサードパーティのアプリ。その場合は、unix.stackexchange.com / a / 38724/27865
Mark

回答:


14

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

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

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


1
また、可能な場合は、既知/予約済みポートの使用を避けてください。
EightBitTony

時々予約ポートがあります。これは良い一般的なアドバイスですが、Linuxでの正しい答えではありません。
ジェイソンニュートン

18

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

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

それをドロップし/etc/sysctl.conf、実行しsysctl -pます。

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

参照資料


これを試してみましたが、自分のアプリケーションがポートを使用することもできませんでした!の名前でポート番号を定義するのはどう/etc/servicesですか?

@ user134197これにより、バインド要求でゼロ以外のポート番号を明示的に使用する場合、独自のアプリケーションがこれらのポートを使用することを妨げないはずです。わたしにはできる。
マークラカタ

15

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

FreeBSDハンドブックのセクション12.14をご覧ください。カーネル制限の調整。しかし、同じ基本的な前提がLinuxにも当てはまるはずです。


また、このリンクは役に立つかもしれません: stackoverflow.com/questions/913501/…–
MattK

3
私は、Linuxでそれが呼び出されると思うnet.ipv4.ip_local_port_range
ブライアン・ゴードン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.