2026年9月19日
2026年9月19日
nmap の使い方とポートスキャンの基本|自分のサーバーの公開ポートを確認する手順とサービス・PHP の露出の検出
nmap の使い方は、「どのホストの、どのポートを、どの方式で調べるか」を指定して実行し、結果の状態(open / closed / filtered)を読む、これだけです。WordPress を動かしているサーバーなら、nmap -sV -p- 自分のサーバー を一度実行するだけで、「外から見えているサービスは 22・80・443 だけか」「データベースや PHP-FPM が外に露出していないか」が分かります。
結論を先にまとめます。
- nmap は 自分が管理しているサーバー、または書面で許可を得たサーバーにだけ使います。他人のサーバーへのスキャンは利用規約違反や法的な問題になり得ます。
- 日常の確認は
nmap -sV -p- <自分のサーバー>の 1 行で足ります。全 TCP ポートを調べ、開いているポートで動くサービスの名前と版を推定します。 - WordPress のサーバーで外から開いていてよいのは、通常 22(SSH。できれば IP 制限)、80、443 だけです。3306(MySQL / MariaDB)、9000(PHP-FPM)、6379(Redis)、11211(Memcached)が open なら、すぐ閉じます。
- 結果の読み方(filtered と closed の違い、
-Pnが要る場面、結果の保存と差分)はnmap のスキャン結果の読み方で続けて説明しています。
nmap とは
nmap(Network Mapper)とは、ネットワーク上のホストに対して、どのポートが開いているか、そこで何のサービスが動いているかを調べる無料のツールです。Linux・macOS・Windows で動き、コマンドの基本形は次のとおりです。
nmap [スキャン方式] [オプション] 対象
対象にはホスト名か IP アドレスを書きます。何も指定しないと、よく使われる 1,000 個の TCP ポートを調べます。
使う前に: 許可のあるサーバーだけに使う
nmap のマニュアルは、スキャンの合法性は国や地域によって判断が分かれ、プロバイダーの利用規約に反して回線を止められる例もあるとして、対象の管理者から書面で許可を得ることを勧めています。この記事の手順はすべて「自分が契約・管理しているサーバーを、自分で確認する」ことを前提にしています。クラウドや VPS では、自分のサーバーに対するスキャンでも事業者の規約で届け出が必要な場合があるので、利用規約を確認してください。練習用には、nmap の開発元が許可している scanme.nmap.org があります(1 日に十数回程度まで)。
手順 1: インストール
# Debian / Ubuntu
sudo apt install nmap
# RHEL 系(AlmaLinux / Rocky Linux)
sudo dnf install nmap
# macOS(Homebrew)
brew install nmap
Windows は nmap.org のダウンロードページからインストーラーを入手します。GUI の Zenmap も同梱されています。
スキャンは サーバーの外から行います。サーバー自身の中で nmap localhost を実行すると、ファイアウォールで外から遮断されているポートも open に見えるためです。自宅や会社の PC、あるいは別のサーバーから実行してください。
手順 2: 全 TCP ポートを調べる
既定の 1,000 ポートでは、8443 や 10000 のような管理用ポートを見落とすことがあります。自分のサーバーの確認では、全ポート(1〜65535)を対象にします。
nmap -p- example.com
-p- は「すべてのポート」の意味です。ポートを絞るときは -p 22,80,443 や -p 1-1024 と書きます。所要時間は回線とファイアウォールの応答によって数十秒から十数分です。
管理者権限なしで実行すると TCP connect スキャン(-sT)、sudo を付けると SYN スキャン(-sS)が既定になります。どちらも結果の意味は同じで、SYN スキャンの方が速く、サーバーのログに残る接続が少ないです。自分のサーバーなら -sT で十分です。
UDP のサービス(DNS の 53、VPN の 500 / 4500 など)を確認したい場合は -sU を使います。UDP は応答が返らないことが多く、時間がかかるので、ポートを絞ってください。
sudo nmap -sU -p 53,123,500,4500 example.com
手順 3: サービスとバージョンを検出する
開いているポートで「何が」動いているかを知るには -sV を付けます。nmap が各ポートに接続して応答を照合し、サービス名と版を推定します。
nmap -sV -p- example.com
出力の例です。
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx 1.26.0
443/tcp open ssl/http nginx 1.26.0
ここで 3306 や 9000 が open と出たら、データベースや PHP-FPM が外に露出しています。WordPress は同じサーバー内の接続で足りるので、bind-address = 127.0.0.1(MySQL / MariaDB)や Unix ソケット(PHP-FPM)に変え、ファイアウォールでも閉じます。
OS の推定は -O、両方まとめるなら -A です(-A は時間がかかり、出力も多くなります)。
手順 4: NSE スクリプトで Web の露出を確かめる
nmap には Lua で書かれたスクリプト(NSE: Nmap Scripting Engine)が同梱されていて、--script で指定します。WordPress のサーバーで役に立つものを挙げます。
| スクリプト | 分かること |
|---|---|
http-php-version |
PHP の版が外から推定できるか(応答ヘッダーの X-Powered-By など)。古い PHP の特殊な応答も試す |
http-headers |
応答ヘッダーの一覧。Server や X-Powered-By に版が出ていないかを見る |
http-title |
ページのタイトル。どのポートで何のサイトが応答しているかの確認 |
ssl-cert |
証明書の発行者・有効期限 |
ssl-enum-ciphers |
TLS の版と暗号スイートの一覧。古い TLS 1.0 / 1.1 が残っていないか |
nmap -sV -p 80,443 --script http-php-version,http-headers,ssl-cert example.com
http-php-version の説明にあるとおり(2026年11月現在)、PHP 5.5.0 より後の版はこのスクリプトが使う特殊な問い合わせに応答しません。それでも、X-Powered-By: PHP/8.3.x のようにヘッダーで版を返している設定(expose_php = On)はここで見つかります。版を隠す設定はWordPress のバージョン情報を隠す方法と合わせて行ってください。
--script にはカテゴリー名も書けます。自分のサーバーの確認で使うのは default と safe の範囲にとどめ、intrusive や exploit、dos に分類されたスクリプトは本番サーバーに対して実行しないでください。負荷やサービスの停止につながります。
手順 5: WordPress サーバーで開いていてよいポート
スキャン結果と、次の表を見比べます。
| ポート | サービス | 外から open でよいか |
|---|---|---|
| 22/tcp | SSH | 管理者の IP だけに制限するのが望ましい。鍵認証にする |
| 80/tcp | HTTP | よい(HTTPS へ転送) |
| 443/tcp | HTTPS | よい |
| 21/tcp | FTP | 望ましくない。SFTP(22)に替える |
| 25/tcp | SMTP | 送信専用なら不要。受信を担うサーバー以外は閉じる |
| 3306/tcp | MySQL / MariaDB | 閉じる。127.0.0.1 だけで待ち受ける |
| 9000/tcp | PHP-FPM | 閉じる。Unix ソケットか 127.0.0.1 に限定 |
| 6379 / 11211 | Redis / Memcached | 閉じる。認証なしで外に出ていると情報漏えいにつながる |
| 8080 / 8443 / 10000 | 代替 HTTP、管理パネル | 必要なものだけ。IP 制限か Basic 認証を付ける |
不要なポートが open だったときは、まずそのサービスの設定で待ち受けアドレスを 127.0.0.1 に変え、次にファイアウォール(ufw / firewalld、クラウドならセキュリティグループや NSG)で閉じ、もう一度 nmap で確認します。閉じる手順と、再スキャン結果の保存・差分の取り方はnmap のスキャン結果の読み方と注意点に続きます。
WordPress の運用での位置づけ
ポートの確認は、サーバーを立てた直後、サーバーを移転した直後、そしてプラグインやミドルウェア(Redis、Elasticsearch など)を追加した直後に行うのが効果的です。管理画面の保護(ログイン試行の制限、2 要素認証)とは別の層で、「そもそも外から届く入口を減らす」のがこの作業の目的です。
共用のレンタルサーバーでは、ポートの開閉は事業者の管理下にあり、利用者が変えることはできません。この記事の対象は VPS・専用サーバー・クラウドで自分が管理している環境です。
よくある質問
自分のサーバーでも nmap を使うと問題になりますか
自分が契約・管理するサーバーへのスキャンは、一般には問題ありません。ただしクラウドや VPS の事業者の利用規約で、侵入テストに届け出を求めている場合があります。規約を確認し、必要なら事前に申請してください。他人のサーバーや、管理者の許可を得ていないサーバーには使わないでください。
スキャンに時間がかかりすぎます
-p- で全ポートを調べると、ファイアウォールが応答を捨てる設定の場合に長くなります。まず既定の 1,000 ポート(オプションなし)か -F(上位 100 ポート)で全体を見てから、必要な範囲だけ -p で指定すると短くなります。-T4 でタイミングを速めることもできますが、本番サーバーには既定の -T3 のままが無難です。
サーバーの中から nmap localhost を実行してもよいですか
実行はできますが、外からの見え方は分かりません。ファイアウォールで遮断しているポートも localhost からは open に見えるためです。公開状態の確認は別のマシンから行ってください。
http-php-version で何も出ません
PHP 5.5 より後の版は、このスクリプトが使う問い合わせに応答しないため、ヘッダーに版が出ていなければ結果は空です。それは「版が外から分からない」という望ましい状態です。
WordPress のプラグインの一覧も nmap で分かりますか
http-wordpress-enum のようなスクリプトがありますが、これは対象サイトに多数の問い合わせを送る種類のものです。自分のサイトの確認でも負荷がかかるので、WordPress 側の管理画面や WP-CLI(wp plugin list)で確認してください。
まとめ
- nmap は自分が管理するサーバーの入口を確認する道具として使い、他人のサーバーには使いません。
- 日常の確認は外部のマシンから
nmap -sV -p- <サーバー>。WordPress では 22・80・443 以外が open なら、待ち受けを 127.0.0.1 に変えてファイアウォールで閉じます。 --script http-php-version,http-headers,ssl-certで PHP や証明書の露出を確認し、結果の読み方と差分の取り方は続きの記事で扱います。
関連記事
- nmap のスキャン結果の読み方と注意点|open・closed・filtered の意味、WordPress サーバーで閉じるべきポート
- WordPress のバージョン情報を隠す方法
- サーバーへの不正アクセスを検知する方法
- WordPress の wp-config.php を安全に保つ方法
参考: Nmap Reference Guide – Options Summary、Port Scanning Basics(ポートの状態の定義)、Legal Issues(スキャンの合法性と許可)、NSE script http-php-version
更新履歴: 2026-11-09 全面改訂(定型文の本文を、自分のサーバーの公開ポートを確認する手順、サービス検出と NSE スクリプト、WordPress サーバーで開いていてよいポートの表に置き換え)。この記事はワードプレス博士(ライトセンド株式会社)が運営しています。