TCPポート徹底解説:構造・範囲・4タプル・エフェメラルポートとセキュリティ運用の完全ガイド

TCPポートとは — 概要

TCPポートは、インターネットやローカルネットワーク上で動作する複数のアプリケーションやサービスを区別・識別するための番号です。IPアドレスが「どのホスト(どの機械)に届くか」を示すのに対し、ポート番号は「そのホスト上のどのアプリケーション(プロセス)に届くか」を示します。TCPポートはTCP(Transmission Control Protocol)のヘッダに含まれる16ビットのフィールドで、送信元ポートと宛先ポートの2つを持ちます。

ポート番号の構造と範囲

ポート番号は0から65535までの整数で表されます(16ビット)。IANA(Internet Assigned Numbers Authority)はポート番号を大きく3つの範囲に分類しています。

  • 0(reserved): 一般に「予約」されており、ネットワーク上の通常の宛先ポートとしては使用されません。ただし、ソケットAPIではポート番号0を指定するとOSが自動的に空いているエフェメラルポートを割り当てる動作を行います。
  • 0〜1023(Well-known ports / ルート権限が必要な特権ポート): HTTP(80)やSSH(22)などの広く知られたサービスが割り当てられます。UNIX系OSではこれらのポートにバインドするには管理者権限(root)が必要なことが多いです。
  • 1024〜49151(Registered ports): アプリケーションやミドルウェアが登録して使うポート。
  • 49152〜65535(Dynamic / Private / Ephemeral ports): クライアントが接続時に一時的に割り当てられるエフェメラル(短期間)ポートの範囲。IANAの推奨範囲は49152–65535ですが、OSごとにデフォルトの範囲は異なります(後述)。

TCPヘッダとポートの役割

TCPヘッダは送信元ポートと宛先ポートをそれぞれ16ビットで持ちます。これにより、受信側のネットワークスタックは宛先ポートに基づいて正しいローカルソケット(プロセス)にデリバリできます。TCPは接続指向プロトコルなので、ポート番号はIPアドレスと組み合わされて接続を一意に識別します(4タプル:送信元IP, 送信元ポート, 宛先IP, 宛先ポート)。

ソケット、バインド、リッスン、接続

アプリケーションがネットワーク通信を行う際、ソケットという抽象を使います。典型的なサーバは特定のローカルIPとポートに「bind(バインド)」して「listen(待ち受け)」し、クライアントからの接続要求(SYN)を受け入れます。一方、クライアントは接続時にローカル側のエフェメラルポートを使ってサーバのIP:ポートへ接続します。

TCPの接続識別 — 4タプルと多重化

同じサーバプロセスが同じ宛先ポート(例:80)で複数のクライアント接続を同時に扱えるのは、各接続が送信元IPと送信元ポートの組み合わせで区別されるためです。つまり、接続は(送信元IP, 送信元ポート, 宛先IP, 宛先ポート)という4要素の組合せで一意に識別されます。これにより1つのポートで多数のセッションを多重化(マルチプレクス)できます。

エフェメラルポートとOS依存の挙動

クライアント側で使用される一時的なポートがエフェメラルポートです。IANAは49152–65535を推奨していますが、実際のOSデフォルトは異なります。例:

  • Windows(Vista以降): デフォルトは49152–65535
  • 多くのLinuxディストリビューション: 既定で32768–60999や32768–61000などを使用することがあった(カーネルパラメータで変更可能)。

必要に応じてsysctlやレジストリで範囲を調整できます(例: Linuxの /proc/sys/net/ipv4/ip_local_port_range)。

よく使われるTCPポート(例)

  • 20/21: FTP(20=データ, 21=制御)
  • 22: SSH(セキュアシェル)
  • 23: Telnet(非推奨、平文)
  • 25: SMTP(メール送信)
  • 53: DNS(通常はUDPだが、ゾーン転送や大きな応答でTCPを使用)
  • 80: HTTP
  • 110: POP3
  • 143: IMAP
  • 443: HTTPS
  • 3306: MySQL
  • 3389: RDP(リモートデスクトップ)
  • 5900: VNC
  • 8080: HTTP(代替、プロキシや開発用途で多用)

ネットワーク機器・NAT・ファイアウォールとの関係

ファイアウォールはポート番号を基準に通信の許可/拒否を行います。NAT(特にポートフォワーディング)では、外部のIP:ポートを内部IP:ポートへ写像して外部からのアクセスを内部サービスへ届けます。これにより同一グローバルIPで複数の内部ホストがサービスを提供できますが、適切なポートフォワーディング設定とセキュリティ対策が必要です。

セキュリティ上の注意点

  • 不要なポートは閉じる: サーバは必要最小限のポートのみを公開する。ポートが開いている=サービスが稼働している可能性があるため攻撃対象になり得る。
  • ポートスキャン対策: Nmapなどでのスキャンに対するログ監視や遅延応答、ポートノッキング等の対策がある。
  • 特権ポートへのリスク: ルート権限で動くサービスは脆弱性があった場合の影響が大きい。可能なら低権限ユーザーでの実行やポートプロキシを用いる。
  • SYNフラッドなどのTCP攻撃: TCPのハンドシェイクを悪用したDDoS対策(SYN cookieやレート制限、WAF/IDS)を検討する。

運用でよく使うコマンド・確認方法

稼働中のポートやソケット状態を確認するコマンド例(環境により権限が必要):

  • netstat -tulnp(古典的、Linux)
  • ss -tuln(より新しく高速なソケット確認ツール、Linux)
  • lsof -i :ポート番号(そのポートを使っているプロセスを特定)
  • nmap(別ホストからのポートスキャンに利用)
  • curl/telnet/nc(netcat)で特定ポートへの接続を試す

ポート番号は「固定」すべきか?

アプリケーションによっては既定ポートを使うのが便利ですが、セキュリティや運用上の理由からポート番号を変更することがあります。ただし、標準ポートを変更するとクライアント側設定やドキュメント、ファイアウォール例外の調整が必要になるため、変更のメリットと運用コストを検討してください。

まとめ

TCPポートはネットワーク上でアプリケーションを識別する重要な仕組みであり、IPアドレスと合わせて通信の宛先を決定します。ポート番号は0〜65535の範囲を取り、用途に応じて「Well-known」「Registered」「Dynamic」の区分があります。運用では、公開ポートの管理、エフェメラルポートの設定、ファイアウォール/NATの設定、脆弱性対策とログ監視が重要です。理解を深めることでトラブルシューティングやセキュリティ強化が行いやすくなります。

参考文献