0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔌 ポート番号とプロトコルを理解しよう【応用編】TCP・UDP・OSIモデル・ファイアウォール・セキュリティ

0
Posted at

1. 👋 はじめに

前回の基礎編では、プロトコルとポート番号の基本・HTTP/HTTPS・SSH・FTP・メール系プロトコル・DNSを学びました。

今回は 応用編 として、より深い内容を解説します!

基礎編で「TCPとUDPの違いは応用編で!」と伏線を張っていましたね。
いよいよその謎を解き明かします🎉

この記事を読めば:

  • ✅ TCPとUDPの違いがわかる
  • ✅ OSI参照モデルとプロトコルの関係がわかる
  • ✅ 開発でよく使うポート番号がわかる
  • ✅ ファイアウォールとポート開放の仕組みがわかる
  • ✅ ポートスキャンとセキュリティの基礎がわかる

2. 🔄 TCPとUDPの違い

まず「トランスポート層」を理解しよう

TCP と UDP は「データをどうやって届けるか」を定めたプロトコルです。
どちらもインターネット通信の土台となる重要な存在です。

TCP(Transmission Control Protocol)

TCPとは「確実にデータを届けることを保証するプロトコル」です。

【TCPの特徴:手紙の配達記録のようなもの】

送信側                              受信側
  │                                  │
  │──── ① 接続要求(SYN)────────────>│
  │<── ② 接続確認(SYN-ACK)──────────│
  │──── ③ 接続完了(ACK)────────────>│
  │                                  │
  │    ← 3ウェイハンドシェイク完了 →   │
  │                                  │
  │──── ④ データ送信 ────────────────>│
  │<── ⑤ 受信確認(ACK)──────────────│
  │──── ⑥ 届いてないデータを再送 ─────>│
  │                                  │

3ウェイハンドシェイクとは?

TCPが通信を始める前に行う「接続確立の手順」です。

① SYN     :「通信してもいいですか?」
② SYN-ACK :「いいですよ!あなたも受け取れますか?」
③ ACK     :「はい、受け取れます!では始めましょう」

→ この3ステップで「確実に通信できる」ことを確認してからデータを送る

💡 フラグ名の正式な意味

フラグ 正式名称 意味
SYN Synchronize(同期) 接続リクエスト「通信を同期しよう」
SYN-ACK Synchronize-Acknowledge 接続許可&確認「了解、こちらも同期しよう」
ACK Acknowledge(確認応答) 確認完了「了解、通信開始!」

ACK は「確認応答」の略で、データを受け取ったことを相手に伝えるフラグです。
Wiresharkなどのログ解析ツールでも、このフラグ名がそのまま表示されます。

TCPの特徴 説明
✅ 信頼性が高い データが届いたか確認する(ACK)
✅ 順序を保証 バラバラに届いても正しい順序に並べ直す
✅ 再送制御 届かなかったデータを自動で再送する
⚠️ 速度は遅め 確認作業があるため、UDPより遅い

TCPを使う代表的なプロトコル:
HTTP/HTTPSSSHFTPSMTPPOP3IMAP

UDP(User Datagram Protocol)

UDPとは「速さを優先して、確認なしにデータを送るプロトコル」です。

【UDPの特徴:ポスティングチラシのようなもの】

送信側                              受信側
  │                                  │
  │──── データを送りっぱなし ─────────>│
  │──── データを送りっぱなし ─────────>│
  │──── データを送りっぱなし ─────────>│
  │                                  │
  × 確認なし・再送なし・順序保証なし  ×
UDPの特徴 説明
✅ 速度が速い 確認作業がないため高速
✅ オーバーヘッドが少ない データ量が少なくて済む
❌ 信頼性が低い データが届かなくても再送しない
❌ 順序を保証しない 届く順番がバラバラになることがある

UDPを使う代表的なプロトコル:
DNS動画ストリーミングオンラインゲームVoIP(音声通話)

TCPとUDPの使い分け

TCP UDP
信頼性 ✅ 高い ❌ 低い
速度 ⚠️ 遅め ✅ 速い
順序保証 ✅ あり ❌ なし
再送制御 ✅ あり ❌ なし
向いている用途 Webページ・メール・ファイル転送 動画・音声・ゲーム・DNS
【使い分けの考え方】

「データが確実に届くことが最優先」→ TCP
  例:Webページ・ファイルダウンロード・メール
  → 1バイトでも欠けると困る!

「多少欠けてもいいから速さが最優先」→ UDP
  例:ビデオ通話・オンラインゲーム・音楽ストリーミング
  → 1フレーム欠けても気にならない!遅延の方が困る!

💡 DNSがUDPを使う理由(基礎編の復習)
DNSの問い合わせは「example.com のIPは?」という小さなデータのやりとりです。
速さが最優先で・再送が必要なほど大きなデータではないため、UDPが選ばれています。


3. 🏗️ OSI参照モデル

OSI参照モデルとは?

OSI参照モデル(Open Systems Interconnection)とは
「ネットワーク通信を7つの層(レイヤー)に分けて整理したモデル」です。
バックエンドのレイヤードアーキテクチャと同じ考え方ですね!

【OSI参照モデルの7層】

┌─────────────────────────────────────────┐
│ 第7層:アプリケーション層          │<── HTTP・FTP・SMTP・DNS
│ 第6層:プレゼンテーション層         │<── 暗号化・文字コード変換(TLS)
│ 第5層:セッション層             │<── 通信セッションの管理
│ 第4層:トランスポート層                   │<── TCP・UDP・ポート番号
│ 第3層:ネットワーク層                     │<── IP・ルーティング
│ 第2層:データリンク層                     │<── MAC アドレス・イーサネット
│ 第1層:物理層                            │<── ケーブル・電気信号・Wi-Fi
└─────────────────────────────────────────┘

各層とプロトコルの対応

名前 主なプロトコル 役割
第7層 アプリケーション層 HTTP・HTTPS・FTP・SMTP・DNS ユーザーが直接使うサービス
第6層 プレゼンテーション層 TLS・SSL 暗号化・データ形式の変換
第5層 セッション層 TLS(一部) 通信セッションの開始・維持・終了
第4層 トランスポート層 TCP・UDP データの転送方法・ポート番号
第3層 ネットワーク層 IP・ICMP IPアドレスによる経路制御
第2層 データリンク層 イーサネット・Wi-Fi MACアドレスによる機器間通信
第1層 物理層 - 電気信号・光・電波の送受信

ポート番号はどの層に属するのか?

ポート番号は「第4層:トランスポート層」で使われます。

第3層(ネットワーク層):IPアドレス
  → 「どのコンピュータ(マンション)に届けるか」

第4層(トランスポート層):ポート番号
  → 「そのコンピュータのどのアプリ(部屋)に届けるか」

この2つの組み合わせで「宛先」が完全に決まります。

💡 「第4層まで」を理解すれば実務で十分!
エンジニアとして必ず知っておくべきは第3・4・7層です。
第1・2層はネットワークエンジニアが主に扱う領域です。

📘 コラム:実際の現場では「TCP/IPモデル(4層)」も使われる!

OSI参照モデルは「概念としての7階層」ですが、
実際のインターネット実装では TCP/IPモデル(4層) がベースになっています。

TCP/IPモデル 対応するOSI層 主なプロトコル
アプリケーション層 第5〜7層 HTTP・DNS・SMTP
トランスポート層 第4層 TCP・UDP
インターネット層 第3層 IP
ネットワークインターフェース層 第1〜2層 イーサネット・Wi-Fi

実務では「L4スイッチ」「L7ロードバランサー」のように、
OSI参照モデルの階層番号(Layer 4 / Layer 7)を使って会話することが多いです。
「L7で振り分ける」と聞いたら「アプリケーション層レベルで処理する」という意味です。


4. 🛠️ 開発でよく使うポート番号

💬 開発中の「Address already in use」エラーの正体

開発中に以下のエラーを見たことはありませんか?

Error: listen EADDRINUSE: address already in use :::3000

これは「すでに別のプロセス(以前起動したアプリなど)がポート3000を使っているため、部屋(ポート)に入れない」状態です。

解決方法:

  • 以前のプロセスを終了する(Ctrl+Ckill コマンド)
  • 別のポート番号(3001など)を指定して起動する

フロントエンド・バックエンド開発

ポート番号 用途 代表的なツール
3000 フロントエンド開発サーバー React・Next.js・Node.js
3001 バックエンドAPI(フロントと同時起動時) Express・NestJS
4000 GraphQL開発サーバー Apollo Server
5173 Vite開発サーバー(デフォルト) Vite
8000 バックエンド開発サーバー Python(FastAPI・Django)
8080 汎用Webサーバー Java・Spring Boot
8888 Jupyter Notebook Python

データベース・ミドルウェア

ポート番号 サービス
3306 MySQL・MariaDB
5432 PostgreSQL
6379 Redis
27017 MongoDB
9200 Elasticsearch
5672 RabbitMQ(メッセージキュー)

よくある開発構成の例

【フロントエンド + バックエンド + DBの典型的な構成】

ブラウザ
  ↓ http://localhost:3000
React(ポート3000)
  ↓ http://localhost:8000/api/v1/users
FastAPI(ポート8000)
  ↓ localhost:5432
PostgreSQL(ポート5432)

5. 🔥 ファイアウォールとポート開放

ファイアウォールとは?

ファイアウォールとは「許可されていない通信をブロックする仕組み」です。
「防火壁」という意味で、不正アクセスから守ります。

【ファイアウォールのイメージ】

インターネット
      ↓
┌─────────────────────┐
│  🔥 ファイアウォール │ ← ここで通信を検査
│                     │
│ 許可:443(HTTPS)   │ → ✅ 通す
│ 許可:22(SSH)      │ → ✅ 通す
│ 拒否:それ以外       │ → ❌ ブロック
└─────────────────────┘
      ↓
   サーバー

ポート開放とは?

ポート開放とは「ファイアウォールで特定のポートの通信を許可すること」です。

【ポート開放の例:Webサーバーを公開する場合】

必要なポート:
  ✅ 80  (HTTP)  → 開放する
  ✅ 443 (HTTPS) → 開放する
  ✅ 22  (SSH)   → 開放する(サーバー管理用)

不要なポート:
  ❌ 3306(MySQL) → 閉じたまま(外部からDBに直接アクセスさせない!)
  ❌ 6379(Redis) → 閉じたまま(同上)
  ❌ その他すべて  → 閉じたまま

⚠️ DBのポートは絶対に外部に開放してはいけません!
MySQL(3306)やPostgreSQL(5432)を外部に公開すると、
攻撃者に直接DBにアクセスされる可能性があります。
DBへのアクセスはバックエンドアプリを経由するだけにしましょう。

💡 「じゃあローカルのGUIツールから本番DBを見たいときはどうするの?
DBeaverやTablePlusなどのGUIツールから本番DBに接続したいとき、
DBのポートを外部公開するのはNG。
実務では SSHトンネル(ポートフォワーディング) を使います。

【SSHトンネルのイメージ】

ローカルPC ──SSH接続(22番)──→ サーバー
                                    ↓
                             サーバー内部でDBに接続(5432番)
                                    ↓
ローカルのDBクライアントから       本番DBを安全に操作できる!
localhost:5432 でアクセスできる

DBポートは閉じたまま・SSHトンネル経由で安全に接続するのが実務の常識です。

インバウンド・アウトバウンド

インバウンド(受信):外からサーバーへの通信
  例:ユーザーが https://example.com にアクセスする
  → 443番ポートのインバウンドを許可する

アウトバウンド(送信):サーバーから外への通信
  例:サーバーが外部APIを呼び出す
  → 基本的にすべて許可することが多い

6. 🔍 ポートスキャンとセキュリティ

ポートスキャンとは?

ポートスキャンとは「どのポートが開いているかを調べる行為」です。
セキュリティ診断でも使われますが、攻撃の下調べにも使われます。

【攻撃者のポートスキャンの流れ】

① ターゲットのサーバーに対して
  全ポート(0〜65535)にアクセスを試みる

② 応答があったポートを記録
  「22番(SSH)が開いている!」
  「3306番(MySQL)が開いている!」← 危険!

③ 開いているポートの脆弱性を調べて攻撃

セキュリティのベストプラクティス

① 必要最低限のポートだけ開ける

❌ 悪い例:すべてのポートを開放
✅ 良い例:443・22・80 だけ開放(必要なものだけ)

② SSHのポートを変更する

❌ デフォルトのまま:ポート22
  → 攻撃者が自動スキャンで真っ先に狙う

✅ 別のポートに変更:ポート2222 など
  → 自動スキャンによるログの肥大化を防ぎやすくなる

⚠️ ポート変更だけではセキュリティ対策として不十分です!
ポート変更の主な効果は「自動スキャンによるログの肥大化を防ぐこと」であり、隠蔽によるセキュリティ(Security by obscurity)にすぎません。
根本的な対策は以下の2つです:

  • パスワード認証を無効化する
  • 公開鍵認証を必須にする

ポート変更はあくまで「補助的な対策」として位置づけましょう。

③ IP制限をかける

✅ SSHは特定のIPアドレスからのみ許可
  → 自分のIPアドレス以外はSSH接続できない
  → 万が一パスワードが漏れても不正ログインを防げる

④ 不要なサービスを停止する

✅ 使っていないポートで動くサービスは停止する
  → 攻撃面積(アタックサーフェス)を最小限にする

7. 🔒 HTTPS の裏側:TLS ハンドシェイク

TLSとは?

TLS(Transport Layer Security)とは「通信を暗号化するプロトコル」です。
HTTPSの「S(Secure)」を実現しているのがTLSです。

【TLSハンドシェイクの流れ(簡略版)】

クライアント                        サーバー
    │                                  │
    │── ① 対応している暗号方式を送る  ──>│
    │<── ② 使う暗号方式・証明書を返す ───│
    │── ③ 証明書を検証  ───────────────>│
    │    (本物のサーバーか確認)        │
    │──── ④ 暗号化キーの交換 ──────────>│
    │<──  ⑤ 暗号化通信開始の合図 ─────── │
    │                                  │
    │  ✅ 以降はすべて暗号化された通信   │

SSL証明書とは?

SSL証明書 = 「このサーバーは本物です」という信頼の証明書

ブラウザのアドレスバーの🔒マーク
  → SSL証明書が有効 = 通信が暗号化されている

SSL証明書がない(http://のみ)
  → ブラウザが「安全でない」と警告を表示

💡 SSL証明書は Let's Encrypt で無料取得できます!
かつてはSSL証明書の取得に費用がかかりましたが、現在は Let's Encrypt という無料の認証局を使って誰でも無料でHTTPS化できます。


8. 📋 プロトコルとポート番号 完全まとめ表

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

プロトコル ポート TCP/UDP 用途 暗号化
FTP(データ) 20 TCP ファイル転送(データ)
FTP(制御) 21 TCP ファイル転送(制御)
SSH / SFTP 22 TCP リモート接続・安全なファイル転送
SMTP 25 TCP サーバー間メール転送
DNS 53 TCP/UDP ドメイン名解決
HTTP 80 TCP Web通信
POP3 110 TCP メール受信(ダウンロード)
IMAP 143 TCP メール受信(サーバー管理)
HTTPS 443 TCP 暗号化Web通信 ✅ TLS
SMTPS 465 TCP SSL/TLSメール送信
SMTP(STARTTLS) 587 TCP メールクライアント送信
IMAPS 993 TCP 暗号化IMAP
POP3S 995 TCP 暗号化POP3

登録済みポート(1024〜49151):開発でよく使うもの

ポート サービス 説明
3000 React・Next.js フロントエンド開発サーバー
3001 Express・NestJS バックエンドAPI
3306 MySQL・MariaDB データベース
4000 Apollo Server GraphQL
5173 Vite フロントエンドビルドツール
5432 PostgreSQL データベース
6379 Redis インメモリDB・キャッシュ
8000 FastAPI・Django Pythonバックエンド
8080 Spring Boot Javaバックエンド
8888 Jupyter Notebook Pythonデータ分析
27017 MongoDB NoSQL データベース

9. 🎯 まとめ

概念 一言で言うと
🔄 TCP 確実にデータを届けることを保証するプロトコル
⚡ UDP 速さ優先・確認なしでデータを送るプロトコル
🏗️ OSIモデル ネットワーク通信を7層に分けて整理したモデル
🔥 ファイアウォール 許可されていない通信をブロックする仕組み
🔍 ポートスキャン どのポートが開いているかを調べる行為
🔒 TLS HTTPSの暗号化を実現するプロトコル

TCP vs UDP 最終まとめ

確実さが必要 → TCP
  Web・メール・ファイル転送・SSH

速さが必要   → UDP
  動画・音声・ゲーム・DNS

セキュリティの鉄則

① 必要なポートだけ開ける
② DBのポートは絶対に外部公開しない
③ SSHのポートはデフォルトの22番から変更する
④ 通信はHTTPSを使って必ず暗号化する
⑤ 不要なサービスは停止する

ポートとプロトコルを理解することは、
「インターネットの言葉を理解すること」です。
開発・インフラ・セキュリティ、どの分野でも必ず役立つ知識です💪

💬 質問や感想があれば、コメント欄でお気軽にどうぞ!
👍 役に立ったら、いいね&ストックをお願いします!
🎓 ここまで読んでくださって、本当にありがとうございました!


🔗 シリーズ記事

  • 【基礎編】プロトコルとポート番号の基本
  • 【応用編】TCP・UDP・OSIモデル・セキュリティ(この記事)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?