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の設定、脆弱性対策とログ監視が重要です。理解を深めることでトラブルシューティングやセキュリティ強化が行いやすくなります。
参考文献
- IANA — Service Name and Transport Protocol Port Number Registry
- RFC 793 — Transmission Control Protocol
- RFC 6335 — Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry
- Wikipedia — Port (computer networking)
- Linux kernel networking documentation(ip_local_port_range など)


