ポート番号とは初心者が知るべき基本と実践的な使い方

IT入門辞典

ポート番号は、ネットワークで通信を行う際にデータを送受信する「窓口」を示す数値です。
外部から見ると、単なる「番号」や「ポート」と思われがちですが、実際にはIPアドレスと組み合わせて「エンドポイント」を一意に決定し、複数のアプリケーションが同一デバイス上で同時に通信できるようにする重要な仕組みです。
ここでは、初心者でもすぐに実践できるように、ポート番号の基本的な概念から、日常業務やサーバー構築で具体的にどう利用するかまでを順序立てて解説します。


ポート番号の基本 - 何を表している?

項目説明
IPアドレスネットワーク上でデバイスを一意に示す番号(例:192.168.1.10)
ポート番号デバイス内での通信先を示す16ビット整数(0〜65535)
エンドポイントIPアドレス + ポート番号 の組み合わせ(例:192.168.1.10:80)

ポイント

  • ポート番号は「どのアプリケーションが通信を受け取るか」を区別します。
  • 同一のIPアドレスに複数のポートが存在し、同時に複数アプリが動作可能です。
  • 既定で使われるポート(IANAが管理)は「予約済み」になっており、これを無断で使用すると競合が起きます。

主要プロトコルと代表的なポート番号

ポート番号プロトコル用途備考
20/21FTPファイル転送(データ/制御)変更可だが、セキュアではない
22SSHリモート接続ほぼ必須
23Telnet旧リモートシェル使わない方が安全
25SMTPメール送信スパム対策が必要
53DNS名前解決A レコード/MX など
67/68DHCPIP割当サーバ/クライアント
80HTTPウェブページ変更不可(標準)
110POP3メール受信変更不可
143IMAPメール受信変更不可
443HTTPSセキュアウェブ重要
3306MySQLDB接続管理者推奨
5432PostgreSQLDB接続変更可

実務で直ちに必要になる

  • サーバーローカルにアプリをデプロイする際、-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.serverhttp.server を 8000 番で立ち上げる意味。
  • もし 80 番を使いたいなら管理者権限が必要(sudo)。
sudo python3 -m http.server 80

ポートを守るためのセキュリティ対策

手法実装例説明
ファイアウォールufw allow 22/tcp特定ポートのみ開放
ポートスキャンnmap -p- 192.168.1.10開放ポートを可視化
TCP Wrappers/etc/hosts.allowIP制限でアクセス制御
IDS/IPSSuricata, Snort攻撃トラフィックを検知
TLSopenssl 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 制限も検討
  • 予期せぬポートは全て拒否

開発環境での「ポートの管理」

開発者が多くのアプリをローカルで動かすとポート競合に苦労します。以下のテクニックでスムーズに管理しましょう。

  1. Docker を利用

    services:
      web:
        image: nginx:latest
        ports:
          - "8080:80"
    
    • コンテナ内部のポートをホストへマッピング。
    • 複数コンテナを走らせても衝突しにくい。
  2. .env ファイルでポートを共通化

    APP_PORT=3000
    
    • スクリプトで読み込み、npm start --port=$APP_PORT など。
  3. ポート検索スクリプト

    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
2Docker コンテナ化docker build -t myapp .
3コンテナ実行 (バックエンド 8080, フロントエンド 80)docker run -d -p 80:80 -p 8080:8080 myapp
4Nginx でリバースプロキシ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)を使う。
  • 開発・運用時は ファイアウォールDockerTLS などでポートを管理・保護。
  • 実際に試す際は netstatssnmap でポート状態を確認し、競合・漏れを防止。

これらを踏まえれば、初心者でも「ポート番号を使う」ことに対する不安は薄れ、実務で必要なスキルとして確実に身につくはずです。ぜひ、今回紹介したコマンドや設定例を試しながら、ポートの世界を自分のものにしてみてください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント