Featured image of post ポート番号とは?アプリを識別する番号の仕組みをやさしく解説【第28回】

ポート番号とは?アプリを識別する番号の仕組みをやさしく解説【第28回】

この記事でわかること

  • ポート番号の3つの範囲とそれぞれの特徴
  • ウェルノウンポートに管理者権限が必要な理由
  • URLにポート番号が書かれるときの意味
  • サーバーがポートを「開く(バインド・LISTEN)」とはどういうことか
  • ポートの衝突が起きたとき何が起こるか
  • ファイアウォールがポート番号を使って通信を制御する仕組み
  • どのプロセスがどのポートを使っているかコマンドで確認する方法

はじめに

前回のトランスポート層の記事では、ポート番号が「アプリを識別する受付窓口番号」であることを学びました。IPアドレスがマンションの住所なら、ポート番号は部屋番号です。

「ポートを開放する」「ポートが閉じている」「ポートが競合した」——ネットワークの話題でこういった表現を耳にすることがあります。でも、これらが具体的に何を指しているのか、説明できる人は意外と少ない。

今回はポート番号をより深く掘り下げます。0から65535という広い範囲の内訳、ポートを「開く」という操作の正体、ファイアウォールとポートの関係——これらをひとつひとつ解きほぐしていきます。


ポート番号は3つの範囲に分かれている

ポート番号の0〜65535という範囲は、用途によって3つのカテゴリに分けられています。

範囲 名称 特徴
0 〜 1023 ウェルノウンポート 主要サービス用。OS管理者権限が必要
1024 〜 49151 登録済みポート 一般アプリが使える。IANAへの登録も可能
49152 〜 65535 動的ポート クライアントが一時的に使うエフェメラルポート

順番に見ていきます。


ウェルノウンポート(0〜1023番)

HTTPSの443番、SSHの22番など、世界共通で使われる主要なサービスに割り当てられたポート番号です。IANA(Internet Assigned Numbers Authority = インターネット割り当て番号機関)が管理しています。

前回の記事で紹介したポート番号の多くがこの範囲です。

ポート番号 プロトコル 用途
21 FTP ファイル転送
22 SSH 暗号化リモートアクセス
25 SMTP メール送信
53 DNS ドメイン名のIPアドレス変換
80 HTTP ウェブ(暗号化なし)
110 POP3 メール受信
143 IMAP メール受信(複数端末対応)
443 HTTPS ウェブ(暗号化あり)

なぜ管理者権限が必要なのか

ウェルノウンポートを使うには、WindowsではAdministrator権限、LinuxやMacではroot権限が必要です。なぜこんな制限があるのでしょうか。

もしも誰でも自由にポート80番を使えるとしたら、悪意のあるプログラムが「本物のウェブサーバー」のふりをして80番ポートに待ち受けることができます。ユーザーが80番ポートにアクセスしてきたとき、偽サーバーが応答してしまいます。

ウェルノウンポートに管理者権限を要求することで「この番号を使っているアプリは、システム管理者が許可したものだ」という信頼の担保になります。一般ユーザーが動かすプログラムに、勝手にウェルノウンポートを乗っ取らせない——そのための設計です。


登録済みポート(1024〜49151番)

管理者権限が不要な、一般アプリが使える範囲です。IANAに登録を申請することもできますが、義務ではありません。

データベースや開発用サーバーがよく使う番号が並んでいます。

ポート番号 用途
1433 Microsoft SQL Server
3306 MySQL
5432 PostgreSQL
6379 Redis
8080 HTTP代替(開発・テスト用ウェブサーバー)
8443 HTTPS代替(開発・テスト用)
27017 MongoDB

開発中のウェブアプリを http://localhost:8080 で確認した経験がある方も多いはずです。本番環境が80番を使っているとき、同じマシンでテスト用サーバーを別に立てるために8080番を使う——こういった用途です。


動的ポート/エフェメラルポート(49152〜65535番)

クライアント側がエフェメラルポートとして使う範囲です。前回の記事で学んだ「OSが自動割り当てする一時的なポート番号」がここに該当します。通信が終わると解放され、次の通信に再利用されます。

実際のエフェメラルポートの範囲はOSによって異なります。Linuxは32768〜60999前後、Windowsは49152〜65535を使うことが多いです。「大きめの番号をOSが自動で割り振る」と覚えておけば十分です。


URLに書かれたポート番号の意味

ブラウザのアドレスバーでときどき見かける、こんなURL。

http://example.com:8080/path

末尾の :8080 がポート番号の直接指定です。

ブラウザはURLのスキーム(http://https://)からデフォルトのポート番号を判断します。

スキーム デフォルトのポート番号
http:// 80番
https:// 443番

https://example.com/ と書いたとき、ブラウザは内部的に443番ポートへ接続しています。ポート番号を省略できるのはこのデフォルト設定のおかげです。

一方、http://example.com:8080/ のように書くと「80番ではなく8080番に接続してください」という明示的な指定になります。開発用サーバー・社内ツール・ルーターの管理画面(例:http://192.168.1.1:8080)など、ウェルノウンポート以外で待ち受けているサービスへアクセスするときに使います。


TCPポートとUDPポートは独立している

ポート番号はTCPとUDPで別々に管理されています。「TCP の443番」と「UDPの443番」はまったく異なる通信の出入り口です。

DNSが良い例です。DNSはUDPの53番で小さな問い合わせを処理し、応答が大きくなる場面やゾーン転送などにはTCPの53番を使います。番号は同じ53番でも、TCP・UDPそれぞれ独立したポートとして扱われます。

ファイアウォールの設定でも「TCP 22番を許可」と「UDP 22番を許可」は別のルールとして書かれます。プロトコルの種類(TCP/UDP)をセットで把握することが正確な管理につながります。


サーバーがポートを「開く」とはどういう意味か

「ポートを開く」という表現は、厳密には2段階の操作を指しています。

① バインド(Bind)——ポートをアプリに結びつける

  • Bind(バインド):「結びつける」「縛る」という意味

ウェブサーバーが起動するとき、アプリはOSに「443番ポートを自分のものとして確保してください」と要求します。OSがこれを受け入れると、以後443番ポートへのパケットはそのアプリに届けられます。この確保の操作をバインドと呼びます。

② LISTEN——接続を待ち受ける状態

バインドが完了したアプリは接続を待ち受ける状態(LISTEN)に入ります。「いつでもお客さんを受け付けます」と受付を開いた状態です。

netstat -an で確認した LISTEN 状態のエントリがこれです。

TCP    0.0.0.0:443    0.0.0.0:*    LISTEN

0.0.0.0:443 は「すべてのネットワークインターフェースの443番ポートで待ち受け中」という意味です。


ポートの衝突——同じ部屋に2つのアプリは入れない

同じプロトコル・同じポート番号に2つのアプリが同時に待ち受けようとするとどうなるか。後から起動しようとしたアプリが即座にエラーになります。

エラー例(Linux / Mac):
bind: Address already in use

エラー例(Windows):
通常、各ソケット アドレスに対してプロトコル、
ネットワーク アドレス、またはポートのどれか一つのみ使用できます。

1つの受付窓口(ポート番号)に担当者が2人座れないのと同じです。OSはどちらに来客を案内すればよいかわからなくなるため、2つ目のアプリのバインドを拒否します。

このポート衝突は開発中のよくあるトラブルです。「アプリが起動しない」と思ったら別のプロセスが同じポートを使っていた——その犯人を見つけるコマンドを後で紹介します。


ポートとファイアウォールの関係

  • Firewall(ファイアウォール):Fire(火)+ Wall(壁)→「防火壁」が語源。建物の火災が隣に広がらないよう設ける壁から転じて、ネットワークの不正な通信を遮断する仕組みを指します

ファイアウォールはパケットの宛先ポート番号を見て「通すか遮断するか」を判断します。セキュリティゲートの警備員が「入館許可リスト」をチェックするイメージです。

ファイアウォールのルール例:
  ✓ 宛先ポート443番(HTTPS)→ 通す
  ✓ 宛先ポート 80番(HTTP) → 通す
  ✗ 宛先ポート 22番(SSH)  → 遮断(外部からのSSHは禁止)
  ✗ 上記以外のポート        → すべて遮断

「ポートを開放する」という表現はファイアウォールの文脈で使われることが多いです。サーバー側のアプリが443番ポートをLISTEN状態にしていても、ファイアウォールが遮断していれば外からパケットは届きません。アプリの設定とファイアウォールの設定は別々に管理されます。

ルーターの管理画面でよく見る「ポート開放」設定も同じ発想です。NATの内側にいる自宅サーバーへ外からアクセスさせるために、ルーターのファイアウォールで特定のポート番号を通過させる設定です(第23回のNAT/NAPTの記事で触れたポートフォワーディングがこれにあたります)。


どのプロセスがどのポートを使っているか確認する

ポートの衝突が起きたとき、「どのアプリが問題のポートを使っているか」を調べる方法を紹介します。

Windowsの場合

netstat -ano

-o オプションを追加するとPID(プロセスID)が表示されます。

Proto  Local Address    Foreign Address  State    PID
TCP    0.0.0.0:443      0.0.0.0:*        LISTEN   1234
TCP    0.0.0.0:8080     0.0.0.0:*        LISTEN   5678

PIDがわかったら、次のコマンドでプロセス名を確認できます。

tasklist /fi "pid eq 1234"

特定のポートだけに絞り込みたいときは:

netstat -ano | findstr :8080

Macの場合

lsof -i TCP:8080

lsof(List Open Files)はUnix系OSでファイルや通信の一覧を表示するコマンドです。プロセス名・PID・接続状態がまとめて確認できます。

COMMAND   PID  USER   TYPE  NODE NAME
node     2345  user   IPv4  TCP  *:8080 (LISTEN)

すべてのTCP接続を一覧したいときは:

lsof -i TCP

Linuxの場合

ss -tlnp

-t(TCP)-l(LISTEN中のみ)-n(数字表示)-p(プロセス名)の組み合わせです。

State   Local Address:Port  Process
LISTEN  0.0.0.0:80          users:(("nginx",pid=1234,fd=6))
LISTEN  0.0.0.0:443         users:(("nginx",pid=1234,fd=7))
LISTEN  0.0.0.0:8080        users:(("node",pid=5678,fd=8))

プロセス名が直接表示されるため、ポート衝突の原因をすぐ特定できます。


まとめ

  • ポート番号は3つの範囲に分かれている。**ウェルノウンポート(0〜1023)**はOS管理者権限が必要な主要サービス用、**登録済みポート(1024〜49151)**は一般アプリが使える範囲、**動的ポート(49152〜65535)**はエフェメラルポートの範囲
  • ウェルノウンポートに管理者権限が必要なのは、悪意あるアプリが正規サービスに成りすますことを防ぐため
  • URLの :8080 はポート番号の直接指定。http:// のデフォルトは80番、https:// のデフォルトは443番なので、それ以外のポートを使うときに明記する
  • TCPのポート番号とUDPのポート番号は独立して管理されている
  • サーバーはポート番号をバインドしてLISTEN状態に入ることで接続を待ち受ける。これが「ポートを開く」の正体
  • 同じプロトコル・同じポート番号に2つのアプリは同時に待ち受けられない(ポートの衝突
  • ファイアウォールはポート番号を見てパケットを通すか遮断するかを判断する。アプリのLISTENとファイアウォールの開放は別々の設定
  • プロセスとポートの対応を確認:Windowsは netstat -ano、Macは lsof -i TCP、Linuxは ss -tlnp