hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

nmapコマンドの使い方



1 nmapコマンドとは?

ポートが開放されているかどうかを確認するために使うコマンドです。

2 検証環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のens33はNICの名前です。

                          192.168.2.0/24
client(ens33) -------------------------------------(ens33) server
        .105                                       .100

2.2 版数

サーバ、クライアントともに下記版数です。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

3 インストール方法

クライアントにnmapをインストールします。

[root@server ~]# yum -y install nmap

nmapの版数を確認します。

[root@server ~]# nmap -V

Nmap version 6.40 ( http://nmap.org )
Platform: x86_64-redhat-linux-gnu
Compiled with: nmap-liblua-5.2.2 openssl-1.0.2k libpcre-8.32 libpcap-1.5.3 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select

4 オプション一覧

オプションは以下のとおりです。

[root@server ~]#  nmap --help
Nmap 6.40 ( http://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
  Can pass hostnames, IP addresses, networks, etc.
  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
  -iL <inputfilename>: Input from list of hosts/networks
  -iR <num hosts>: Choose random targets
  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks
  --excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
  -sL: List Scan - simply list targets to scan
  -sn: Ping Scan - disable port scan
  -Pn: Treat all hosts as online -- skip host discovery
  -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  -PO[protocol list]: IP Protocol Ping
  -n/-R: Never do DNS resolution/Always resolve [default: sometimes]
  --dns-servers <serv1[,serv2],...>: Specify custom DNS servers
  --system-dns: Use OS's DNS resolver
  --traceroute: Trace hop path to each host
SCAN TECHNIQUES:
  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  -sU: UDP Scan
  -sN/sF/sX: TCP Null, FIN, and Xmas scans
  --scanflags <flags>: Customize TCP scan flags
  -sI <zombie host[:probeport]>: Idle scan
  -sY/sZ: SCTP INIT/COOKIE-ECHO scans
  -sO: IP protocol scan
  -b <FTP relay host>: FTP bounce scan
PORT SPECIFICATION AND SCAN ORDER:
  -p <port ranges>: Only scan specified ports
    Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
  -F: Fast mode - Scan fewer ports than the default scan
  -r: Scan ports consecutively - don't randomize
  --top-ports <number>: Scan <number> most common ports
  --port-ratio <ratio>: Scan ports more common than <ratio>
SERVICE/VERSION DETECTION:
  -sV: Probe open ports to determine service/version info
  --version-intensity <level>: Set from 0 (light) to 9 (try all probes)
  --version-light: Limit to most likely probes (intensity 2)
  --version-all: Try every single probe (intensity 9)
  --version-trace: Show detailed version scan activity (for debugging)
SCRIPT SCAN:
  -sC: equivalent to --script=default
  --script=<Lua scripts>: <Lua scripts> is a comma separated list of
           directories, script-files or script-categories
  --script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts
  --script-args-file=filename: provide NSE script args in a file
  --script-trace: Show all data sent and received
  --script-updatedb: Update the script database.
  --script-help=<Lua scripts>: Show help about scripts.
           <Lua scripts> is a comma separted list of script-files or
           script-categories.
OS DETECTION:
  -O: Enable OS detection
  --osscan-limit: Limit OS detection to promising targets
  --osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
  Options which take <time> are in seconds, or append 'ms' (milliseconds),
  's' (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m).
  -T<0-5>: Set timing template (higher is faster)
  --min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes
  --min-parallelism/max-parallelism <numprobes>: Probe parallelization
  --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies
      probe round trip time.
  --max-retries <tries>: Caps number of port scan probe retransmissions.
  --host-timeout <time>: Give up on target after this long
  --scan-delay/--max-scan-delay <time>: Adjust delay between probes
  --min-rate <number>: Send packets no slower than <number> per second
  --max-rate <number>: Send packets no faster than <number> per second
FIREWALL/IDS EVASION AND SPOOFING:
  -f; --mtu <val>: fragment packets (optionally w/given MTU)
  -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
  -S <IP_Address>: Spoof source address
  -e <iface>: Use specified interface
  -g/--source-port <portnum>: Use given port number
  --data-length <num>: Append random data to sent packets
  --ip-options <options>: Send packets with specified ip options
  --ttl <val>: Set IP time-to-live field
  --spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
  --badsum: Send packets with a bogus TCP/UDP/SCTP checksum
OUTPUT:
  -oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
     and Grepable format, respectively, to the given filename.
  -oA <basename>: Output in the three major formats at once
  -v: Increase verbosity level (use -vv or more for greater effect)
  -d: Increase debugging level (use -dd or more for greater effect)
  --reason: Display the reason a port is in a particular state
  --open: Only show open (or possibly open) ports
  --packet-trace: Show all packets sent and received
  --iflist: Print host interfaces and routes (for debugging)
  --log-errors: Log errors/warnings to the normal-format output file
  --append-output: Append to rather than clobber specified output files
  --resume <filename>: Resume an aborted scan
  --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
  --webxml: Reference stylesheet from Nmap.Org for more portable XML
  --no-stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
  -6: Enable IPv6 scanning
  -A: Enable OS detection, version detection, script scanning, and traceroute
  --datadir <dirname>: Specify custom Nmap data file location
  --send-eth/--send-ip: Send using raw ethernet frames or IP packets
  --privileged: Assume that the user is fully privileged
  --unprivileged: Assume the user lacks raw socket privileges
  -V: Print version number
  -h: Print this help summary page.
EXAMPLES:
  nmap -v -A scanme.nmap.org
  nmap -v -sn 192.168.0.0/16 10.0.0.0/8
  nmap -v -iR 10000 -Pn -p 80
SEE THE MAN PAGE (http://nmap.org/book/man.html) FOR MORE OPTIONS AND EXAMPLES

5 基本的な使いかた

nmapコマンドは以下のように実行します。
デフォルトは、TCPによるポートスキャンを実行します。

nmap <スキャン対象のホストのIPアドレス(またはホスト名) >

5.1 開放されているポート番号を確認する方法

"開放されている"とは、パケットフィルタ(iptables)でパケットがフィルタされていないことを意味します。まず、開放されているポートをポート番号で確認します。

[root@server ~]#  firewall-cmd --list-ports

[root@server ~]#

次に開放されているポートをサービス名で調べてみます。ssh(22)のポートだけが、開放されていることがわかります。なお、サービス名は/etc/servicesに登録されています。

[root@server ~]# firewall-cmd --list-services
ssh

次に、クライアントでnmapを実行します。このとき、スキャン対象のIPアドレス(192.168.2.100)を指定します。実行結果を確認すると、sshはopenと表示されています。sshdとやりとりが可能な状態になっています。また、"Not shown: 999 filtered ports"と表示(★)されています。これは、999個のポートがパケットフィルタでフィルタされていることを意味しています。

[root@client ~]# nmap 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-07 21:49 JST
Nmap scan report for 192.168.2.100
Host is up (0.0013s latency).
Not shown: 999 filtered ports ★
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: xx:xx:xx:yy:yy:yy (CCC)

Nmap done: 1 IP address (1 host up) scanned in 4.69 seconds

5.2 実験1

サーバで11111番ポートを開放して、nmapの実行結果がどのようになるのかを確認してみます。

[root@server ~]# firewall-cmd --add-port=11111/tcp
success

次に、クライアントでnmapを実行します。

[root@client ~]# nmap 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-07 21:55 JST
Nmap scan report for 192.168.2.100
Host is up (0.00049s latency).
Not shown: 998 filtered ports
PORT      STATE  SERVICE
22/tcp    open   ssh
11111/tcp closed vce ★
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 8.07 seconds

11111番ポートが、filteredからclosed(★印)に変化したことがわかります。closedは、ポートスキャンのパケットが11111番ポートまで到達したけど、そのポート番号でListenしているプロセスが存在しないことを意味しています。

この時の様子を以下に図示します。11111番ポートに対するSYNパケットに対して、RSTパケットが送信されています。RSTパケットが送信されるのは、11111番ポートでListenしているプロセスがいないためです。

  client                                server(11111)
   |                                       |
   |----------------- SYN ---------------->|
   |<---------------- RST------------------| 
   |                                       |

5.3 実験2

次に、サーバでncコマンドを実行します。ncコマンドは、11111番ポートでncプロセスがListenするように実行します。なお、ncコマンドの使い方は、ncコマンドの使い方(ネットワーク実験の幅が広がるなぁ~) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# nc -kl 11111

もう1つターミナルを開きます。そして、ncプロセスがListenしているポートをlsofコマンドで確認します。ncプロセスは、TCPの11111番ポートでListenしていることがわかります。なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsof -i4:11111 -a -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      2930 root    4u  IPv4  38848      0t0  TCP *:11111 (LISTEN)

次に、クライアントでnmapを実行します。

[root@client ~]# nmap 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-07 23:09 JST
Nmap scan report for 192.168.2.100
Host is up (0.00067s latency).
Not shown: 998 filtered ports
PORT      STATE SERVICE
22/tcp    open  ssh
11111/tcp open  vce ★
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 12.30 seconds

今度は、11111番ポートがopen(★)になりました。つまり、11111番ポートでListenするプロセス(nc)が存在することを意味しています。

この時の様子を以下に図示します。SYNパケットに対して、SYN+ACKパケットを返信しています。なお、クライアントはSYN+ACKを受信すると、サーバにRSTを送信しています。

  client                                server(11111)
   |                                       |
   |----------------- SYN ---------------->|
   |<---------------- SYN +ACK ------------| 
   |----------------- RST ---------------->|
   |                                       |

6 TCPポートをスキャンする方法

開放されているポート番号を確認します。22番ポートだけが開放されていることがわかります。

[root@server ~]# firewall-cmd --list-ports

[root@server ~]# firewall-cmd --list-services
ssh
[root@server ~]#

6.1 特定のポート番号を指定する方法(-p)

sshの22番ポートが開放されているかどうか確認してみます。openと表示されているので、開放されていることがわかります。

[root@client ~]# nmap -p22 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 15:16 JST
Nmap scan report for 192.168.2.100
Host is up (0.0010s latency).
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.72 seconds

次にTCPの11111番ポートが開放されているかどうか確認してみます。11111番ポートは、filteredと表示されているので、開放されていないことがわかります。

[root@client ~]# nmap -p11111 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 15:17 JST
Nmap scan report for 192.168.2.100
Host is up (0.00075s latency).
PORT      STATE    SERVICE
11111/tcp filtered vce
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.71 seconds

6.2 範囲を指定する方法(-p)

TCPの20番ポートから30番ポートについて、ポートが開放されているかどうかを確認してみます。sshの22番ポートだけが開放されていることがわかります。

[root@client ~]# nmap -p20-30 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 15:19 JST
Nmap scan report for 192.168.2.100
Host is up (0.00055s latency).
PORT   STATE    SERVICE
20/tcp filtered ftp-data
21/tcp filtered ftp
22/tcp open     ssh
23/tcp filtered telnet
24/tcp filtered priv-mail
25/tcp filtered smtp
26/tcp filtered rsftp
27/tcp filtered nsw-fe
28/tcp filtered unknown
29/tcp filtered msg-icp
30/tcp filtered unknown
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 1.90 seconds

7 UDPポートをスキャンする方法(-sU)

ncコマンドを実行します。UDPの11111番ポートでデータを待ち受けます。

[root@server ~]# nc -ul 11111

ncプロセスが使用しているポート番号を確認します。

[root@server ~]# lsof -i4:11111 -a -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      5399 root    4u  IPv4  74676      0t0  UDP *:11111

UDPの11111番ポートを開放します。

[root@server ~]# firewall-cmd --add-port=11111/udp
success

ポート番号を確認します。

[root@server ~]# firewall-cmd --list-ports
11111/udp

サーバの11111番ポーに対してnmapを実行します。なぜか状態がclosedとなってしまいます。バグですかね?

[root@client ~]# nmap -sU -p11111 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 15:41 JST
Nmap scan report for 192.168.2.100
Host is up (0.00079s latency).
PORT      STATE  SERVICE
11111/udp closed unknown
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.74 seconds

8 ネットワーク内のホスト一覧を表示する方法

8.1 ARPを使う方法(-sn)

ARPを使って192.168.2.0/24に存在するホストを確認してみます。ARP要求に応答したホストは"Host is up."と表示されます。全部で5台のホストが存在することがわかります。

[root@client ~]# nmap -sn 192.168.2.0/24

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 18:42 JST
Nmap scan report for WRC-2533GS2 (192.168.2.1)
Host is up (-0.10s latency).
MAC Address: xx:xx:xx:xx:xx:xx (Unknown)
Nmap scan report for DESKTOP-XXXXXXX (192.168.2.12)
Host is up (0.00016s latency).
MAC Address: xx:xx:xx:xx:xx:xx (Unknown)
Nmap scan report for 192.168.2.100
Host is up (0.00036s latency).
MAC Address: xx:xx:xx:xx:xx:xx (ZZZZZZ)
Nmap scan report for client (192.168.2.37)
Host is up.
Nmap scan report for 192.168.2.105
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 4.27 seconds

8.2 特定のホストをポートスキャンから除外する方法(--exclude)

192.168.2.0/24のネットワークで192.168.2.252と192.168.2.253のホストに対してポートスキャンを実行しないようにしてみます。nmapを実行すると、以下のように192.168.2.252と192.168.2.253に対してポートスキャンが実行されていないことがわかります。

[root@client ~]# nmap --exclude 192.168.2.252,192.168.2.253 -sL 192.168.2.0/24
-snip-
Nmap scan report for 192.168.2.250
Nmap scan report for 192.168.2.251
Nmap scan report for 192.168.2.254
Nmap scan report for 192.168.2.255
Nmap done: 254 IP addresses (0 hosts up) scanned in 2.51 seconds

9 パケットトレースを行う方法(--packet-trace)

packet-traceオプションを使うと、サーバとクライアントのやりとりがわかります。以下の例では、まずはじめにARPを使って、サーバのMACアドレスを得ています。次に、クライアントからサーバの11111番ポートにSYNパケットが2回送信されています。そのあと、サーバからクライアントにSYN+ACKパケットが2回返信されています。

[root@client ~]# nmap --packet-trace -p11111 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 18:14 JST
SENT (0.0609s) ARP who-has 192.168.2.100 tell 192.168.2.105
RCVD (0.0615s) ARP reply 192.168.2.100 is-at xx:xx:xx:yy:yy:yy
-snip-
SENT (0.2815s) TCP 192.168.2.105:43579 > 192.168.2.100:11111 S ttl=47 id=26942 iplen=44  seq=3321984755 win=1024 <mss 1460>
SENT (0.3824s) TCP 192.168.2.105:43580 > 192.168.2.100:11111 S ttl=57 id=56633 iplen=44  seq=3321919218 win=1024 <mss 1460>
RCVD (0.2822s) TCP 192.168.2.100:11111 > 192.168.2.105:43579 SA ttl=64 id=0 iplen=44  seq=4010614734 win=29200 <mss 1460>
RCVD (0.3829s) TCP 192.168.2.100:11111 > 192.168.2.105:43580 SA ttl=64 id=0 iplen=44  seq=1336599785 win=29200 <mss 1460>
Nmap scan report for 192.168.2.100
Host is up (0.00068s latency).
PORT      STATE SERVICE
11111/tcp open  vce
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.51 seconds

10 送信元ポート番号を指定する方法(-g)

gオプションを指定すると、ポートスキャンの送信元ポート番号を明に指定することができます。gオプションを指定しないと、ポートスキャンのパケットを送信する毎に送信元ポート番号が変化します。

送信元ポート番号を22222に指定してみます。このとき、さきほど確認したpacket-traceオプションを指定して、送信元ポート番号を確認してみます。送信元ポート番号が22222であることがわかります。

[root@client ~]# nmap --packet-trace -g 22222 -p11111 192.168.2.100
-snip-
SENT (0.4400s) TCP 192.168.2.105:22222 > 192.168.2.100:11111 S ttl=47 id=28127 iplen=44  seq=1253010836 win=1024 <mss 1460>
SENT (0.5493s) TCP 192.168.2.105:22222 > 192.168.2.100:11111 S ttl=41 id=63524 iplen=44  seq=1252945301 win=1024 <mss 1460>
RCVD (0.4407s) TCP 192.168.2.100:11111 > 192.168.2.105:22222 SA ttl=64 id=0 iplen=44  seq=217630012 win=29200 <mss 1460>
RCVD (0.5499s) TCP 192.168.2.100:11111 > 192.168.2.105:22222 SA ttl=64 id=0 iplen=44  seq=219335868 win=29200 <mss 1460>
Nmap scan report for 192.168.2.100
Host is up (0.0012s latency).
PORT      STATE SERVICE
11111/tcp open  vce
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.72 seconds
[root@client ~]#

11 サービスのバージョンを確認する方法

11.1 sshのバージョン確認

sshのバージョンを確認します。

[root@server ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

sshdプロセスがListenしているポート番号を確認します。22番ポートでListenしていることがわかります。

[root@server ~]# lsof -c sshd -a -iTCP -a -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1116 root    3u  IPv4  27789      0t0  TCP *:22 (LISTEN)
sshd    1116 root    4u  IPv6  27374      0t0  TCP *:22 (LISTEN)
-snip-

クライアントでnmapを実行します。sshのバージョンがOpenSSH 7.4 (protocol 2.0)であることがわかります。

[root@client ~]# nmap -sV -p22 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 15:57 JST
Nmap scan report for 192.168.2.100
Host is up (0.00056s latency).
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4 (protocol 2.0)
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.88 seconds

11.2 httpdのバージョン確認

httpdを起動します。

[root@server ~]# systemctl start httpd

httpdの版数を確認します。

[root@server ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 10 2021 14:26:31

httpdプロセスがListenしているポート番号を確認します。80番ポートでListenしていることがわかります。

[root@server ~]# lsof -c httpd -a -iTCP -a -P
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   5797   root    4u  IPv6  77404      0t0  TCP *:80 (LISTEN)
httpd   5798 apache    4u  IPv6  77404      0t0  TCP *:80 (LISTEN)
httpd   5799 apache    4u  IPv6  77404      0t0  TCP *:80 (LISTEN)
httpd   5800 apache    4u  IPv6  77404      0t0  TCP *:80 (LISTEN)
httpd   5801 apache    4u  IPv6  77404      0t0  TCP *:80 (LISTEN)
httpd   5802 apache    4u  IPv6  77404      0t0  TCP *:80 (LISTEN)

httpdに対してnmapを実行します。httpdの版数が"Apache httpd 2.4.6 *1"と表示されていることがわかります。

[root@client ~]# nmap -sV -p80 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 16:02 JST
Nmap scan report for 192.168.2.100
Host is up (0.00074s latency).
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.6 ((CentOS))
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.87 seconds

12 ポートスキャンの結果を確認する方法(--reason)

reasonオプションを使うと、どのような理由でポートへのアクセスが失敗したのかの理由を調べることができます。

開放されているポートを確認します。sshのポートだけが開放されていることがわかります。

[root@server ~]# firewall-cmd --list-ports

[root@server ~]# firewall-cmd --list-services
ssh
[root@server ~]#

12.1 ポートが解放されていない場合

開放されていないTCPの11111番ポートに対してnmapを実行してみます。
ポートがパケットフィルタでフィルタされており開放されていない状態の場合、host-prohibitedという理由が表示されます。

[root@client ~]# nmap --reason -p11111 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 16:29 JST
Nmap scan report for 192.168.2.100
Host is up, received arp-response (0.00066s latency).
PORT      STATE    SERVICE REASON
11111/tcp filtered vce     host-prohibited
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.72 seconds

12.2 解放したポートでListenするプロセスが存在しない場合

TCPの11111番ポートを開放します。

[root@server ~]# firewall-cmd --add-port=11111/tcp
success
[root@server ~]# firewall-cmd --list-ports
11111/tcp

開放したTCPの11111番ポートに対してnmapを実行してみます。
今度はresetが表示されました。resetはポートは開放されているけど、そのポートでListenしているプロセスが存在しないことを表しています。

[root@client ~]# nmap --reason -p11111 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 16:31 JST
Nmap scan report for 192.168.2.100
Host is up, received arp-response (0.00074s latency).
PORT      STATE  SERVICE REASON
11111/tcp closed vce     reset
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.73 seconds

12.3 開放したポートでListenするプロセスが存在する場合

ncコマンドを実行して、ncプロセスがTCPの11111番ポートでListenするようにします。

[root@server ~]# nc -kl 11111

ncプロセスがListenしているポート番号を確認します。

[root@server ~]# lsof -c nc -a -i4 -a -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      6505 root    4u  IPv4  84971      0t0  TCP *:11111 (LISTEN)

TCPの11111番ポートに対してnmapを実行してみます。
今度はsyn-ackが表示されました。syn-ackは、そのポートでListenしているプロセスが存在することを表しています。

[root@client ~]# nmap --reason -p11111 192.168.2.100

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 16:33 JST
Nmap scan report for 192.168.2.100
Host is up, received arp-response (0.00056s latency).
PORT      STATE SERVICE REASON
11111/tcp open  vce     syn-ack
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 1 IP address (1 host up) scanned in 0.74 seconds

13 ファイルからターゲットを読み込んでポートスキャンをする方法(-iL)

スキャン対象のターゲットのIPアドレスを記載したテキストファイルを作成します。
8.8.8.8はGoogleのオープンDNSサーバのIPアドレスです。インターネット上のサーバに対して実行するのはあまりよくありませんが、例として一度実行してみます。

[root@client ~]# vi scan_list.txt
[root@client ~]# cat scan_list.txt
8.8.8.8 192.168.2.100

nmapを実行します。GoogleのオープンDNSサーバは、DNSのポート(53)とHTTPS(443)のポートが開放されていることがわかります。また、テスト環境のサーバは、ssh(22)のポートが開放されていることがわかります。

[root@client ~]# nmap -iL scan_list.txt

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-08 19:39 JST
Nmap scan report for dns.google (8.8.8.8)
Host is up (0.016s latency).
Not shown: 998 filtered ports
PORT    STATE SERVICE
53/tcp  open  domain
443/tcp open  https

Nmap scan report for 192.168.2.100
Host is up (0.00057s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: xx:xx:xx:yy:yy:yy (ZZZZZZ)

Nmap done: 2 IP addresses (2 hosts up) scanned in 25.93 seconds

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ