世界で最も有名なポートスキャンの定番ツール
- Nmap -

Nmapは、ポートスキャンをはじめ、OS検出、サービスのバージョン確認、ネットワーク経路の取得まで幅広くこなせるオープンソースのネットワークスキャンツールです。

本記事では、Nmapの特徴からインストール手順、nmapコマンドの使い方、代表的なオプションの使用方法まで、具体的なコマンド例を交えて解説します。

目次

Nmapとは

Nmap(Network Mapper)は、ネットワークのセキュリティ評価や脆弱性診断に広く利用されているオープンソースのネットワークスキャンツールです。特にポートスキャンに優れており、ネットワーク上で稼働しているホストの洗い出し、開放ポートの検出、稼働サービスの識別、OSの推定などに利用できます。

例えば、新たな機器をネットワークに接続した際、意図しないポートが開放されている場合があります。Nmapを利用して定期的にスキャンすることで、このような問題を早期に発見し、アクセス制限や設定変更といった対策につなげることができます。

主な特徴

幅広いスキャンオプション

多様なスキャン方法を提供しており、TCPスキャンやUDPスキャン、ステルススキャン(SYNスキャン)、Xmasスキャンなど、目的に応じた柔軟な調査が可能です。また、スキャン速度の調整や複数ホストの指定なども簡単に行えます。

OS・サービス検出

各ポートで稼働しているサービスおよびミドルウェアを識別します。具体的には、HTTP、FTP、SMTPといったプロトコルの種類や、稼働しているソフトウェアのバージョン情報を取得します。また、ホストで稼働しているOSの種類とバージョンも推定できます。この機能により、サポートが終了した古いOS・ミドルウェアを使用している機器を洗い出し、ネットワーク内のセキュリティポリシーが順守されているかを確認できます。

ネットワーク経路の確認

Nmapは、ネットワーク上のホストやポート、稼働しているサービスを調査するだけでなく、対象ホストまでのネットワーク経路を確認することも可能です。

スクリプトエンジン(NSE)

Nmap Scripting Engine(NSE)を活用することで、一般的なスキャン機能を超えた脆弱性スキャンや、侵入テストの一部として多様なスクリプトを実行することができます。

クロスプラットフォーム対応

Linux、Windows、macOSなど、主要なプラットフォームに対応しています。また、出力形式も通常のテキスト形式だけでなく、XMLやGrep対応形式などを指定できるため、スキャン結果を別のツールや分析システムに取り込むことも容易です。

オープンソース・無料

Nmapはオープンソースで、商用利用が可能なライセンスのもと、無料で提供されています。そのため、世界中のセキュリティエンジニアやネットワークエンジニアにとって、欠かせないツールの一つとして支持されています。

注意事項

本記事の内容は、Nmapの正しい利用方法を学ぶことを目的としています。他者が管理するシステムへのスキャンは、たとえ学習目的や善意の脆弱性診断であっても、サイバー攻撃とみなされる可能性があります。許可を得ていない環境では、絶対に使用しないでください。学習目的で試す場合は、やられアプリや自身で構築した検証環境を使用してください。

本記事では、Windowsマシン上の仮想ネットワークに構築したやられアプリを対象に、Nmapの動作を検証しています。

Nmapのインストール

Nmapは、Windows、Linux、macOSなど、主要なOSに対応しており、各OS向けのインストールプログラムがNmap公式サイトで提供されています。お使いのOSに合わせてファイルをダウンロードし、インストールして下さい。

提供されているインストールファイル
  • Windows向け:.exe形式
  • Linux向け:.rpm形式
  • macOS向け:.dmg形式

(注)Debian系ディストリビューションで広く採用されている.deb形式のパッケージは提供されていません。

主要なLinuxディストリビューションでは、標準搭載のパッケージマネージャ(APT、DNFなど)からインストールすることも可能です。

# Debian系の場合(Ubuntuなど)
$ sudo apt update
$ sudo apt install nmap

# RHEL系の場合(AlmaLinuxなど)
$ sudo dnf install nmap

なお、Kali LinuxやParrotOSなどセキュリティ診断向けのディストリビューションでは、標準構成でNmapがプリインストールされているため、別途インストールする必要はありません。

Nmapには、ICMP・TCP・UDPなど多様なパケットを送信できる疎通確認ツール「Nping」が同梱されています。

本記事で使用する実行環境

本記事では、VirtualBox上に構築したKali Linux、及びMetasploitable2を用いて、Nmapの動作検証を行います。

システム構成

OSIPアドレス
Nmap実行マシンKali Linux 2025.1192.168.10.11
ターゲットマシンMetasploitable2192.168.21.101
  • nmapコマンドは、Kali Linuxに同梱されているNmap(バージョン:7.95)を使用します。
  • ターゲットマシンは、やられアプリの1つであるMetasploitable2を使用します。

Nmapの使い方

Nmapはコマンドラインインターフェース(CLI)で動作するため、ターミナル(Windowsの場合はコマンドプロンプトまたはPowerShell)上でnmapコマンドを実行します。

GUIで操作したい場合は、公式のGUIツールであるZenmapをご利用ください。

nmapコマンドの基本構文

$ nmap [スキャンタイプ] [オプション] <ターゲット>

スキャンタイプ

用途に応じて、スキャンタイプを切り替えることができます。

オプション概要
TCP connectスキャン-sT最も基本的なスキャン。ターゲットの各ポートに対してTCP接続を試みます。具体的には、3ウェイ・ハンドシェイクを使用して、ポートが開いているかどうかを判断します。
SYNスキャン-sS「ハーフオープンスキャン」とも呼ばれ、実際に接続を完了させずにポートの状態を確認する。TCP接続を完全に確立しないため、検出されにくく、高速にスキャンを行うことが可能です。
UDPスキャン-sUUDPサービスが稼働しているかどうかを確認するためのスキャン。TCPとは異なり、UDPは接続確認の仕組みを持たないため、スキャン結果が不確定な場合が多くなります。
Nullスキャン-sNTCPヘッダーのすべてのフラグをオフにした状態でパケットを送信し、ポートの状態を確認する。
FINスキャン-sFTCPフラグのFINビットのみをオンにして、パケットを送信する。
Xmasスキャン-sXTCPヘッダーのFIN、PSH、URGフラグをすべてオンにした異常パケットを送信する。
ACKスキャン-sAポートの開閉ではなく、ファイアウォールやフィルタリングの有無を確認する。

スキャンタイプを指定しない場合、実行ユーザーの権限に応じて、適用されるスキャンタイプが決まります。

  • Rawパケットを送信する権限を持つ場合:SYNスキャン(-sS)
  • Rawパケットを送信する権限を持たない場合:TCP connectスキャン(-sT)

オプション

Nmapは豊富なオプションを備えており、用途に応じてスキャン内容を柔軟に設定できます。代表的なオプションの使い方については、後述の「主なオプションの使用例」をご覧ください。

ターゲット

IPアドレスやドメイン名、ネットワーク範囲などがターゲットとして指定でき、スキャンの目的や範囲に応じて単一のホストから複数のホストまで幅広く指定可能です。

# 単一ホスト
$ nmap 192.168.21.101
$ nmap example.com

# ネットワークセグメント
$ nmap 192.168.21.0/24

# 複数ホスト
$ nmap 192.168.21.101,232 192.168.22.1

# 範囲指定
$ nmap 192.168.21.101-120

Nmapで多数のホストをスキャンする場合、ファイルで一括指定すると便利です。-iLオプションを使うことで、あらかじめ作成したリストを読み込ませることができ、スクリプト化や自動化にも最適です。

$ cat target.txt
192.168.21.101
192.168.21.130
192.168.21.157

$ nmap -iL target.txt

Nmapのバージョン、ヘルプは以下のコマンドで確認できます。

バージョンの確認方法

$ nmap -V

ヘルプの表示方法

$ nmap -h

nmapコマンドの実行例

例えば、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

この場合、デフォルトのスキャンオプションが適用され、ターゲットマシンの標準ポートの状態を検出します。このシンプルな実行結果でも十分に利用価値がありますが、より詳細な情報やカスタマイズが必要な場合は、適切なオプションを指定します。

Nmapで確認できるポートの状態

ポートの状態概要
openopen状態は、指定したポートが開放され、接続が可能であることを示しています。オープンなポートは、接続可能なサービスが稼働しているため、もし脆弱性が存在する場合、攻撃者によって悪用されるリスクが極めて高くなります。管理者は、必要なポートのみを開放し、不要なポートを閉じることで、セキュリティのリスクを軽減できます。
closedclosed状態のポートはアクセス可能ですが、そのポートで待ち受けているサービスがない状態です。外部からの攻撃リスクは低いですが、応答があるため存在が確認されます。ネットワークの構成やデバイスの種類を推測されるリスクがあり、可能であればファイアウォール設定で接続を拒否することが推奨されます。
filteredfiltered状態は、指定したポートがファイアウォールやその他のセキュリティデバイスによりフィルタリングされ、Nmapが接続の可否を判断できない状態です。この状態は、アクセス制御リスト(ACL)やセキュリティルールが適用されているため、外部からのスキャンを防止し、攻撃者にとって情報収集が難しくなります。
unfilteredunfilteredと表示されるポートは、Nmapがポートへアクセスできるものの、該当ポートの状態が判別できない状態です。この状態は通常、ACKスキャンで発生します。
open|filteredopen|filtered状態のポートは、Nmapがopenかfilteredかを判断できない場合に表示されます。この状態は主にUDPスキャンやFinスキャンで発生し、ターゲットからの応答が得られない状況を示しています。
closed|filteredclosed|filtered状態は、ポートがclosedかfilteredかをNmapが判断できない状態です。通常のスキャンでは使用せず、IPID Idleスキャンの時だけに使用される状態です。

スキャン結果に表示されるポートの状態から、通信可否やフィルタリング状況を把握でき、潜在的なセキュリティリスクを評価できます。

「You requested a scan type which requires root privileges.」と表示される場合

$ nmap -sS 192.168.21.101
You requested a scan type which requires root privileges.
QUITTING!

nmapコマンドを実行すると、権限エラーが生じる場合があります。

You requested a scan type which requires root privileges.
QUITTING!

ルート権限を必要とするスキャンタイプを要求しました。
終了します。

一部のスキャンタイプでは、ネットワークインターフェースに対する低レベルのアクセスを行う必要があり、この操作には管理者権限が必要です。このような権限エラーが生じる場合は、sudoコマンドを使ってroot権限でNmapを実行して下さい。

Windows環境では、コマンドプロンプトまたはPowerShellを「管理者として実行」した上で、Nmapを実行してください。

主なオプションの使用例

  • ホストの探索
    • リストスキャン(-sL)
    • PINGスキャン(-sn)
    • ホスト検出(Ping)を行わない(-Pn)
    • DNSの名前解決を行わない(-n)
  • ポートの指定
    • ポートを明示的に指定(-p、-p-)
    • 高速スキャン(-F)
  • 詳細情報を取得
    • 稼働しているサービスのバージョンを確認(-sV)
    • OS検出(-O)
    • ネットワーク経路を取得(--traceroute)
    • アグレッシブモード(-A)
    • スキャン結果を詳細に表示(-v、-vv)
    • スキャン結果の根拠を表示(--reason)
  • スキャン速度の指定(-T)
  • 出力形式の指定
    • 通常形式(-oN)
    • XML形式(-oX)
    • Grep可能な形式(-oG)※廃止予定
    • すべての形式を一括出力(-oA)
  • NSEスクリプトを実行(--script)

ホストの探索

リストスキャン(-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パケットを遮断していると、応答が得られない可能性があります。

対象ホストが同一セグメントの場合、ICMPではなくARPを使用します。

なお旧バージョンのNmapでは、PINGスキャンは-sPオプションを使用していましたが、現在のバージョンでは-snオプションを使用します。

ホスト検出(Ping)を行わない(-Pn)

$ nmap -Pn 192.168.21.101

通常のスキャンではホストが稼働しているかを確認するためにPINGを送信しますが、-Pnオプションを指定すると、このプロセスをスキップし、ホストがオンラインであると仮定してスキャンを実行します。この方法は、ファイアウォールなどによってICMP応答が制限・遮断されている環境で有効です。

旧バージョンのNmapでは、-P0オプションまたは-PNオプションが利用されていましたが、現在のバージョンでは-Pnオプションになっています。

DNSの名前解決を行わない(-n)

$ nmap -n 192.168.21.101

Nmapは通常、IPアドレスをホスト名に変換するためにDNSによる名前解決を行いますが、このオプションを指定すると名前解決を行いません。これにより、スキャン時間の短縮やネットワーク帯域の節約に役立ち、大規模なスキャンを効率的に行いたい場合に適しています。

ポートの指定

ポートを明示的に指定(-p、-p-)

$ 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ポートに限定するため、スキャン時間を大幅に短縮できます。

詳細情報を取得

稼働しているサービスのバージョンを確認(-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)の情報収集を一度に行います。調査時間を短縮できる反面、トラフィックを増加させるため、ターゲットマシンへの負荷が高まる点に注意が必要です。

スキャン結果を詳細に表示(-v、-vv)

$ nmap -v 192.168.21.101
$ nmap -vv 192.168.21.101

スキャン結果を詳細に表示する場合、-vまたは-vvオプションを指定します。

  • -v : 詳細に表示
  • -vv : より詳細に表示

スキャン結果の根拠を表示(--reason)

$ nmap --reason 192.168.21.101

--reasonオプションを使用することで、スキャン結果の判断理由を確認できます。このオプションにより、各ポートが特定の状態と判断された根拠を出力し、結果の信頼性を高めるための参考情報として利用できます。

スキャン速度の指定

$ nmap -T4 192.168.21.101

-Tオプションを使用して、スキャンの速度を6段階から選択できます。速度を上げるとターゲットマシンへの負荷が増すため、注意が必要です。

  • -T0 : 非常に低速
  • -T1 : やや低速
  • -T2 : 低速
  • -T3 : デフォルト
  • -T4 : 公式サイト推奨
  • -T5 : 高速

出力形式の指定

nmapコマンドは、通常形式、XML形式など複数の出力形式に対応しています。これにより、他システムとのデータ連携や後続の解析処理に適した形式で保存できます。

通常形式(-oN)

$ nmap -oN output.nmap 192.168.21.101

スキャン対象のポート番号、ポートの状態、稼働しているサービスが1行に表示されるため、スキャン結果を視覚的に確認できます。

XML形式(-oX)

$ nmap -oX output.xml 192.168.21.101

XML形式は、他のプログラムやスクリプトでのデータ処理に適しており、スキャン結果を自動解析する際に役立ちます。

Grep可能な形式(-oG)※廃止予定

$ nmap -oG output.gnmap 192.168.21.101

スクリプトやコマンドラインでフィルタリングする用途に適しており、膨大なスキャン結果から必要な情報のみを抽出する際に有用です。

すべての形式を一括出力(-oA)

$ nmap -oA output 192.168.21.101

一括出力では、通常形式、XML形式、Grep可能な形式の全てを一度に保存でき、各用途に応じたフォーマットが利用可能です。

NSEスクリプトを実行

NmapにはNSE(Nmap Scripting Engine)スクリプトが用意されており、--scriptオプションで実行できます。NSEスクリプトを使うと、サービスの脆弱性診断や詳細なネットワーク情報の収集が自動化され、効率的なセキュリティ分析が可能です。

例)デフォルトのスクリプトセットを使用してスクリプトスキャンを実行する

$ nmap --script=default 192.168.21.101

--scriptオプションにファイル名、スクリプトカテゴリ、およびディレクトリを指定して、特定のスクリプトスキャンを実行することも可能です。

デフォルトのスクリプトセットを使用する場合、-sCオプションでもOK。

$ nmap -sC 192.168.21.101    # --script=default と同じ意味。

最後に:Nmapを活用してサーバーを守る

セキュリティインシデントの多くは、高度な手法ではなく、基本的な設定ミスを起点として発生します。

  • 検証用に開放して閉じ忘れたポート
  • ミドルウェアのインストール時に自動で開いた管理用インターフェース
  • 古いバージョンのまま放置されたサービス

いずれも、「管理者が認識していない」ことが共通点です。Nmapは、この認識のズレを可視化します。

サーバーを安全に運用するには、必要なサービスだけを公開し、不要なポートを閉じることが基本です。Nmapを使って定期的に確認することで、設定変更などによって意図しないポートやサービスが公開されていないかを確認できます。

デフォラボ

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
目次