ランダムポート生成

任意の範囲でランダムな TCP/UDP ポート番号を生成します。よく知られたサービスや使用頻度の高いポートを自動的に除外し、ローカルサービスの衝突を防ぎます。

自分のマシンで誰も欲しがらなさそうなポート番号を。 必要な個数と抽出する範囲を選んでください。よく知られたサービスのポートは既定で除外されるため、得られた番号がすでに動いている何かと衝突する可能性は低くなります。

衝突しないポート番号の選び方

ポート空間の区分

TCP/UDP のポートは 16 ビットの数値なので、使える範囲は 0 から 65535 です。IANA はこの空間を 3 つに分けています。0 から 1023 はシステムポート(ウェルノウンポート)で、80 番の HTTP や 22 番の SSH といった標準サービス用に予約されており、Unix 系システムではバインドに root か明示的なケーパビリティが必要です。1024 から 49151 は登録済みポートで、申請に応じて特定のアプリケーションへ割り当てられます。5432 番の PostgreSQL や 3306 番の MySQL はここに属します。49152 から 65535 は動的ポート(エフェメラルポート)の範囲で、クライアント側の一時的な割り当てのために予約されています。

ローカル開発用サービスにとって最適なのは、特権ブロックとエフェメラルブロックの両方を避けた 1024 より上の登録済み範囲です。このツールが既定の下限を 1024 にしているのはそのためです。49152 未満に留めることは見た目以上に重要です。プログラムが外向きの接続を開くたびに OS がエフェメラル範囲から番号を取るため、そこに置いたサービスは再起動後にポートが埋まっていることがあります。

よく知られたポートを避ける意味

ランダムであるだけでは衝突は防げません。ランダムな抽選は 3306、5432、6379、8080 に当たることも十分あり得ますが、稼働中の開発マシンではまさにそれらが最も占有されやすい番号です。ここで使う除外リストは、古典的な Unix サービス、一般的なデータベースとメッセージブローカー、そして Node ツールの 3000 やローカル HTTP サーバーの 8000・8080 のような人気フレームワークの既定値を網羅しています。

除外のコストはほぼゼロで——候補は依然として数万件あります——「ポートは既に使用されています」というエラーの最も一般的な原因を取り除けます。あえてそれらの番号が欲しい場合はオプションを外せば全範囲が戻ります。

これは確率的な補助であって予約ではない点に注意してください。ツールはあなたのマシンを調べられないため、何かが待ち受けているかどうかは分かりません。本当に空いているかを確かめるには、macOS や Linux では lsof -i :ポート、新しめの Linux では ss -ltnp、Windows では netstat -ano | findstr :ポート で確認してください。

コンテナと CI におけるポート

コンテナや CI の環境では前提が変わります。コンテナ内部のポート空間は通常プライベートなので、2 つのコンテナが同時に 8080 を待ち受けても衝突しません。衝突リスクはホスト側に移り、公開されたポートは 1 つの名前空間を共有します。ホスト側のポートをランダムに選び、固定のコンテナポートへマッピングするのは、同じサービスの複数コピーを並べて動かす一般的な手法です。

多くの CI システムやオーケストレーションツールは別の方法で解決します。カーネルに空きポートを尋ねるのです。ポート 0 にバインドすると OS が未使用のポートを割り当て、どれを選んだか教えてくれます。これは競合状態がなく常に正しいため、実行時にポートを渡せるプログラムではこちらを優先してください。ここで生成するような番号は、何も動いていない段階で設定ファイル、docker-compose のマッピング、チームのドキュメントに書き込む安定した値が必要なときに適しています。

オープンソースに関する注記:バニラ JavaScript で実装。サードパーティライブラリは使用していません。

よくある質問

なぜ範囲は既定で 1024 から始まるのですか?
Unix 系システムでは 1024 未満は特権ポートで、バインドに通常 root が必要です。1024 から始めることで、一般ユーザーアカウントでも使える結果になります。
49152 より上のポートは避けるべきですか?
長期間動かすサービスでは通常避けるべきです。その範囲は OS がエフェメラルなクライアントポートを取る領域なので、そこに置いたサービスは再起動後に番号が奪われていることがあります。
このツールはポートが実際に空いているか確認しますか?
いいえ。ページは完全にブラウザ内で動作し、システムを調べることはできません。番号を確定する前に `lsof -i :ポート`、`ss -ltnp`、`netstat -ano | findstr :ポート` で確認してください。
除外オプションはどのポートを外しますか?
古典的な Unix サービス、MySQL・PostgreSQL・Redis・RabbitMQ・MongoDB・Elasticsearch などの一般的なデータベースやブローカー、そして 3000・8000・8080・8443 といった人気フレームワークの既定値です。
乱数は暗号学的に安全ですか?
ブラウザが提供している場合は Web Crypto API を使い、分布が均一になるよう棄却サンプリングを行います。Crypto が利用できないときだけ Math.random にフォールバックします。
TCP ポートと UDP ポートの違いは何ですか?
それぞれ 65536 個のエントリを持つ別々の空間なので、TCP 8080 と UDP 8080 は無関係で、異なるプログラムが同時に使えます。このツールが生成する番号はどちらにも使えます。