この記事の要点
• ポート番号は0-65535の範囲で、同一IPアドレスで複数のサービスを識別する
• 0-1023がウェルノウンポート、1024-49151が登録済み、49152-65535が動的ポート
• 主要ポートは22/SSH、80/HTTP、443/HTTPSなど
ポート番号とは
ポート番号は、1つのIPアドレス内で複数のネットワークサービスを識別するための16ビットの番号(0-65535)です。IPアドレスが「建物の住所」なら、ポート番号は「部屋番号」に相当します。
なぜ必要か: 1台のサーバーでWebサーバー、メールサーバー、データベースなど複数のサービスを同時に動かすために、ポート番号でサービスを区別します。
ポート番号の範囲
ポート番号は用途に応じて3つの範囲に分類されます。
| 範囲 | 名称 | 用途 | 例 |
|---|---|---|---|
| 0-1023 | ウェルノウンポート(Well-Known Ports) | 標準的なサービス | HTTP(80), HTTPS(443), SSH(22) |
| 1024-49151 | 登録済みポート(Registered Ports) | 特定のアプリケーション | MySQL(3306), PostgreSQL(5432) |
| 49152-65535 | 動的/プライベートポート(Dynamic/Private Ports) | 一時的な通信(クライアント側) | ブラウザの接続など |
ポイント: ウェルノウンポート(0-1023)を使用するには通常、管理者権限が必要です。開発環境では8000、3000など登録済みポート以上を使います。
ウェルノウンポート(0-1023)
システム管理者権限がないと利用できない、標準的なサービス用のポートです。
主要なウェルノウンポート
| ポート | プロトコル | サービス | 用途 |
|---|---|---|---|
| 20, 21 | TCP | FTP | ファイル転送(データ/制御) |
| 22 | TCP | SSH | セキュアシェル、リモートログイン |
| 23 | TCP | Telnet | リモートログイン(非暗号化、非推奨) |
| 25 | TCP | SMTP | メール送信 |
| 53 | TCP/UDP | DNS | ドメイン名解決 |
| 80 | TCP | HTTP | Webサーバー |
| 110 | TCP | POP3 | メール受信 |
| 143 | TCP | IMAP | メール受信(サーバー上で管理) |
| 443 | TCP | HTTPS | 暗号化Webサーバー |
| 465 | TCP | SMTPS | SMTP over SSL/TLS |
| 587 | TCP | SMTP | メール送信(STARTTLS) |
| 993 | TCP | IMAPS | IMAP over SSL/TLS |
| 995 | TCP | POP3S | POP3 over SSL/TLS |
Web関連の重要ポート
# HTTP(非暗号化)
curl http://example.com:80/ # ポート80(デフォルトで省略可)
# HTTPS(暗号化)
curl https://example.com:443/ # ポート443(デフォルトで省略可)
セキュリティのヒント: 2025年以降、主要ブラウザはHTTP(ポート80)を「安全でない」と警告します。本番環境では常にHTTPS(ポート443)を使用しましょう。
SSH(リモート接続)
# SSH接続(デフォルトポート22)
ssh user@example.com
# カスタムポートを指定
ssh -p 2222 user@example.com
注意: Telnet(ポート23)は通信が暗号化されないため、パスワードが平文で送信されます。必ずSSH(ポート22)を使用してください。
DNS(名前解決)
# DNS問い合わせ(UDPポート53)
dig @8.8.8.8 example.com
# TCP版DNS(主にゾーン転送や大きな応答)
dig @8.8.8.8 +tcp example.com
メール関連ポート
| 用途 | ポート | プロトコル | 暗号化 |
|---|---|---|---|
| メール送信(クライアント→サーバー) | 587 | SMTP(STARTTLS) | 推奨 |
| メール送信(サーバー間転送) | 25 | SMTP | なし |
| メール送信(旧方式) | 465 | SMTPS | あり(非推奨) |
| メール受信 | 993 | IMAPS | あり(推奨) |
| メール受信 | 995 | POP3S | あり |
| メール受信(非暗号化) | 110/143 | POP3/IMAP | なし(非推奨) |
登録済みポート(1024-49151)
特定のアプリケーションやサービスが使用する、IANAに登録されたポートです。
データベースのポート
| ポート | データベース | 用途 |
|---|---|---|
| 3306 | MySQL / MariaDB | リレーショナルデータベース |
| 5432 | PostgreSQL | リレーショナルデータベース |
| 27017 | MongoDB | NoSQLドキュメントDB |
| 6379 | Redis | インメモリKVS |
| 9042 | Cassandra | 分散NoSQL |
| 1433 | MS SQL Server | Windowsデータベース |
| 1521 | Oracle DB | エンタープライズDB |
# MySQLへの接続
mysql -h localhost -P 3306 -u user -p
# PostgreSQLへの接続
psql -h localhost -p 5432 -U user -d database
# Redisへの接続
redis-cli -h localhost -p 6379
開発サーバーでよく使うポート
| ポート | 用途 | フレームワーク/ツール |
|---|---|---|
| 3000 | 開発サーバー | React, Next.js, Express |
| 4200 | 開発サーバー | Angular |
| 5000 | 開発サーバー | Flask(Python) |
| 5173 | 開発サーバー | Vite |
| 8000 | 開発サーバー | Django, Python HTTP Server |
| 8080 | 開発サーバー | Tomcat, 代替HTTP |
| 8888 | 開発サーバー | Jupyter Notebook |
| 9000 | 開発サーバー | PHP-FPM |
# Node.js開発サーバー
npm run dev # ポート3000が一般的
# Pythonシンプルサーバー
python -m http.server 8000 # ポート8000
# Djangoの開発サーバー
python manage.py runserver 8000 # ポート8000
その他の重要なポート
| ポート | サービス | 用途 |
|---|---|---|
| 3389 | RDP | Windowsリモートデスクトップ |
| 5060, 5061 | SIP | VoIP通信 |
| 8443 | HTTPS代替 | 開発環境のHTTPS |
| 9200 | Elasticsearch | 全文検索エンジン |
| 11211 | Memcached | 分散メモリキャッシュ |
実践メモ: ポート3000、8000、8080などは開発環境でよく使われます。本番環境では通常80/443を使い、リバースプロキシで振り分けます。
動的ポート(49152-65535)
クライアント側が一時的に使用するポート範囲です。IANA(Internet Assigned Numbers Authority)の管理外です。
動的ポートの役割
クライアント(ブラウザ) サーバー
192.168.1.10:52341 ─────→ example.com:443 (HTTPS)
↑ ↑
動的に割り当て ウェルノウンポート
レスポンス
192.168.1.10:52341 ←───── example.com:443
クライアント側の動的ポート使用例
# 接続状態を確認
netstat -an | grep ESTABLISHED
# 出力例
tcp4 0 0 192.168.1.10.52341 93.184.216.34.443 ESTABLISHED
└─ クライアント側 └─ サーバー側
(動的ポート) (ウェルノウン)
OSの管理: OSが空いているポート番号を自動的に選んで割り当てます。通信終了後は解放され、再利用されます。
ポート番号とプロトコル(TCP/UDP)
同じポート番号でもTCPとUDPは別々に管理されます。
TCP/UDP両方を使うポート
| ポート | サービス | TCPの用途 | UDPの用途 |
|---|---|---|---|
| 53 | DNS | ゾーン転送、大きな応答 | 通常のクエリ(512バイト以下) |
| 123 | NTP | — | 時刻同期 |
| 161 | SNMP | — | ネットワーク機器の監視 |
| 500 | IKE | — | IPsec鍵交換 |
TCPのみ/UDPのみのポート
TCPのみ:
- 22 (SSH)
- 80 (HTTP)
- 443 (HTTPS)
- 3306 (MySQL)
UDPのみ:
- 67, 68 (DHCP)
- 69 (TFTP)
- 123 (NTP)
ポイント: TCPは信頼性重視(Web、DB、SSH)、UDPは速度重視(DNS、動画ストリーミング、ゲーム)で使い分けます。
ポート番号の確認方法
使用中のポートを確認
# すべての待ち受けポートを表示
netstat -an | grep LISTEN # macOS/Linux
netstat -an | findstr LISTEN # Windows
# 特定のポートを確認(例: 3000番)
lsof -i :3000 # macOS/Linux
netstat -ano | findstr :3000 # Windows
# プロセス情報付きで表示
sudo lsof -i -P -n # macOS/Linux
netstat -ano # Windows
ポートが使われているかテスト
# Telnetでポート疎通確認
telnet example.com 80
# ncコマンドでポート確認
nc -zv example.com 80 # macOS/Linux
# curlでHTTP/HTTPSポート確認
curl -I http://example.com:80/
ファイアウォールとポート
ポートの開放
# ufw(Ubuntu/Debian)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# firewalld(CentOS/RHEL)
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
# iptables
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
セキュリティグループ(AWS EC2例)
インバウンドルール:
Type Protocol Port Range Source
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0
SSH TCP 22 123.45.67.89/32 # 自分のIPのみ
Custom TCP TCP 3000 10.0.0.0/16 # VPC内のみ
注意: 不要なポートは必ず閉じてください。特にSSH(22)、RDP(3389)、データベース(3306、5432)を全開放すると攻撃の標的になります。
よくあるポート番号の問題
ポート番号の競合
# エラー例
Error: listen EADDRINUSE: address already in use :::3000
原因: すでに別のプロセスがポート3000を使用している
解決方法:
# プロセスを特定して終了(macOS/Linux)
lsof -ti:3000 | xargs kill -9
# Windowsの場合
netstat -ano | findstr :3000
taskkill /PID <プロセスID> /F
# または別のポートを使用
PORT=3001 npm run dev
ポート範囲の制限
# 一般ユーザーが使えるポート範囲(Linux)
1024-65535
# 管理者権限が必要なポート範囲
0-1023
アプリケーション別ポート一覧
Webアプリケーション
| サービス | デフォルトポート | カスタム例 |
|---|---|---|
| Nginx | 80, 443 | 8080, 8443 |
| Apache | 80, 443 | 8080, 8443 |
| Tomcat | 8080 | 8005, 8009 |
| Node.js (Express) | 3000 | 任意 |
データベース(再掲)
| データベース | ポート |
|---|---|
| MySQL / MariaDB | 3306 |
| PostgreSQL | 5432 |
| MongoDB | 27017 |
| Redis | 6379 |
| Cassandra | 9042 |
| Elasticsearch | 9200 |
キャッシュ・メッセージング
| サービス | ポート |
|---|---|
| Redis | 6379 |
| Memcached | 11211 |
| RabbitMQ | 5672 (AMQP), 15672 (管理UI) |
| Kafka | 9092 |
モニタリング・ログ
| サービス | ポート |
|---|---|
| Prometheus | 9090 |
| Grafana | 3000 |
| Kibana | 5601 |
| Logstash | 5044 |
ポート転送(ポートフォワーディング)
SSHトンネル
# ローカルポート転送(リモートのMySQLにローカルから接続)
ssh -L 3306:localhost:3306 user@remote-server
# リモートポート転送(ローカルのサービスをリモートに公開)
ssh -R 8080:localhost:3000 user@remote-server
# 動的ポート転送(SOCKSプロキシ)
ssh -D 1080 user@remote-server
Docker のポートマッピング
# コンテナのポート80をホストの8080にマッピング
docker run -p 8080:80 nginx
# 複数ポートのマッピング
docker run -p 80:80 -p 443:443 nginx
まとめ
ポート番号は0-65535の16ビット番号で、同一IPアドレスで複数のサービスを識別します。0-1023がウェルノウンポート(HTTP=80、HTTPS=443、SSH=22など)、1024-49151が登録済みポート(MySQL=3306、PostgreSQL=5432など)、49152-65535が動的ポート(クライアント側の一時利用)です。開発環境では3000、8000などを使い、本番環境では80/443を使うのが一般的です。不要なポートは必ず閉じてセキュリティを確保しましょう。
実践メモ: 開発時に「ポートが既に使われている」エラーが出たら、`lsof -i :ポート番号`でプロセスを特定して終了するか、別のポートを使用しましょう。
参考リソース
- IANA - Service Name and Transport Protocol Port Number Registry
- RFC 6335 - Internet Assigned Numbers Authority (IANA) Procedures for Port Assignments
- Wikipedia - List of TCP and UDP port numbers
- SpeedGuide.net - Port Database