セキュリティ対策やネットワーク管理に欠かせない〝Nmap〟。
この記事では、Nmapを使ったポートスキャンの基本から高度なnmapコマンドの使い方まで網羅的に解説しています。
Nmapとは
Nmap(Network Mapper)は、ネットワークセキュリティの評価や診断に広く利用されているオープンソースのネットワークスキャニングツールです。特にホスト検出やポートスキャンに優れており、ネットワーク内のアクティブなホストや実行中のサービス、使用されているOSの特定などに役立ちます。
例えば、新規デバイスがネットワークに接続された際、そのデバイスが予期しないポートを開いている場合があります。このようなケースでNmapを活用すると、問題を早期に発見し、適切なアクセス制限や設定変更を行うことができます。
Nmapで出来ること
ポートスキャン
Nmapの基本的な機能で、ネットワーク内のホストに対して開いているポートを確認することができます。
OSおよびバージョン検出
ホストが使用しているOSや、そのバージョン情報を特定することができます。この機能は、古いバージョンのデバイスの識別や、ネットワーク内のセキュリティポリシーの適用に役立ちます。
サービス検出
各ポートで稼働しているサービスの種類を識別します。例えば、HTTPやFTP、SMTPなどのプロトコルや、そのバージョン情報を取得することができます。
ネットワークトポロジーの確認
Nmapは、ネットワーク内でホスト間の関係やルーティングの詳細を把握するためにも使用されます。これにより、ネットワークの全体構造を視覚化し、セキュリティリスクを評価することが可能です。
スクリプトエンジン(NSE)
Nmap Scripting Engine(NSE)を活用することで、一般的なスキャン機能を超えた脆弱性スキャンや、侵入テストの一部として多様なスクリプトを実行することができます。
主な特徴
高い汎用性と多機能性
Nmapは、単なるポートスキャンにとどまらず、OSの特定、稼働しているサービスやバージョンの検出、ネットワークのトポロジー調査、脆弱性スキャンなど、多岐にわたるセキュリティ調査に対応しています。
幅広いスキャンオプション
多様なスキャン方法を提供しており、TCPスキャンやUDPスキャン、ステルススキャン(SYNスキャン)、Xmasスキャンなど、目的に応じた柔軟な調査が可能です。また、スキャン速度の調整や複数ホストの指定なども簡単に行えます。
詳細な情報収集機能
ホストに関する詳細な情報(サービスのバージョン、OSの種類とバージョン、ネットワーク機器の特定など)を収集でき、セキュリティ診断やリスク評価に役立ちます。加えて、NSE(Nmap Scripting Engine)スクリプトを用いることで、カスタマイズされた脆弱性スキャンも可能です。
クロスプラットフォーム対応
Linux、Windows、macOSなど、主要なプラットフォームに対応しています。また、出力形式も通常のテキスト形式だけでなく、XMLやGrep対応形式などを指定できるため、スキャン結果を別のツールや分析システムに取り込むことも容易です。
オープンソースで無料
Nmapはオープンソースで、商用利用が可能なライセンスのもと、無料で提供されています。そのため、世界中のセキュリティエンジニアやネットワークエンジニアにとって、欠かせないツールの一つとして支持されています。
インストール方法
Nmapは、Windows、Linux、macOSなど、主要なOSに対応しており、各OS向けのインストールファイルがNmap公式サイトで提供されています。お使いのOSに合わせてファイルをダウンロードし、インストールして下さい。
注意事項
第三者のネットワークやシステムに対して無許可でスキャンを行うことは、法律違反にあたる可能性があります。たとえセキュリティ評価の意図であっても、違法なシステム侵入やサイバー攻撃の試みと見なされ、刑事罰や民事責任を追及されるリスクが伴います。正しい知識と判断をもって、法に従った利用を心掛けましょう。
Nmapの基本的な使い方
この記事では、VirtualBox上に構築したKali Linux、及びやられアプリを用いて、Nmapの検証を行っています。
検証環境のシステム構成
OS | IPアドレス | |
---|---|---|
Nmap実行マシン | Kali Linux 2025.1(*1) | 192.168.10.11 |
ターゲットマシン | Ubuntu 8.04(*2) | 192.168.21.101 |
*1:nmapコマンドは、Kali Linuxに同梱されているNmap(バージョン:7.95)を使用します。
*2:ターゲットマシンは、やられアプリの1つであるMetasploitable2を使用します。
Nmapのコマンド構文
$ nmap [ スキャンの種類 ...] [ オプション ] { ターゲット }
スキャンの種類
スキャンの種類は、-s
から始まるスキャンタイプ指定オプションがあり、たとえば-sS
を指定することでSYNスキャン、-sU
を指定することでUDPスキャンなどを実行することが可能です。
※各スキャンの特徴は後述しています。
オプション
Nmapではスキャン結果の出力形式を指定するためのオプションも豊富に用意されており、実行結果を他のツールに利用したり、整形したりすることができます。
- -oX:XML形式
- -oG:grep形式
- -oA:複数の形式に一括出力
また、-pオプション
を用いることで、スキャン対象のポート範囲を限定することも可能です。
ターゲット
IPアドレスやドメイン名、特定のネットワーク範囲などがターゲットとして指定でき、スキャンの目的や範囲に応じて、単一のホストから複数のホストまで幅広く指定可能です。
nmapコマンドの基本的な使い方
単純なポートスキャン
$ nmap ターゲット
ヘルプの表示方法
$ nmap -h
バージョンの確認方法
$ nmap -V
例えば、Nmap実行マシンからターゲットマシンにNmapを実行すると、下記のような結果を得ることができます。
$ nmap 192.168.21.101
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-06 02:03 JST
Nmap scan report for 192.168.21.101
Host is up (0.018s latency).
Not shown: 977 filtered tcp ports (no-response)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
445/tcp open microsoft-ds
512/tcp open exec
513/tcp open login
514/tcp open shell
1099/tcp open rmiregistry
1524/tcp open ingreslock
2049/tcp open nfs
2121/tcp open ccproxy-ftp
3306/tcp open mysql
5432/tcp open postgresql
5900/tcp open vnc
6000/tcp open X11
6667/tcp open irc
8009/tcp open ajp13
8180/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 5.32 seconds
この場合、デフォルトのスキャンオプションが適用され、ターゲットマシンの標準ポートの状態を検出します。このシンプルな形式でも十分に利用価値がありますが、より詳細な情報やカスタマイズが必要な場合は、適切なオプションを指定する必要があります。
ポートスキャンの結果、Telnetが検出された際は、以下の記事をご参照ください。
Telnetは暗号化に対応しておらず、データ漏洩の危険性があるため、注意が必要です。

nmapコマンドで実行できるポートスキャンの種類
- TCPスキャン(-sT)
- SYNスキャン(-sS)
- UDPスキャン(-sU)
- Nullスキャン(-sN)
- FINスキャン(-sF)
- Xmasスキャン(-sX)
- ACKスキャン(-sA)
nmapコマンドを実行すると、下記の権限エラーが生じる場合があります。
You requested a scan type which requires root privileges.
QUITTING!
ルート権限を必要とするスキャンタイプを要求しました。
終了します。
一部スキャンモードでは、ネットワークインターフェースに対する低レベルのアクセスを行う必要があり、この操作にはroot権限が必要です。
このような権限エラーが生じる場合は、sudoコマンドを使って管理者権限でnmapを実行して下さい。
Windows環境では、コマンドプロンプトまたはPowerShellを「管理者として実行」した上で、nmapを実行してください。
TCPスキャン(-sT)
$ nmap -sT 192.168.21.101
TCPスキャンは、最も基本的なスキャン手法であり、ターゲットの各ポートに対してTCP接続を試みます。具体的には、3ウェイハンドシェイクを使用して、ポートが開いているかどうかを判断します。
SYNスキャン(-sS)
$ nmap -sS 192.168.21.101
SYNスキャンは、「ハーフオープンスキャン」とも呼ばれ、実際に接続を完了させずにポートの状態を確認する方法です。TCP接続を完全に確立しないため、検出されにくく、高速にスキャンを行うことが可能です。
UDPスキャン(-sU)
$ nmap -sU 192.168.21.101
UDPスキャンは、UDPベースのサービスが稼働しているかどうかを確認するためのスキャン手法です。TCPと異なり、UDPは接続確認の仕組みを持たないため、スキャン結果が不確定な場合が多くなります。
Nullスキャン(-sN)
$ nmap -sN 192.168.21.101
Nullスキャンは、TCPヘッダーのすべてのフラグをオフにした状態でパケットを送信し、ポートの状態を確認するスキャン手法です。
FINスキャン(-sF)
$ nmap -sF 192.168.21.101
FINスキャンは、TCPフラグのFINビットのみをオンにして、パケットを送信するスキャン手法です。
Xmasスキャン(-sX)
$ nmap -sX 192.168.21.101
Xmasスキャンは、TCPヘッダーのFIN、PSH、URGフラグをすべてオンにした異常パケットを送信するスキャン手法です。
ACKスキャン(-sA)
$ nmap -sA 192.168.21.101
ACKスキャンは、ポートの開閉ではなく、ファイアウォールやフィルタリングの有無を確認するための手法です。
nmapコマンドで確認できるポートの状態
Nmapによって示される各状態から、通信の許可状況やフィルタリングの有無、セキュリティ上のリスクを評価することができます。
- open
- closed
- filtered
- unfiltered
- open|filtered
- closed|filtered
open
open状態は、指定したポートが開放され、接続が可能であることを示しています。オープンなポートは、特定のサービスが稼働しているため、脆弱性が存在する場合、攻撃者によって悪用されるリスクが極めて高くなります。管理者は、必要なポートのみを開放し、不要なポートを閉じることで、セキュリティのリスクを軽減できます。
closed
closed状態のポートはアクセス可能ですが、そのポートで待ち受けているアプリケーションがない状態です。外部からの攻撃リスクは低いとされますが、応答があるため存在が確認されます。ネットワークの構成やデバイスの種類を推測されるリスクがあり、可能であればファイアウォール設定で接続を拒否することが推奨されます。
filtered
filtered状態は、指定したポートがファイアウォールやその他のセキュリティデバイスによりフィルタリングされ、Nmapが接続の可否を判断できない状態です。この状態は、アクセス制御リスト(ACL)やセキュリティルールが適用されているため、外部からのスキャンを防止し、攻撃者にとって情報収集が難しくなります。
unfiltered
unfilteredと表示されるポートは、Nmapがポートへアクセスできるものの、該当ポートの状態が判別できない状態です。この状態は通常、ACKスキャンで発生します。
open|filtered
open|filtered状態のポートは、Nmapがopenかfilteredかを判断できない場合に表示されます。この状態は主にUDPスキャンやFinスキャンで発生し、ターゲットからの応答が得られない状況を示しています。
closed|filtered
closed|filtered状態は、ポートがclosedかfilteredかをNmapが判断できない状態です。通常のスキャンでは使用せず、IPID Idleスキャンの時だけに使用される状態です。
nmapコマンドの出力形式を指定する
nmapコマンドは、スキャン結果の出力形式を柔軟に指定できるため、データ連携や解析手法に応じた形式での保存が可能です。
- 通常の形式(-oN ファイル名)
- XML形式(-oX ファイル名)
- Grep可能な形式(-oG ファイル名)※廃止予定
- すべての形式を一括出力(-oA ベースファイル名)
通常の形式(-oN ファイル名)
$ nmap -oN output.nmap 192.168.21.101
デフォルトの形式で、ホストのIPアドレス、スキャン対象のポート、ステータスが整理され、視覚的確認が可能です。
XML形式(-oX ファイル名)
$ nmap -oX output.xml 192.168.21.101
XMLフォーマットは、他のプログラムやスクリプトでのデータ処理に適しており、Nmapの出力を自動解析する際に役立ちます。
Grep可能な形式(-oG ファイル名)※廃止予定
$ nmap -oG output.gnmap 192.168.21.101
スクリプトやコマンドラインでフィルタリングする際に適しており、大規模なスキャン結果から必要な情報のみを抽出可能です。
すべての形式を一括出力(-oA ベースファイル名)
$ nmap -oA output 192.168.21.101
一括出力では、通常形式、XML形式、Grep可能な形式の全てを一度に保存でき、各用途に応じたフォーマットが利用可能です。
nmapコマンドの高度な使い方
ポートスキャンを効率的に利用するためには、ホストの発見やターゲットの指定を行うスキャンオプションが役立ちます。
- ホストの探索
- リストスキャン(-sL)
- PINGスキャン(-sn)
- ホスト検出(Ping)を行わない(-Pn)
- DNSの名前解決を行わない(-n)
- ポートの指定
- ポートを明示的に指定
- 高速スキャン(-F)
- ターゲットを指定
- 複数のホストを指定
- ファイルで指定
- 詳細情報を取得
- 稼働しているサービスのバージョンを確認(-sV)
- OS検出(-O)
- ネットワーク経路を取得(--traceroute)
- アグレッシブモード(-A)
- スキャン結果を詳細に表示
- スキャン結果の根拠を表示(--reason)
- スキャンの速度を指定(-T0,-T1,-T2,-T3,-T4,-T5)
- NSEスクリプトを実行(--script、-sC)
ホストの探索
リストスキャン(-sL)
$ nmap -sL 192.168.21.101,102,103 192.168.222.10-15
このスキャンは、ポートスキャンを行わずにホストのIPアドレスを一覧化する機能です。リストスキャンでは単に対象ホストのアドレスを一覧化するだけのため、ポートスキャンの準備段階で利用されます。
※単純にリストアップするだけで、ホストへのパケット送信は行いません。
PINGスキャン(-sn)
$ nmap -sn 192.168.21.0/24
PINGスキャンは、ホストがオンラインであるかを判断するための基本的なスキャンです。このスキャンではICMPエコー要求を送信し、その応答に基づいてホストの稼働状況を確認します。ホストの稼働状態を迅速に把握するのに便利ですが、ファイアウォールでICMPパケットが遮断していると、応答が得られない可能性があります。
ホスト検出(Ping)を行わない(-Pn)
$ nmap -Pn 192.168.21.101
通常のスキャンではホストが稼働しているかを確認するためにPINGを送信しますが、-Pnオプション
を指定すると、このプロセスをスキップし、ホストがオンラインであると仮定してスキャンを実行します。この方法は、ICMP応答が制限されているネットワークや、ファイアウォールによってPINGが遮断されている環境で有効です。
DNSの名前解決を行わない(-n)
$ nmap -n 192.168.21.101
通常、NmapはIPアドレスをホスト名に変換するためにDNS解決を行いますが、このオプションによりIPアドレスのみでスキャンを行います。これにより、スキャン時間の短縮やネットワーク帯域の節約に役立ち、大規模なスキャンを効率的に行いたい場合に適しています。
ポートの指定
ポートを明示的に指定
$ nmap -p 22 192.168.21.101
$ nmap -p 22,80,443 192.168.21.101
単一ポートのみをスキャンしたい場合は-p 22
と入力し、複数ポートを対象にする場合は-p 22,80,443
のようにカンマで区切って入力します。
$ nmap -p 1-1024 192.168.21.101
範囲指定も可能で-p 1-1024
のように指定することで、特定の範囲内のポートだけを効率よくスキャンすることができます。
$ nmap -p- 192.168.21.101
-p-を設定することで、全てのポート(1番から65535番まで)をスキャンすることもできます。
高速スキャン(-F)
$ nmap -F 192.168.21.101
通常のスキャンでは1,000ポートを対象とするため、スキャンにかかる時間が長くなることがあります。高速スキャン(Fast Scan:-F)では、スキャン対象を主要な100ポートに限定することで、スキャン時間を大幅に短縮することができます。
ターゲットを指定
複数のホストを指定
ネットワークセグメントで指定
$ nmap 192.168.21.0/24
複数のホストを指定
$ nmap 192.168.21.101,232 192.168.22.1
範囲指定
$ nmap 192.168.21.101-120
ファイルで指定
$ cat target.txt
192.168.21.101
192.168.21.130
192.168.21.157
$ nmap -iL target.txt
Nmapで多数のホストをスキャンする場合、ファイルで一括指定すると便利です。-iLオプション
を使うことで、あらかじめ作成したリストを読み込ませることができ、スクリプト化や自動化にも最適です。
詳細情報を取得
稼働しているサービスのバージョンを確認(-sV)
$ nmap -sV 192.168.21.101
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-06 05:11 JST
Nmap scan report for 192.168.21.101
Host is up (0.014s latency).
Not shown: 977 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.3.4
22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)
23/tcp open telnet Linux telnetd
25/tcp open smtp Postfix smtpd
53/tcp open domain ISC BIND 9.4.2
80/tcp open http Apache httpd 2.2.8 ((Ubuntu) DAV/2)
111/tcp open rpcbind 2 (RPC #100000)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
512/tcp open exec?
513/tcp open login?
514/tcp open shell?
1099/tcp open java-rmi GNU Classpath grmiregistry
1524/tcp open bindshell Metasploitable root shell
2049/tcp open nfs 2-4 (RPC #100003)
2121/tcp open ftp ProFTPD 1.3.1
3306/tcp open mysql?
5432/tcp open postgresql PostgreSQL DB 8.3.0 - 8.3.7
5900/tcp open vnc VNC (protocol 3.3)
6000/tcp open X11 (access denied)
6667/tcp open irc UnrealIRCd
8009/tcp open ajp13 Apache Jserv (Protocol v1.3)
8180/tcp open http Apache Tomcat/Coyote JSP engine 1.1
Service Info: Hosts: metasploitable.localdomain, irc.Metasploitable.LAN; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 179.39 seconds
-sVオプション
を指定することで、各ポートで稼働するサービスの詳細なバージョン情報を取得できます。この情報により、古いバージョンやセキュリティホールが残されているサービスを特定しやすくなります。
OS検出(-O)
$ nmap -O 192.168.21.101
ターゲットマシンのOSを特定するために-Oオプション
を使用します。
ネットワーク経路を取得(--traceroute)
$ nmap --traceroute 192.168.21.101
--tracerouteオプション
を使用することで、ターゲットマシンまでのネットワーク経路情報を収集できます。ネットワーク経路の把握は、トラブルシューティングや攻撃ルートの可視化に役立ち、より効果的なネットワーク管理が可能となります。
アグレッシブモード(-A)
$ nmap -A 192.168.21.101
アグレッシブモードでは、OS検出(-O)、バージョンスキャン(-sV)、スクリプトスキャン(--script)、およびtraceroute(--traceroute)の情報収集を一度に行います。調査時間を短縮できる反面、トラフィックを増加させるため、ターゲットマシンへの負荷が高まる点に注意が必要です。
スキャン結果を詳細に表示
$ nmap -v 192.168.21.101
$ nmap -vv 192.168.21.101
スキャン結果を詳細に表示するためには、-vオプション
、-vvオプション
を使います。
- -v : 詳細に表示
- -vv : より詳細に表示
スキャン結果の根拠を表示(--reason)
$ nmap --reason 192.168.21.101
--reasonオプション
を使用することで、スキャン結果の判断理由を確認できます。このオプションにより、各ポートが特定の状態と判断された根拠を出力し、結果の信頼性を高めるための参考情報として利用できます。
スキャンの速度を指定(-T0,-T1,-T2,-T3,-T4,-T5)
$ nmap -T4 192.168.21.101
-Tオプション
を使用して、スキャンの速度を6段階から選択できます。速度を上げるとターゲットマシンへの負荷が増えるため、注意が必要です。
- -T0 : 非常に低速
- -T1 : やや低速
- -T2 : 低速
- -T3 : デフォルト
- -T4 : 公式サイト推奨
- -T5 : 高速
NSEスクリプトを実行(--script、-sC)
NmapにはNSE(Nmap Scripting Engine)スクリプトが用意されており、--scriptオプション
で実行できます。NSEスクリプトを使うと、サービスの脆弱性診断や詳細なネットワーク情報の収集が自動化され、効率的なセキュリティ分析が可能です。
デフォルトのスクリプトセットを使用してスクリプトスキャンを実行する
$ nmap --script=default 192.168.21.101
--scriptオプション
にファイル名、スクリプトカテゴリ、およびディレクトリを指定して、特定のスクリプトスキャンを実行することも可能です。
デフォルトのスクリプトセットの場合、-sCオプション
でもOK。
$ nmap -sC 192.168.21.101
Nmap攻撃からサーバーを守る方法
Nmapはネットワークの調査や脆弱性の発見に利用できるツールとして、セキュリティ診断やシステム監査に広く利用される一方、攻撃者がサーバーの脆弱性を探るために使用するケースも多々あります。Nmap攻撃からサーバーを守るためには、単一のセキュリティ対策に頼るのではなく、複数の防御手段を組み合わせることで、侵入リスクを最小限に抑えることができます。
- OS・ソフトウェアのアップデート
- 不要なポートを閉じる
- サーバーログの監視
- ファイアウォールやIDS/IPS(侵入検知・防止システム)で異常な通信を検知
- 定期的な脆弱性診断
まとめ:Nmapを活用して自分のサーバーを守る
Nmapは、サーバーのセキュリティ対策に欠かせないツールです。正しい使い方をマスターすることで、脆弱性の早期発見や攻撃の防止が可能になります。
しかし、第三者のサーバーやネットワークに対して無断で実行することは法的リスクを伴います。必ず自分が管理する環境で使用するようにしましょう。