はじめに
端的に言うと:「応答が返ってくる=そこにホストがいる」。ARP / ICMP / TCP / UDP、どれでノックするかを状況で切り替えるのが肝です。
- Nmap の Host Discovery(ホスト発見) を、ARP / ICMP / TCP / UDP の4系統で実務目線に整理
- 現場で使い回せる コマンドスニペット集
- 失敗しがちなポイントと トラブルシューティング
- 逆引きDNSや masscan など 運用小ネタ
なぜ「ホスト発見」から始めるの?
ポートスキャンの前に、そもそもホストが生きているか を知る必要があります。オフライン機器にポートスキャンを投げても、時間を無駄にしノイズをまく だけ。まずは 生存確認 → ポートスキャン の順で効率化しましょう。
4つのアプローチ
1) ARP(同一サブネット最強)
同一サブネットにいるなら ARPが最速・最確実。MACアドレス解決の副産物として「生存」が分かります。
# 同一サブネットの生存ホスト列挙(ARP)
sudo nmap -PR -sn 10.0.1.0/24
- 要 root/sudo(特権ユーザ)
- 出力に MAC Address が載るのが目印
- 失敗したら:本当に同一セグメント?VLAN越えは不可
補助ツール:
arp-scan
sudo arp-scan -l(ローカルネット全体)/sudo arp-scan -I eth0 -l(IF指定)
※ 未インストールならapt install arp-scan
2) ICMP(Echo/Timestamp/Address Mask)
ICMPが通る環境では Echo(ping) が手堅い。Echoが塞がれていても Timestamp で拾えることがあります。
# Echo(通れば最短)
sudo nmap -PE -sn 10.0.1.0/24
# Timestamp(Echoが塞がれている時の次善策)
sudo nmap -PP -sn 10.0.1.0/24
# Address Mask(通らない環境も多い)
sudo nmap -PM -sn 10.0.1.0/24
- ファイアウォールに塞がれやすい のが難点
- 同一サブネットなら内部でARPが先行することも(結果にMACが見える)
3) TCP SYN / ACK(ICMPが塞がれてるときの切り札)
公開されがちな 80, 443 などに対して SYN/ACK を送って 反応(SYN/ACK or RST) を観測し、生存判定します。
# SYN Ping:公開ポート候補を複数試す
sudo nmap -PS22,80,443 -sn 10.0.1.0/24
# ACK Ping:RST応答で生存判定
sudo nmap -PA80,443 -sn 10.0.1.0/24
- 特権ユーザ だとSYNの“未完了”送信が可能(静かで速い)
- ポート選定が命:環境に合わせた一般的/社内的ポート を混ぜるとヒット率↑
4) UDP(ICMP Port Unreachable を引き出す)
UDPは開いていても応答が無いのが普通。逆に 閉じていると ICMP Port Unreachable が返り、生存判定できます。
# 代表的なUDP(DNS, SNMP など)を当てる
sudo nmap -PU53,161,162 -sn 10.0.1.0/24
- ネットワーク機器の挙動で 反応にムラ が出やすい
- TCP/ICMPと併用 してカバレッジを上げるのが実務的
逆引きDNSの扱い(静かにいく?名前が欲しい?)
-
静かに・速く:
-n(DNS逆引きオフ) -
オフラインでも名前が欲しい:
-R(全ホスト逆引き試行) -
特定DNSを使う:
--dns-servers 8.8.8.8
# 逆引きなしでサクッと
sudo nmap -sn -n 10.0.1.0/24
# 逆引きを全ホストに実施(ノイズ増)
sudo nmap -sn -R 10.0.1.0/24
ダッシュボード風・実務レシピ(状況別ベストプラクティス)
同一サブネット(社内LAN)で全体を素早く把握
sudo nmap -PR -sn 10.0.1.0/24 -oN hosts-arp.txt
- まずARPで確実に拾う → 後続のポートスキャン対象に
ICMP塞がれてるゼ…という社内セグメント
sudo nmap -PS22,80,443 -PA80,443 -sn 10.0.1.0/24 -oN hosts-tcp.txt
- SYNとACKをミックスして検出率UP
サーバ室/ネットワーク機器混在(UDPも見たい)
sudo nmap -PS80,443 -PU53,161 -sn 10.0.1.0/24 -oN hosts-mix.txt
- DNSやSNMP周りでICMP Port Unreachableを拾う作戦
ターゲットリストが既にある場合
nmap -sn -iL targets.txt -oN hosts-list.txt
Wiresharkでの観測のコツ
-
ARP:
arpフィルタでブロードキャストとReplyを観察(対象IPがズラッと出る) -
ICMP Echo:
icmp.type == 8(Echo Request)とicmp.type == 0(Echo Reply) -
TCP SYN:
tcp.flags.syn == 1 && tcp.flags.ack == 0(送信)/syn==1 && ack==1(返答) -
TCP ACK:
tcp.flags.ack == 1送ってtcp.flags.reset == 1を受ける -
UDP→ICMP:
icmp.type == 3 && icmp.code == 3(Port Unreachable)
反応が薄い時は、まず 経路上のFW/IDS を疑って観測するのがプロの一手。
うまくいかないときの即断レシピ(ミニFAQ)
-
誰も見つからない(同一セグメントのはず)
→ VLAN違い?仮想スイッチのセグメント違い? まずip a/ ルーティングを再確認。 -
ICMPゼロ
→-PS/-PA/-PUの 混合アプローチ に切り替え。 -
やたら遅い
→-T4で速度調整、--max-retries 1で再送抑制(誤検出リスクは上がる)。 -
ノイズを抑えたい
→-n(逆引き停止)、ARP中心(同一サブネット)、ポートの的を絞る。
“masscan”という選択肢(超高速だけど荒っぽい)
大量ホストを一気にスイープしたい時に有効。攻撃的で検知されやすい のでオンプレでは慎重に。
# 代表例(インストール:apt install masscan)
sudo masscan 10.0.1.0/24 -p80,443 --rate 5000 -oL masscan.lst
-
--rateは送出レート。インフラに負荷を掛けるので要注意 - ざっくり当たりを付け → Nmapで丁寧に確定、の二段構えが現実的
チートシート
# 1) ARP(同一サブネット最強)
sudo nmap -PR -sn 10.0.1.0/24
# 2) ICMP(Echo/Timestamp)
sudo nmap -PE -sn 10.0.1.0/24
sudo nmap -PP -sn 10.0.1.0/24
# 3) TCP SYN/ACK(ICMPが塞がれてる時)
sudo nmap -PS22,80,443 -sn 10.0.1.0/24
sudo nmap -PA80,443 -sn 10.0.1.0/24
# 4) UDP(ICMP Port Unreachable で生存判定)
sudo nmap -PU53,161 -sn 10.0.1.0/24
# オプション系
# 逆引き無しで静かに
sudo nmap -sn -n 10.0.1.0/24
# 既存リストから
nmap -sn -iL targets.txt
# 保存(通常テキスト)
sudo nmap -sn 10.0.1.0/24 -oN hosts.txt
注意事項(法令・コンプラ)
- 許可のないネットワークへのスキャンはNG。法的リスク・就業規則違反の可能性があります。
- 社内でも レートや時間帯 を調整し、関係者と合意形成を。ログ を残しましょう。
まとめ
- 同一サブネット → ARPが王道。
- ICMPが塞がれても TCP SYN/ACK、さらに UDP で補完し検出率UP。
- 実務では 静かさ(-n, ポート選定) と 速度(-T/--max-retries) のバランス設計がポイント。
「見えない=いない」ではない。手札を増やして 見えるまで粘る。これが大人のネットワーク調査術です。
付録:Mermaidで見るパケットの流れ
TCP 3ウェイ・ハンドシェイク(SYN pingのイメージ)
ARP(同一セグメント)