「サーバーのポートが開きっぱなしになっていないか心配」「どのポートを閉じればいいのかわからない」—インフラ担当者や情シスの方からよく聞く悩みです。ポート番号はネットワークセキュリティの基礎中の基礎ですが、きちんと棚卸しできている組織は意外と少ないものです。
この記事では、ポート番号の基本概念から攻撃者がポートを悪用する仕組み、危険なポートの特定方法と具体的な塞ぎ方まで、現場で使えるレベルで解説します。難しいツールがなくても確認できるコマンドも紹介するので、ぜひ手元のサーバーでそのまま試してみてください。

ポート番号とは?通信を振り分ける「扉番号」の仕組み
ポート番号(Port Number)とは、コンピュータがネットワーク上でどのアプリケーションと通信するかを識別するための番号です。分かりやすく例えるなら、IPアドレスがビルの住所、ポート番号がそのビルの各部屋番号にあたります。
1台のサーバーには0番から65535番まで、最大65,536個のポートが存在します。外から届いたデータパケットは、宛先ポート番号を見て「どのアプリに渡すか」が決まります。Webブラウザでサイトを開けばポート443(HTTPS)、SSHでサーバーに接続すればポート22、というように、アプリケーションごとに決まった「扉」が割り当てられているわけです。
ポート番号は役割によって3つに分類されています。
・ウェルノウンポート(0~1023番): HTTP(80番)、HTTPS(443番)、SSH(22番)など、国際標準で用途が定められているポートです。Linuxでは管理者権限(root)がなければこの範囲のポートを開けません。
・レジスタードポート(1024~49151番): MySQL(3306番)、PostgreSQL(5432番)など、特定のアプリケーションが慣習的に使うポートです。IANA(Internet Assigned Numbers Authority)に登録されています。
・ダイナミックポート(49152~65535番): OSが通信のたびに動的に割り当てる一時的なポートです。クライアント側の送信元ポートとして使われます。
通信プロトコルには TCP と UDP の2種類があり、同じポート番号でも TCP/22 と UDP/22 は別物として管理されます。SSHはTCP/22、DNSはUDP/53が主な使用プロトコルです。
攻撃者はどうポートを悪用するか
攻撃者がターゲットを狙うとき、最初に行うのが「どのポートが開いているか」を確認するポートスキャンです。開いているポートは、そのまま「攻撃できる可能性のある扉」を意味します。
攻撃の典型的な流れを想定例で示します。
想定例: 不要なポートが放置されているケース
サービス終了後も停止し忘れたデータベース(MySQL/3306番)がインターネット側から到達できる状態で残っているとします。攻撃者はNmapなどのツールで全ポートをスキャンし、このポートを発見します。古いバージョンのMySQLに既知の認証バイパス脆弱性があれば、短時間でデータベースへのアクセスを得られてしまいます。
攻撃者が特に注目するポートの状態は次のとおりです。
・不要なサービスのポートが開放されたまま: 使っていないFTPやTelnetが起動し続け、そのポートだけ公開されている状態です。メンテナンスのために一時的に開けたポートが戻し忘れになるケースも多いです。
・デフォルトのウェルノウンポートのまま運用している: SSH 22番やRDP 3389番は、自動スキャンツールが真っ先に試みるポートです。ブルートフォース攻撃の大半はこの番号を標的にします。
・サービスバージョンが外部から特定できる: 開いているポートに接続するとバージョン情報を返すサービスがあります。攻撃者はそのバージョンに対応するCVEを調べて既知の攻撃手法を試みます。
・データベースやキャッシュのポートがグローバルIPに公開されている: MySQL/3306、Redis/6379、Elasticsearch/9200などはインターネットから直接アクセスできない設定が大前提です。設定ミスで公開されているサーバーは実際に多数存在します。
主要なポート番号一覧と管理の基本
セキュリティ管理上、知っておくべき主要なポート番号と注意点をまとめます。
| ポート番号 | プロトコル | 用途 | セキュリティ上の注意点 |
|---|---|---|---|
| 21 | TCP | FTP(ファイル転送) | 平文通信のため盗聴リスクあり。SFTPまたはFTPSへの移行を推奨 |
| 22 | TCP | SSH(リモートアクセス) | ポート変更・鍵認証・接続元IP制限の3点が基本対策 |
| 23 | TCP | Telnet(リモートアクセス) | 完全平文通信。即座に停止してSSHへ移行する |
| 25 | TCP | SMTP(メール送信) | 不要なら閉鎖。スパムの踏み台になるリスクがある |
| 80 | TCP | HTTP(Web通信) | HTTPSへの強制リダイレクト設定で実質的に廃止する |
| 443 | TCP | HTTPS(暗号化Web通信) | TLS 1.2以降を使用。古い暗号スイートは無効化する |
| 3306 | TCP | MySQL | 外部からのアクセスは原則禁止。ループバック(127.0.0.1)のみ許可する |
| 3389 | TCP | RDP(Windowsリモートデスクトップ) | インターネットへの直接公開は厳禁。VPN経由のみ許可する |
| 5432 | TCP | PostgreSQL | 外部からのアクセスは原則禁止。アプリサーバーからのみ許可する |
| 6379 | TCP | Redis(キャッシュDB) | 認証なしで動作するケースが多い。絶対に外部公開しない |
| 8080・8443 | TCP | 代替HTTP・HTTPS | 開発・テスト用ポートが本番環境に残っていないか確認する |
危険なポートを塞ぐ具体的な手順
1. 現在開いているポートを把握する
まず自分のサーバーでどのポートが開いているかを確認します。Linuxサーバーであれば `ss` コマンドが最も簡単です。
# 開いているTCPポートとプロセス名を確認 ss -tlnp # TCP・UDPをまとめて確認 ss -tlnpu # 外部からの接続を受け付けているポートのみ確認 ss -tlnp | grep -v 127.0.0.1
出力の `LISTEN` 状態のポートが、現在外部からの接続を受け付けているポートです。`Local Address` 列が `0.0.0.0:22` や `:::443` になっているものは全インターフェースで受け付けており、`127.0.0.1:3306` になっているものはループバックのみです。
外部から自分のサーバーを確認したい場合は、Nmapを使った攻撃者視点のポートスキャン確認も有効です。自社ネットワーク外から実際に見えているポートを把握できます。
2. 不要なサービスを停止してポートを閉じる
開いているポートに対応するサービスが不要なら、サービスを停止することが根本的な解決策です。ファイアウォールでブロックするだけでは、サービス自体は動き続けるためリスクが残ります。
# サービスを停止して自動起動も無効化する例(Telnetの場合) sudo systemctl stop telnet.socket sudo systemctl disable telnet.socket # FTPサービスを停止する例 sudo systemctl stop vsftpd sudo systemctl disable vsftpd # サービス停止後、ポートが閉じたか確認 ss -tlnp | grep 21
3. ファイアウォールで通信を制限する
サービスが必要でも、アクセス元IPアドレスを限定することでリスクを大幅に下げられます。SSHであれば「自社のIPアドレスからのみ許可」するだけで、ブルートフォース攻撃の大部分を遮断できます。
# UFW(Ubuntu系)でSSHを特定のIPからのみ許可する例 sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp sudo ufw deny 22/tcp # MySQL/3306番をループバックのみに制限する例 sudo ufw deny 3306/tcp # ※ MySQLのbind-addressを127.0.0.1に設定することも合わせて行う # 現在の設定を確認 sudo ufw status verbose
また、ブルートフォース攻撃への対策として、fail2banを使った自動ブロック設定も組み合わせると効果的です。一定回数ログイン失敗したIPアドレスを自動的に遮断します。
4. SSHのデフォルトポートを変更する
SSH 22番ポートは、自動スキャンツールが毎秒単位で試み続けます。デフォルトポートを変更するだけで、こうした自動スキャンの大部分を回避できます。完全な対策ではありませんが、ログのノイズを劇的に減らせます。
# /etc/ssh/sshd_config の編集 # Port 22 → Port 2222 などに変更(1024番以上を推奨) # デフォルト値から変更したことをコメントで明記する Port 2222 # Changed from default 22 for security # 設定変更後はSSHを再起動 sudo systemctl restart sshd # ファイアウォールで新しいポートを許可するのを忘れずに sudo ufw allow 2222/tcp sudo ufw deny 22/tcp
SSHの詳細な強化設定については、sshd_config設定完全ガイドで全パラメータと推奨値を解説しています。
中小企業でも今日からできること
大規模なセキュリティ投資がなくても、次の3点から始めることができます。
・まず「何が開いているか」を把握する(今日できる): `ss -tlnpu` コマンドを全サーバーで実行し、開いているポートの一覧を作成します。「なぜこのポートが開いているのか」を説明できない場合は要注意です。
・Telnet・FTPのような平文通信サービスを停止する(今週中): 現在も稼働中のTelnetやFTPが見つかった場合は、すぐに代替(SSH・SFTP)に切り替えます。これらのサービスが必要な理由が見当たらないなら、即座に停止が正解です。
・データベースポートのインターネット公開を確認する(今月中): MySQL(3306)、PostgreSQL(5432)、Redis(6379)などが外部から到達できる状態になっていないか確認します。これらは内部ネットワークのみでアクセスできれば十分で、外部公開が必要なケースはほぼありません。
定期的なポート棚卸しは、中小企業向けの定期セキュリティ点検チェックリストに組み込んで習慣化するのが効果的です。
よくある誤解と注意点
【誤解1】「ファイアウォールでブロックすれば、サービスは止めなくていい」
ファイアウォールは外部からの接続を遮断しますが、サービス自体は動き続けます。ファイアウォールの設定ミスや変更によって意図せず公開される可能性があります。不要なサービスはサービス停止を根本対処とし、ファイアウォールは多層防御の一つとして位置づけましょう。
【誤解2】「ポートを変えれば安全になる」
SSH 22番を別のポートに変えることは、自動スキャンを避けるうえで有効です。しかし全ポートをスキャンする攻撃者には見つかります。ポート変更はあくまで追加の対策であり、鍵認証の強制・接続元IP制限などと組み合わせることが必要です。
【誤解3】「開発環境のポート設定は本番に関係ない」
一般的につまずきがちなのが、開発・テスト用に開けたポート(8080番や管理ポートなど)が本番環境にも残ったまま公開されているケースです。デプロイ時のポート設定確認を手順書に組み込むことが重要です。
【注意】セキュリティヘッダーやTLS設定との組み合わせも重要
ポートを正しく管理した後は、開放したポート(443番)で動くサービスの設定も見直しましょう。ポートが適切でもTLSの設定が古ければ通信の安全性は担保されません。

本記事のまとめ
| 対策項目 | 具体的なアクション | 優先度 |
|---|---|---|
| ポートの棚卸し | ss -tlnpu で開放ポートを一覧化する | 高(すぐやる) |
| Telnet・FTPの廃止 | systemctl disable で停止し、SSH・SFTPへ移行 | 高(すぐやる) |
| DBポートの内部限定 | bind-address=127.0.0.1 + UFW で外部ブロック | 高(すぐやる) |
| SSH接続元IP制限 | UFW で自社IP帯のみ許可する | 高(今週中) |
| SSHのデフォルトポート変更 | sshd_config の Port を非標準番号に変更 | 中(今月中) |
| ファイアウォールルールの整理 | 不要ルールを削除し、最小権限の原則で再構成 | 中(今月中) |
| 定期的なポートスキャン確認 | 四半期ごとにNmapで外部から確認する | 低(習慣化) |
ポート管理の核心は「必要なものだけを開け、それ以外は閉じる」というシンプルな原則です。まずは今日、`ss -tlnpu` を実行して自分のサーバーの現状を把握することから始めてみましょう。開きっぱなしのポートが見つかったとしても、それを把握して対処できることがセキュリティ向上の第一歩です。
PR
実践 パケット解析 第3版(Chris Sanders/オライリー・ジャパン)
Wiresharkを使ったパケット解析の実践的な解説書。ポートとプロトコルの通信の流れを実際のキャプチャデータで理解でき、ポート管理やネットワーク監視の理解を深めるのに最適な一冊です。
