nmapでポートスキャンをしてみよう

# 0.本稿について
- 環境：本稿ではAlmaLinux9.xをMinimalで最小インストールした環境を使用しています。

:::note warn 
#### 正確さの省略について
本稿では概念をわかりやすくするために、簡略化した表現を使用し、一部専門的な詳細を省略している事があります。
:::

:::note alert
#### ポートスキャンの実行について
ポートスキャンは、好き勝手にいろんなサーバへ実行してはいけません。大抵の場合は攻撃行為とみなされて警告文書を貰ったり、犯罪とみなされ、大変な事になる可能性があります。ポートスキャンを実行する場合は必ず、スキャンして問題ない対象である事を確認してから実行して下さい。
:::

# 1.はじめに

IPアドレスを持つノードは必ず、ポートという、「通信を行うためのドア」を持っており、アプリケーションはノード間でポートを介して通信しています。

このポートは0番から65535番まであります。

このうちの0から1023番までは、ウェルノウンポート(wellknown port)といい、httpやhttps、ntpやsshなど、定番の通信はこの番号のポートを使用して通信を行います。

このポートというのは、open(=開いている)、close(=閉じている)という概念があります。

開いている場合は通信が可能で、閉じている場合は通信が不可能になります。

:::note info
この開閉についてもう少し言うと、**サーバ内でプロセスがポートにバインドしているか**どうか、**ファイアウォールが許可しているか**どうかがポイントになりますが、本稿ではサーバ外から見た時に開いているかどうかという視点で見ます。
:::

インターネット上に公開するWebサーバやDNSサーバなどであれば、そのポートが開いていないと通信ができないため、開けてある必要がありますが、それ以外は最小権限の原則(この場合は必要なものだけ開けようねという原則)などから閉じている必要があります。

### ポートスキャンって？
ノードに対してポートの開閉状況を確認する事をポートスキャンと言います。

ポートスキャンをする事で、任意のポートが開いているか、閉じているかを調べる事ができます。

本稿では、ポートスキャンツールとして昔からある、nmapを使う方法を簡単に紹介します。

お品書き
2.nmapのインストール
3.nmapを使ってみる

# 2.nmapのインストール
まずはnmapがあるかどうかを確認します。
```
[yoyo@dev1 ~]$ which nmap
/usr/bin/which: no nmap in (/home/yoyo/.local/bin:/home/yoyo/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
```
`no nmap`となりました。私の環境では入っていませんでした。今度は`dnf`でパッケージを調べてみます。
```
[yoyo@dev1 ~]$ dnf info nmap
Last metadata expiration check: 0:07:10 ago on Mon Apr 21 14:03:57 2025.
Available Packages
Name         : nmap
Epoch        : 3
Version      : 7.92
Release      : 3.el9
Architecture : x86_64
Size         : 5.4 M
Source       : nmap-7.92-3.el9.src.rpm
Repository   : appstream
Summary      : Network exploration tool and security scanner
URL          : http://nmap.org/
License      : Nmap
Description  : Nmap is a utility for network exploration or security auditing.  It supports
             : ping scanning (determine which hosts are up), many port scanning techniques
             : (determine what services the hosts are offering), and TCP/IP fingerprinting
             : (remote host operating system identification). Nmap also offers flexible target
             : and port specification, decoy scanning, determination of TCP sequence
             : predictability characteristics, reverse-identd scanning, and more. In addition
             : to the classic command-line nmap executable, the Nmap suite includes a flexible
             : data transfer, redirection, and debugging tool (netcat utility ncat), a utility
             : for comparing scan results (ndiff), and a packet generation and response
             : analysis tool (nping).
```
どうも`appstream`リポジトリに存在しているようです。インストールを行います。

```
[yoyo@dev1 ~]$ sudo dnf install nmap -y
Last metadata expiration check: 0:06:28 ago on Mon Apr 21 14:06:05 2025.
Dependencies resolved.
===========================================================================================================================================
 Package                          Architecture                 Version                               Repository                       Size
===========================================================================================================================================
Installing:
 nmap                             x86_64                       3:7.92-3.el9                          appstream                       5.4 M
Installing dependencies:
 libibverbs                       x86_64                       51.0-1.el9                            baseos                          426 k
 libpcap                          x86_64                       14:1.10.0-4.el9                       baseos                          172 k
 nmap-ncat                        x86_64                       3:7.92-3.el9                          appstream                       222 k

Transaction Summary
===========================================================================================================================================
Install  4 Packages

Total download size: 6.2 M
Installed size: 26 M
Downloading Packages:
(1/4): nmap-ncat-7.92-3.el9.x86_64.rpm                                                                     6.7 MB/s | 222 kB     00:00
(2/4): libibverbs-51.0-1.el9.x86_64.rpm                                                                     10 MB/s | 426 kB     00:00
(3/4): libpcap-1.10.0-4.el9.x86_64.rpm                                                                     5.1 MB/s | 172 kB     00:00
(4/4): nmap-7.92-3.el9.x86_64.rpm                                                                           25 MB/s | 5.4 MB     00:00
-------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                      4.6 MB/s | 6.2 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                   1/1
  Installing       : libibverbs-51.0-1.el9.x86_64                                                                                      1/4
  Installing       : libpcap-14:1.10.0-4.el9.x86_64                                                                                    2/4
  Installing       : nmap-ncat-3:7.92-3.el9.x86_64                                                                                     3/4
  Running scriptlet: nmap-ncat-3:7.92-3.el9.x86_64                                                                                     3/4
  Installing       : nmap-3:7.92-3.el9.x86_64                                                                                          4/4
  Running scriptlet: nmap-3:7.92-3.el9.x86_64                                                                                          4/4
  Verifying        : nmap-3:7.92-3.el9.x86_64                                                                                          1/4
  Verifying        : nmap-ncat-3:7.92-3.el9.x86_64                                                                                     2/4
  Verifying        : libibverbs-51.0-1.el9.x86_64                                                                                      3/4
  Verifying        : libpcap-14:1.10.0-4.el9.x86_64                                                                                    4/4

Installed:
  libibverbs-51.0-1.el9.x86_64      libpcap-14:1.10.0-4.el9.x86_64      nmap-3:7.92-3.el9.x86_64      nmap-ncat-3:7.92-3.el9.x86_64

Complete!
```
もう一度`which`を実行したところ入ったようです。
```
[yoyo@dev1 ~]$ which nmap
/usr/bin/nmap
```

# 3.nmapを使ってみる
実際にnmapを利用してみましょう。基本的な構文は簡単で、
### 基本構文
```
nmap ホスト名/IP
```
を実行するだけです。実際に自分のサーバに、IPアドレスを指定してやってみたのが以下↓です。
```
[yoyo@dev01 ~]$ nmap 192.168.1.32
Starting Nmap 7.92 ( https://nmap.org ) at 2025-04-21 14:16 JST
Nmap scan report for 192.168.1.32
Host is up (0.00027s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
111/tcp  open  rpcbind
3128/tcp open  squid-http

Nmap done: 1 IP address (1 host up) scanned in 1.19 seconds
```
例えば22番ポートがssh用に、80番がhttp用に開いている事が確認できます。

次に、ポートを指定して実行してみましょう。
### ポートを指定する
-pを付ける事でポートを指定する事が可能です。
```
nmap -p 22 ホスト名/IP
```

この際、カンマ区切りで指定すると、複数同時に指定できます。
```
nmap -p 22,80,443 ホスト名/IP
```
数字の間にハイフン(-)を入れると数字の間の範囲を指定できます。
```
nmap -p 1-1024 ホスト名/IP
```
pの反対をハイフン(-)で挟む事で、すべてのポートを指定できます。
```
nmap -p-  ホスト名/IP
```

-sTを付ける事で、TCPスキャンできます。
```
nmap -sT -p-  ホスト名/IP
```

-sUを付ける事で、UDPスキャンできます。こちらの場合は少し時間がかかる事があります。
```
nmap -sU -p-  ホスト名/IP
```

ポートスキャン時は通常、生存確認を行いますが、ポートは開いているが、その向こう側のホストが生存していな場合は反応せず、ポートが閉じて見える事があります。その場合は、-Pnを付ける事でホストの生存確認(Pingスキャン)をスキップできます。
```
nmap -Pn -p- ホスト名/IP
```
`-sV`を付ける事で、待ち受けているアプリケーションのバージョンを表示させる事ができます。
```
nmap -sV ホスト名/IP
```
侵入者は例えばここで表示されたアプリケーションとそのバージョンの脆弱性を調査し、攻撃を検討する訳です。

:::note warn
必ずその通り表示されるわけではありません。アプリケーションによっては隠ぺいできるものもあります
:::

ここまでできれば、nmapを最低限使えるようになっています。

今回はnmapの基本的な使い方を紹介しました。

初学者はまずこの辺を一通り使いこなせるようになると良いでしょう。

大抵の場合は今回のコマンドだけで十分だと思いますが、実務で使用する場合は別なオプションを利用する事もあります。nmapは更に細かい指定もできるため、`man nmap`で他のオプションも試してみてください。

あと、何度も言いますが、ポートスキャンを実施する対象は厳に気を付けて下さい。