ネットワーク / ウェルノウン・登録済み・動的ポートの範囲

ネットワークのポート番号は0~65535です。IANAはウェルノウンポート(0~1023)、登録済みポート(1024~49151)、動的・プライベートポート(49152~65535)に分けています。これは番号の割り当て方法の分類であり、通信中のプログラムやファイアウォールで許可すべき通信を番号だけで判断することはできません。

ポート番号の三つの範囲

IANA(Internet Assigned Numbers Authority)は、サービス名とトランスポートプロトコル別のポート番号登録簿を管理しています。RFC 6335の範囲定義は次のとおりです。

区分 番号の範囲 意味
ウェルノウンポート
System / Well-Known Ports
0~1023 IANAの厳格な手続きを通じてサービス用番号を割り当てる範囲
登録済みポート
User / Registered Ports
1024~49151 サービス用番号をIANAに登録し、割り当てを受ける範囲
動的・プライベートポート
Dynamic / Private Ports
49152~65535 IANAがサービス識別子として割り当てないローカル・動的利用の範囲

登録済みポートという名前でも、範囲内のすべての番号が登録されているわけではありません。割り当て済み、未割り当て、予約済みを区別します。0も数値範囲には含まれますが、IANA登録簿ではTCP・UDPともに予約済みで、通常のサービス用ポートの例には適しません。

番号とTCP・UDPを併せて確認する理由

IPアドレスが通信元や通信先のアドレスを示すのに対し、ポートはそのアドレスで通信を処理するサービスやソケットの区別に使います。TCP(Transmission Control Protocol、伝送制御プロトコル)とUDP(User Datagram Protocol、ユーザーデータグラムプロトコル)は別々のポート番号空間を持ちます。TCP 53とUDP 53は同じ数字でも別に確認する必要があります。

代表例はHTTPのTCP 80、HTTPSのTCP 443、SSH(Secure Shell)のTCP 22です。DNS(Domain Name System)はTCPとUDPの53を使います。登録済み範囲にはMySQLのTCP 3306やリモートデスクトップのTCP 3389があります。これは代表的な用途であり、登録プロトコル全体や実際の設定を示すものではありません。

サーバーが別の番号で待ち受けたり、同じ番号を別のプログラムが使ったりする場合があります。TCP 3306が開いているだけで、MySQLの実行や安全な通信が確認できるわけではありません。IANAも、登録が製品を保証したり、通信が登録サービスに一致すると保証したりするものではないと説明しています。

サーバーポートとクライアントの一時ポート

クライアントがサーバーのTCP 443へ接続しても、両側で443を使うとは限りません。以下は送信元ポートに51514が選ばれた架空の接続例です。実際の番号はOSと接続によって変わります。

TCP: client:51514 -> server:443
TCP: server:443 -> client:51514

サーバーの443はサービスへ接続する宛先ポート、クライアントの51514はその通信に使うローカルの一時ポートです。応答では送信元と宛先が逆になります。TCP接続はプロトコルと両側のIPアドレス・ポートの組み合わせで区別されるため、「一つのポートに一つの接続だけ」とは解釈できません。

動的・プライベートの「プライベート」は、プライベートIPアドレスや外部からの遮断を意味しません。また、その番号が常に空いているわけでもありません。端末や途中のNAT(Network Address Translation、ネットワークアドレス変換)でアドレス・ポートが変換されると、観測場所によって接続情報が異なる場合があります。

OSの実際の一時ポート範囲を確認する

IANAの動的範囲とOSが自動選択する一時ポート範囲を区別します。Microsoftの動的ポート範囲の説明はWindows Vista・Server 2008以降の既定値を49152~65535としていますが、現在の端末設定は直接確認するのが確実です。

WindowsではPowerShellまたはコマンドプロンプトで以下を実行します。IPv4・IPv6とTCP・UDPをそれぞれ確認する照会で、設定は変更しません。

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp

出力の開始ポートとポート数を確認します。開始49152、個数16384なら、最後は49152 + 16384 - 1 = 65535です。個数を最後の番号と取り違えないでください。これは自動選択範囲であり、すべての番号の空き状況を保証するものではありません。

Linuxでは以下のファイルでローカルポート範囲を確認できます。実際に通信を行うLinux環境で実行してください。

cat /proc/sys/net/ipv4/ip_local_port_range

二つの整数は開始番号と終了番号です。Linuxカーネルのip_local_port_rangeの説明は既定値を32768と60999としていますが、ディストリビューションや環境設定によって異なります。予約ポートの設定なども自動割り当てに影響するため、範囲内のすべてが常に選択可能とは限りません。

接続障害やファイアウォール設定の確認順序

  1. 対象とプロトコルを決めます。サーバーのIPアドレス、TCPかUDPか、宛先ポートを整理し、IANAの番号とサービスの実設定を照合します。
  2. 待ち受け先を確認します。プログラムが動いていても、別ポートやローカルアドレスだけで待ち受けている場合があります。導入済みと、目的のアドレス・ポートで待ち受け中を区別します。
  3. 通信経路を調べます。OS・ネットワークのファイアウォール、クラウドの規則、ポート転送とNATを確認します。方向、送信元、宛先を定め、一時ポート範囲が分かっただけで全範囲を公開しないでください。
  4. 実際のアプリで確認します。TCP接続成功だけでは認証や機能の正常性は証明できません。TCPの試験結果をUDPに適用せず、サービスに合う方法で確認します。