はじめに
Nmap の基本的なポートスキャン(TCP connect / TCP SYN / UDP)をわかりやすく整理しました。コマンド例、フラグの意味、ポート指定・タイミング調整、実務での注意点まで。練習用の安全なコマンド例も載せているので、まずは自分のラボで試してみてください。
ポートの概念(ざっくり)
- ポート:IPアドレス上の「サービス識別子」。例:HTTP は通常 TCP 80、HTTPS は TCP 443。
-
状態の概念(Nmap):
-
open:サービスがリッスンしている -
closed:到達可能だがサービスなし -
filtered:パケットがフィルタ(FW等)で届かない(判定不能) -
unfiltered/open|filtered/closed|filtered:スキャン方式に依存する曖昧な状態
-
TCP と UDP の違い(スキャン観点)
-
TCP:コネクション型(3-way handshake)。応答パターンから
open/closedが判定しやすい。 -
UDP:コネクションレス。閉じているポートは ICMP Port Unreachable を返すことが多いが、開いているポートは応答しないことがあるため判定が難しい(
open|filteredが多くなる)。
スキャンの種類と仕組み(実務ポイント付き)
1. TCP Connect Scan (-sT)
- 何をするか:通常の TCP 3-way handshake を完了させて開いているかを確認。非特権ユーザーでも実行可能。
- 利点:いつでも実行でき、確実。
- 欠点:フル接続がログに残る(ターゲット側に記録されやすい)。
- コマンド例
nmap -sT TARGET_IP
2. TCP SYN Scan (-sS) — デフォルト(権限必要)
- 何をするか:SYN を送り、SYN/ACK を受け取ったら RST を送り接続を完了させずに判定する(half-open)。
- 利点:接続完了しないためログに残りにくい(ただし IDS によって検知されることはある)。
- 欠点:privileged(root/sudo)でないと実行できない。
- コマンド例
sudo nmap -sS TARGET_IP
3. UDP Scan (-sU)
-
何をするか:UDP パケットを送り、ICMP Destination Unreachable (Type 3, Code 3) が返ってきたら
closed、応答が無ければopenまたはfilteredと判断。 - 利点:UDP サービス(DNS, SNMP, NTP, RPC など)を検出できる。
- 欠点:遅い(多くのホストが ICMP を制限)、パケットロスやフィルタで不確定が増える。
- コマンド例
sudo nmap -sU TARGET_IP
ポート指定・スキャン範囲
- 個別ポート:
-p22,80,443 - 範囲:
-p1-1023(1〜1023) - 全ポート:
-p-(1〜65535) - 上位のよく使う:
-F(100の最も一般的なポート) -
--top-ports N:よく使われる N ポートだけスキャン
タイミングとスループット(速度調整)
-
-T<0-5>:テンプレート(0:paranoid → 5:insane)。通常は-T3(normal)、実務でのステルスは-T0/1、CTFやラボは-T4がよく使われます。 - パケットレート:
--min-rate/--max-rate- 例:
--max-rate 50(秒間 50 パケット以下)
- 例:
- 並列性:
--min-parallelism/--max-parallelism- 例:
--min-parallelism 100
- 例:
実務ヒント:IDS 回避を狙うなら -T0 や --max-rate を低くする。ただし非常に遅くなる。
実用的なコマンド例(使い分け)
- 1000 ポートの基本スキャン(非特権)
nmap -sT TARGET_IP
- 管理者権限で SYN スキャン(高速)
sudo nmap -sS TARGET_IP
- SYN + UDP を同時に走らせる
sudo nmap -sS -sU TARGET_IP
- すべてのポートをスキャン(時間がかかる)
sudo nmap -p- TARGET_IP
- 上位 20 ポートを速く確認
sudo nmap --top-ports 20 TARGET_IP
- ステルス寄り(極遅)
sudo nmap -sS -T0 --max-rate 1 TARGET_IP
-
-F(100ポート)+詳細出力
nmap -F -v TARGET_IP
出力の読み方(例)
PORT STATE SERVICE
22/tcp open ssh
68/udp open|filtered dhcpc
111/udp open rpcbind
-
openは確実にサービスあり。 -
open|filteredは応答無しで「開いているか、フィルタでブロックされているか不明」。 -
filteredは到達不能(多くは FW)。
Wireshark での観察(学習用途)
-
-sT:SYN → SYN/ACK → ACK(コネクション完了) → RST(切断) のフローが見える。 -
-sS:SYN → SYN/ACK → RST(半端) のみ(3-way 完了しない)。 - UDP:ICMP Port Unreachable が返るかどうかで判定。
チェックリスト・良い習慣
- 常にスキャン対象の許可を確認する(許可がないと違法になる)。
- 不要に大きなスキャン(
-p-で全ポート、高速設定)を公開ネットワークで実行しない。 - スキャン前に
--top-portsや-Fでスモールスタート → 必要に応じて拡張。 - SYN スキャンは root 必須。権限のない環境で
-sSを誤って実行しようとしない。 - ログを見やすくするために
-oN(ノーマル出力)や-oX(XML)で保存する。- 例:
sudo nmap -sS -oN scan.txt TARGET_IP
- 例:
よくある組み合わせ(実用テンプレ)
- 詳細な TCP+サービス検出 + スクリプト
sudo nmap -sS -sV -O --script=default TARGET_IP
-
-sV:サービスバージョン検出 -
-O:OS 検出 -
--script=default:Nmap スクリプトエンジンを使った基本チェック - ステルスに寄せる(権限あり)
sudo nmap -sS -T1 --max-rate 5 --top-ports 100 TARGET_IP
まとめ
- 非特権ユーザー:
-sT(TCP Connect)で始める。確実だがログに残る。 - 権限あり(root/sudo):
-sS(SYN)を使うとログに残りにくい(ただし IDS に検知される場合あり)。 - UDP スキャンは遅く不確定要素が多いが、UDP サービスを見つけるには必須。
- ポート範囲・タイミング・レートをうまく調整して、目的(速さ・網羅性・ステルス)に合わせる。
参考(自分用メモ・コマンド)
- 基本:
nmap -sS TARGET(sudo) /nmap -sT TARGET(非特権) - UDP:
sudo nmap -sU TARGET - 全ポート:
-p- - 速さ調整:
-T0〜-T5/--max-rate/--min-parallelism - 保存:
-oN out.txt/-oX out.xml