この記事でわかること
- ポート番号の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