はじめに
Nmapを使って、ポートが空いているかを確認する方法を紹介する。netcatを使う方法もあるが、UDPではうまく動作しなかったので、Nmapを使うことを推奨する(参考)。
動作確認環境
- Ubuntu 20.04
方法
Nmapは、TCP/UDPのポートスキャンができるコマンド。下記でNMAPインストールする。
sudu apt update
sudo apt install nmap
Nmapは、リターンコードでは接続の有無を確認できないので、戻り値のテキストをgrepすることにより接続確認する。状態は以下が定義されている。詳細はNmapマニュアルを参照。
状態 | 説明 |
---|---|
open | 調査対象マシン上のアプリケーションがそのポート上で接続/パケットを待ち受けている状態。 |
filtered | ファイアウォールやフィルタなどのネットワーク上の障壁でポートが遮られている状態。ポートが開いているか閉じているかをNmapが判断できないことを意味する。 |
closed | Closed(閉じた)ポートには、待ち受け状態のアプリケーションは何もない状態。これらはいつでも開放することが可能である。 |
unfiltered | ポートがNmapのプローブには応答するが、開いているか閉じているかをNmapが判別できない状態。 |
ポートの状態がopen|filteredやclosed|filteredのように、2つの状態の組み合わせそのどちらがポートの状態を表しているかをNmapが判断できない場合である。
TCPの場合
nmap -sT -p {port_no} {ip_address}
- {port_no}: ポート番号
- {ip_address}: IPアドレス
接続可能な場合の応答
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:38 JST
Nmap scan report for {ip_address}
Host is up (0.00034s latency).
PORT STATE SERVICE
{port_no}/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
接続不可能な場合の応答
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:38 JST
Nmap scan report for {ip_address}
Host is up (0.00033s latency).
PORT STATE SERVICE
{port_no}/tcp closed unknown
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
リターンコード取得するためのシェルスクリプト
下記のようにすると、接続可能(open)な場合は、リターンコード=0となる。
nmap -sT -p {port_no} {ip_address} | grep open
接続されるまで待ち続けるスクリプト
while [ ! "$(nmap -sT -p {port_no} {ip_address} | grep open)" ]; do echo 'Waiting...'; sleep 1s; done
UDPの場合
TCPの場合と同様。オプションが、T
からU
に変わる。
nmap -sU -p {port_no} {ip_address}
- {port_no}: ポート番号
- {ip_address}: IPアドレス
接続可能(ポート遮断あり)な場合の応答
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:47 JST
Nmap scan report for {ip_address}
Host is up (0.000037s latency).
PORT STATE SERVICE
{port_no}/udp open|filtered unknown
MAC Address: XX:XX:XX:XX:XX:XX (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.54 seconds
接続不可能な場合の応答
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:47 JST
Nmap scan report {ip_address}
Host is up (0.000047s latency).
PORT STATE SERVICE
{port_no}/udp closed unknown
MAC Address: XX:XX:XX:XX:XX:XX (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.36 seconds
リターンコード取得するためのシェルスクリプト
下記のようにすると、接続可能(open)な場合は、リターンコード=0となる。
nmap -sU -p {port_no} {ip_address} | grep open
接続されるまで待ち続けるスクリプト
while [ ! "$(nmap -sU -p {port_no} {ip_address} | grep open)" ]; do echo 'Waiting...'; sleep 1s; done
まとめ
Nmapを使うことにより、TCP/UDPのポートへの接続確認を行うことができた。grepと組み合わせることによりリターンコードを取得してシステムに組み込める形にして使うのが良い。
参考