個人的な備忘録：ポート番号について3時間語れなかったので記事としてアウトプットしてみた

## はじめに

ポート番号は、ネットワーク通信において欠かせない基礎的な知識の一つです。

:::note warn
**この記事では、ポート番号の基本的な仕組みや分類、代表的なポート番号、そして用途ごとの具体例について解説します。**
:::

また、LinuxやWindows、Dockerを使ったポート番号の確認方法についてもご紹介します。***簡単なメモ程度の記事となりますが、何卒ご了承ください。***

## 書こうと思ったきっかけ

ポート番号の概念は何となく頭に入っているつもりでも、具体的に説明したり、言語化するとなると難しいと感じることがありました...。

:::note info
***また、日常的に使用しているSSHやHTTPSといったサービスが実際にどのポート番号を使っているかを正確に説明できるようになりたいと思ったのがきっかけです。***
:::

***※基礎的な内容ではありますが、自分の知識を整理し、アウトプットすることを目的としてこの記事をまとめました。***

## ポート番号について

ポート番号は、ネットワーク通信において特定のアプリケーションやサービスを識別するための番号です。

![Screenshot 2025-01-20 at 11.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2aafb27f-02a9-da24-221d-993f5571d012.png)
引用画像：https://ascii.jp/elem/000/000/458/458706/

通信プロトコルで使用され、送信元と宛先を正確に結びつける役割を果たします。

普段使用するアプリケーションやサービスが、どのポート番号を使用して通信しているかを把握することは、ネットワークトラブルの対応やシステム設計において重要なスキルです。

## ポート番号の基本

- **範囲**: 0 ～ 65535 の範囲の数値

- **分類**:
  - **0 ～ 1023: ウェルノウンポート (Well-Known Ports)**  
    - OSや一般的なサービスが使用するポート番号。管理者権限が必要。  
    - 例: 80 (HTTP), 443 (HTTPS), 22 (SSH)

  - **1024 ～ 49151: 登録ポート (Registered Ports)**  
    - 特定のアプリケーションが登録して使用するポート番号。  
    - 例: 3306 (MySQL), 5432 (PostgreSQL), 8080 (HTTPの代替ポート)

  - **49152 ～ 65535: 動的ポート (Dynamic Ports) または プライベートポート**  
    - 一時的な通信に使用されるポート番号。クライアントアプリケーションが動的に割り当てる。

## 代表的なポート番号

ここでは、代表的なポート番号をプロトコルごとに整理し、主観的な観点から紹介しています。***ぜひ参考にしてみてください！***

| ポート番号 | サービス/プロトコル | 説明                          |
|------------|----------------------|-------------------------------|
| 20, 21     | FTP                 | ファイル転送プロトコル         |
| 22         | SSH                 | セキュアシェル                |
| 23         | Telnet              | リモートログインプロトコル     |
| 25         | SMTP                | メール送信プロトコル           |
| 53         | DNS                 | ドメイン名解決サービス         |
| 80         | HTTP                | ウェブサイトアクセス           |
| 110        | POP3                | メール受信プロトコル           |
| 143        | IMAP                | メール受信プロトコル           |
| 443        | HTTPS               | セキュアなウェブ通信           |
| 3306       | MySQL               | MySQLデータベース              |
| 5432       | PostgreSQL          | PostgreSQLデータベース         |
| 6379       | Redis               | Redisキャッシュサーバー        |
| 8080       | HTTP (代替)         | ウェブサーバーでよく使われる代替ポート |

## ポート番号の用途と使用例

1. **ウェブサービス**  
   - **80 (HTTP)**: 通常のウェブページへのアクセス。暗号化なし。  
   - **443 (HTTPS)**: 暗号化された安全なウェブ通信。

2. **リモートアクセス**  
   - **22 (SSH)**: サーバーやデバイスにセキュアにリモートログイン。  
   - **3389 (RDP)**: Windowsリモートデスクトッププロトコル。

3. **データベース**  
   - **3306 (MySQL)**: MySQLデータベース通信。  
   - **5432 (PostgreSQL)**: PostgreSQLデータベース通信。

4. **ファイル転送**  
   - **20, 21 (FTP)**: ファイルの送受信。  
   - **22 (SFTP)**: セキュアなファイル転送。

##  ポート番号の確認方法

**Linuxの場合**

以下のコマンドで、現在使用されているポートを確認できます：

```bash
netstat -tuln
```

これは、MacBookから自宅のLinuxサーバーにSSH接続してポートの状態を確認した結果です。

![Screenshot 2025-01-20 at 13.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/940f3be2-d8f0-9eba-8c7e-f60c0401e5ae.png)

この結果は、`netstat -tuln` コマンドを実行した際の出力であり、Linuxサーバー上で現在リッスンしているポートと、それに対応するサービスやプロセスの情報を示しています。

**Windowsの場合**

以下のコマンドを使用して、WindowsPCでのポート状態を確認します：

```cmd
netstat -ano
```

こちらは、MacBookから自宅のWindows PCにリモートログインし、コマンドプロンプトから確認した結果です。

![Screenshot 2025-01-20 at 13.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b07e0a83-5bd7-ac0b-7c0a-db65e54cad66.png)

現在、開いているネットワーク接続やリッスンしているポートに関する情報が表示されていることを確認できました。

**Dockerの場合**

Dockerコンテナの公開ポートを確認するには、以下のコマンドを使用します：

```bash
docker ps
```

これは、Docker Hubから`nginx`イメージを取得し、ローカルで動かした際の画面です。

![Screenshot 2025-01-20 at 13.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/16ea74ec-417a-653c-e3c9-18372160ae92.png)

このコマンドでは、コンテナID、イメージ名、公開されているポート情報などを確認できます。

:::note info
***Dockerを使用した開発では非常に便利なコマンドです。***
:::

## まとめ

最後まで読んでいただき、ありがとうございました。今回の記事では、ポート番号の基本から用途、確認方法までを、自分なりに復習・整理して言語化してみました。

:::note warn
**ポート番号の知識は、ネットワークやサーバー管理に欠かせない基礎的な要素です。**
:::

こうした基礎的な内容を今後も積極的にアウトプットしながら、自分の知識を深め、振り返るきっかけを作っていきたいと思います。***この記事が皆さんの参考になれば幸いです！***