ポート番号とは?TCP/UDPの違い・エフェメラル・NAT・運用とセキュリティ完全ガイド

ポート番号とは何か — 基本の理解

ポート番号は、IPネットワーク上で動作するプロセスやサービスを識別するための番号です。IPアドレスが「どのホスト(どの機器)に接続するか」を示すのに対して、ポート番号は「そのホスト上のどのアプリケーション/サービスと通信するか」を示します。TCP/IPスタックを使った通信では、IPアドレス+ポート番号の組(エンドポイント)によって個々の通信が区別されます。

TCPとUDPとポートの関係

  • TCP(Transmission Control Protocol)では、コネクション指向の通信が行われ、コネクションは(送信元IP, 送信元ポート, 宛先IP, 宛先ポート, プロトコル)で一意に識別されます。TCPポートはコネクションの終端を示し、通信の開始(SYN)時に使われます。

  • UDP(User Datagram Protocol)はコネクションレス。ポート番号は単に宛先アプリケーションの識別子として使われますが、信頼性やコネクション管理はTCPと異なります。

  • 同じポート番号でも、TCP用とUDP用は別個に管理されます(例:TCP/53とUDP/53は別々の用途に使われうる)。

ポート番号の範囲とカテゴリ(IANA準拠)

ポート番号の範囲は0〜65535(16ビット)です。IANA(Internet Assigned Numbers Authority)はポート番号を以下の3つに分類しています(RFC 6335に準拠)。

  • Well-Known Ports:0〜1023 — 一般に知名度の高いサービス(例:HTTP 80、HTTPS 443、SSH 22)が割り当てられます。Unix系システムではこれらのポートのうち1024未満へバインドするには管理者権限(root)が必要とされることが多いです。
  • Registered Ports:1024〜49151 — アプリケーションベンダーやサービスがIANAに申請して登録することで割り当てられます(例:MySQL 3306、RDP 3389など)。
  • Dynamic/Private Ports:49152〜65535 — 一時的(エフェメラル)な用途やプライベートな利用に使われます。オペレーティングシステムはここから動的に送信元ポートを割り当てることが多いです。

エフェメラル(動的)ポートとOS差分

送信元ポートとしてOSが自動的に割り当てるポートをエフェメラルポートと呼びます。IANAのカテゴリ(49152–65535)を基準とするのが一般的ですが、実際のデフォルト範囲はOSやバージョンで異なります。

  • Windows(Vista以降):49152–65535 がデフォルト
  • 多くのLinuxディストリビューション:/proc/sys/net/ipv4/ip_local_port_range により通常 32768–60999 や 32768–61000 のように設定されていることが多い(カーネルやディストリの設定で変化)
  • macOS:49152–65535(近年の設定)

これらは設定で変更可能で、サーバで大量接続を扱う際に重要となる(エフェメラルポート枯渇の対策など)。

ソケットAPIとポート(プログラマ視点)

  • プログラミングでは、ソケットAPI(BSD socket等)で bind(), listen(), connect() といった呼び出しを使い、ポート番号を指定して通信を行います。サーバは通常特定のポートに bind して listen し、クライアントは任意のエフェメラルポートを使って connect します。

  • ネットワークバイトオーダー(big-endian)での扱いに注意。APIでは htons() などで変換するのが一般的です。

  • 同じホスト上でも、異なるプロセスが同一ポートにバインドすることは通常できません(ただし SO_REUSEADDR や SO_REUSEPORT の挙動に注意)。

NATとポートフォワーディング(ポートとアドレス変換)

プライベートネットワークからインターネットへ出る際、多くの環境でNAT(Network Address Translation)が使われます。ここで「ポート番号」は重要な役割を果たします。NATは内部IP:内部ポート と グローバルIP:グローバルポート を対応付け(例:PAT - Port Address Translation)、多数の内部ホストが1つのグローバルIPを共有できます。

また、外部から内部の特定サービスに到達させるためにポートフォワーディング(ポートマッピング)を設定することがあります。クラウド環境ではセキュリティグループやファイアウォールでポート開放を管理します。

ファイアウォール、ACL、セキュリティ上の注意

  • ポートはサービスの入口であり、公開すべきでないポートを開けることは攻撃面を増やします。最低限必要なポートだけを開け、他はブロックするのが基本です。

  • ポート番号を変える(例:SSHを22から別ポートへ移す)だけではセキュリティ上の強化には限定的です。ポートスキャンは容易で、必ず認証・暗号化(例:TLS/SSH)やアクセス制御(IP制限、認証の強化)を組み合わせましょう。

  • ポートスキャン対策や検知(IDS/IPS、ログ監視)、レートリミット、Fail2ban等の自動ブロックも有効です。ポートノッキングやホニーポットの活用は運用次第で有効なことがありますが、複雑さを増す点に留意してください。

よく使われる主要ポート一覧(例)

  • 20/21 TCP — FTP(データ/制御)

  • 22 TCP — SSH

  • 23 TCP — Telnet(非推奨)

  • 25 TCP — SMTP(メール送信)

  • 53 TCP/UDP — DNS(UDPが一般的、ゾーン転送はTCP)

  • 80 TCP — HTTP

  • 110 TCP — POP3、143 TCP — IMAP

  • 443 TCP — HTTPS(HTTP over TLS/SSL)

  • 3306 TCP — MySQL

  • 3389 TCP — RDP(リモートデスクトップ)

(注:サービスによりUDPを使うこともあるため、運用時はTCP/UDPの両方を確認してください。)

運用上の実践的ポイント

  • /etc/services(Unix系)やIANAの登録情報で、どのポートがどのサービスに割り当てられているか確認できます。

  • サーバ運用では netstat、ss、lsof、ssコマンド等で現在バインドされているポートを確認します。クラウドではセキュリティグループやACLも合わせてチェックしてください。

  • 大量の同時接続を扱う場合は、エフェメラルポートの範囲やTIME_WAITの挙動(TCPの再利用)を理解し、必要ならカーネルパラメータ(例:tcp_tw_reuse 等)やアプリケーション設計を見直しましょう。ただし、低レイヤのパラメータ変更は副作用があるため慎重にテストしてから。

  • セキュリティ観点では、不要なデーモンを停止し、必要なサービスだけを限定公開、TLSの導入、最新パッチの適用、ログ収集と監視が重要です。

よくある誤解と補足

  • 「ポート=プロセス」ではありません。ポートはホスト上の通信の宛先を示す識別子で、複数のプロセスが同一ポートを共有することは通常できません(特殊な設定を除く)。

  • 「非標準ポートに移せば安全」も誤解です。セキュリティの基本は認証・暗号化・アクセス制御であり、ポート移動は単にスクリプトキディの自動スキャンを躱す程度の効果しかありません。

  • IPv6でもポートの考え方はIPv4と同じ(ポート番号は同じ16ビット)です。

まとめ

ポート番号はネットワーク上でどのアプリケーションと通信するかを指定する重要な要素です。IANAによる分類(Well-Known、Registered、Dynamic)やTCP/UDPの違い、OSごとのエフェメラルポートの扱い、NAT/ポートフォワーディング、ファイアウォール/セキュリティ対策など、理解しておくべき点は多岐にわたります。運用者はポートの管理と監視、不要なポートの閉鎖、暗号化と認証の徹底を行うことで、攻撃リスクを下げつつ安定したサービス提供が可能になります。

参考文献