ポート番号は、ネットワークで通信を行う際にデータを送受信する「窓口」を示す数値です。
外部から見ると、単なる「番号」や「ポート」と思われがちですが、実際にはIPアドレスと組み合わせて「エンドポイント」を一意に決定し、複数のアプリケーションが同一デバイス上で同時に通信できるようにする重要な仕組みです。
ここでは、初心者でもすぐに実践できるように、ポート番号の基本的な概念から、日常業務やサーバー構築で具体的にどう利用するかまでを順序立てて解説します。
ポート番号の基本 - 何を表している?
| 項目 | 説明 |
|---|---|
| IPアドレス | ネットワーク上でデバイスを一意に示す番号(例:192.168.1.10) |
| ポート番号 | デバイス内での通信先を示す16ビット整数(0〜65535) |
| エンドポイント | IPアドレス + ポート番号 の組み合わせ(例:192.168.1.10:80) |
ポイント
- ポート番号は「どのアプリケーションが通信を受け取るか」を区別します。
- 同一のIPアドレスに複数のポートが存在し、同時に複数アプリが動作可能です。
- 既定で使われるポート(IANAが管理)は「予約済み」になっており、これを無断で使用すると競合が起きます。
主要プロトコルと代表的なポート番号
| ポート番号 | プロトコル | 用途 | 備考 |
|---|---|---|---|
| 20/21 | FTP | ファイル転送(データ/制御) | 変更可だが、セキュアではない |
| 22 | SSH | リモート接続 | ほぼ必須 |
| 23 | Telnet | 旧リモートシェル | 使わない方が安全 |
| 25 | SMTP | メール送信 | スパム対策が必要 |
| 53 | DNS | 名前解決 | A レコード/MX など |
| 67/68 | DHCP | IP割当 | サーバ/クライアント |
| 80 | HTTP | ウェブページ | 変更不可(標準) |
| 110 | POP3 | メール受信 | 変更不可 |
| 143 | IMAP | メール受信 | 変更不可 |
| 443 | HTTPS | セキュアウェブ | 重要 |
| 3306 | MySQL | DB接続 | 管理者推奨 |
| 5432 | PostgreSQL | DB接続 | 変更可 |
実務で直ちに必要になる
- サーバーローカルにアプリをデプロイする際、
-pでポートマッピング。- ファイアウォール(例:UFW、iptables)で許可するポートを設定。
ポート番号の分類 - 予約、動的、未使用
| 分類 | 範囲 | 使い方 | 例 |
|---|---|---|---|
| 予約済み(Well-Known) | 0〜1023 | 標準プロトコル専用 | 80, 443 |
| 登録済み(Registered) | 1024〜49151 | アプリ個別予約 | 3306, 5432 |
| 動的/プライベート | 49152〜65535 | 仮想的に使用 | 5000, 8080 |
注意点
- 予約済みのポートを勝手にアプリで使うと、システムや他のアプリと衝突。
- 80や443などは常に開放しているか、プロキシを介しているかを確認。
実際にポートを使ってみる
ここでは、ローカルマシンで簡易Webサーバを立てて、ポートを指定しながらアクセスする手順を紹介します。
コマンドはLinux/MacOS を前提としています。
# 1. Python 3 を使ってシンプルにサービング
python3 -m http.server 8000
# 2. 別ターミナルから確認
curl http://localhost:8000
# 何らかのHTMLが返ってくるはず
ポイント
-m https.serverはhttp.serverを 8000 番で立ち上げる意味。- もし 80 番を使いたいなら管理者権限が必要(
sudo)。
sudo python3 -m http.server 80
ポートを守るためのセキュリティ対策
| 手法 | 実装例 | 説明 |
|---|---|---|
| ファイアウォール | ufw allow 22/tcp | 特定ポートのみ開放 |
| ポートスキャン | nmap -p- 192.168.1.10 | 開放ポートを可視化 |
| TCP Wrappers | /etc/hosts.allow | IP制限でアクセス制御 |
| IDS/IPS | Suricata, Snort | 攻撃トラフィックを検知 |
| TLS | openssl x509 -in cert.pem -text | データを暗号化 |
例:UFWでの設定
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
推奨
- 80・443は常に許可
- SSH は IP 制限も検討
- 予期せぬポートは全て拒否
開発環境での「ポートの管理」
開発者が多くのアプリをローカルで動かすとポート競合に苦労します。以下のテクニックでスムーズに管理しましょう。
Docker を利用
services: web: image: nginx:latest ports: - "8080:80"- コンテナ内部のポートをホストへマッピング。
- 複数コンテナを走らせても衝突しにくい。
.envファイルでポートを共通化APP_PORT=3000- スクリプトで読み込み、
npm start --port=$APP_PORTなど。
- スクリプトで読み込み、
ポート検索スクリプト
function find_free_port() { while true; do PORT=$(( ( RANDOM % (65535-1024) ) + 1024 )) ss -lpn | grep -q ":$PORT " || echo $PORT if [ -z "$?" ]; then break; fi done } echo $(find_free_port)- 自動で空きポートを探し、スクリプトに渡す。
ポートを活かしたデプロイの実践例
| ステップ | 内容 | コマンド |
|---|---|---|
| 1 | アプリをビルド | npm run build |
| 2 | Docker コンテナ化 | docker build -t myapp . |
| 3 | コンテナ実行 (バックエンド 8080, フロントエンド 80) | docker run -d -p 80:80 -p 8080:8080 myapp |
| 4 | Nginx でリバースプロキシ | location /api { proxy_pass http://localhost:8080; } |
| 5 | ファイアウォールで制御 | ufw allow 80/tcp |
ポイント
- 外部からは 80・443 を通じてのみアクセスさせ、内部は別ポートを使用。
- Nginx で TLS ターミネーションし、内部通信は暗号化無しで高速化。
よくある疑問と回答
| 質問 | 回答 |
|---|---|
| ポート番号は変更できない? | 予約済みポートは使えないが、アプリ側に -p xxxx などでポートを指定できる。 |
| ポートスキャンって合法? | ネットワークに対する自己スキャンは通常問題ないが、他人のネットワークに許可なくスキャンするのは違法です。 |
| セキュリティを考えると何番にするべき? | 80・443 を除き、登録済み(1024〜49151) なら自分で予約すると安心。 |
| 複数サービスが同じポートを使いたい | コンテナや仮想環境を使い、別 IP/プロキシで分けられる。 |
まとめ
- ポート番号は「IPアドレスに対する窓口」で、通信の仕分けに不可欠。
- 予約済み(0〜1023)は標準プロトコル専用、必要なときは登録済み(1024〜49151)を使う。
- 開発・運用時は ファイアウォール、Docker、TLS などでポートを管理・保護。
- 実際に試す際は
netstat、ss、nmapでポート状態を確認し、競合・漏れを防止。
これらを踏まえれば、初心者でも「ポート番号を使う」ことに対する不安は薄れ、実務で必要なスキルとして確実に身につくはずです。ぜひ、今回紹介したコマンドや設定例を試しながら、ポートの世界を自分のものにしてみてください。

コメント