來源: Nmap Official Reference Guide
適合對象: 資安新手、網路管理員、滲透測試學習者
什麼是 Nmap?
Nmap(Network Mapper) 是一套開源的網路探索與資安稽核工具,由 Gordon “Fyodor” Lyon 開發並維護。它最初設計用於快速掃描大型網路,同樣也適用於單一主機。
Nmap 能做什麼?
| 功能 | 說明 |
|---|---|
| 主機探索 | 找出網路上有哪些主機存活 |
| 連接埠掃描 | 偵測主機上開放了哪些連接埠 |
| 服務識別 | 判斷各連接埠執行的應用程式名稱與版本 |
| OS 偵測 | 猜測目標主機的作業系統類型與版本 |
| 防火牆偵測 | 判斷是否有封包過濾或防火牆規則 |
| 腳本掃描(NSE) | 執行進階安全稽核、漏洞偵測腳本 |
安裝方式
Linux(Debian / Ubuntu)
sudo apt update && sudo apt install nmap
Linux(RHEL / CentOS / Fedora)
sudo dnf install nmap
macOS(使用 Homebrew)
brew install nmap
Windows
至官方下載頁面取得安裝程式:
https://nmap.org/download.html
確認安裝版本
nmap --version
基本語法
nmap [掃描類型] [選項] {目標}
最簡單的一條指令:
nmap 192.168.1.1
這會對目標主機的 1,000 個常用 TCP 連接埠 執行預設掃描。
目標指定方式
Nmap 支援多種目標格式,非常靈活:
| 格式 | 範例 | 說明 |
|---|---|---|
| 單一 IP | 192.168.1.1 |
掃描單一主機 |
| 主機名稱 | scanme.nmap.org |
使用 DNS 解析 |
| CIDR 網段 | 192.168.1.0/24 |
掃描整個 /24 子網段(256 台) |
| 範圍表示 | 192.168.1.1-50 |
掃描 .1 到 .50 |
| 萬用字元 | 192.168.1.* |
等同 /24 |
| 清單檔案 | -iL targets.txt |
從檔案讀取目標清單 |
| 排除目標 | --exclude 192.168.1.5 |
排除特定 IP |
範例:
# 掃描整個內網子網段
nmap 192.168.1.0/24
# 從清單檔案掃描
nmap -iL my_targets.txt
# 排除特定主機
nmap 192.168.1.0/24 --exclude 192.168.1.1
主機探索
在掃描連接埠之前,Nmap 會先確認哪些主機存活(online)。
常用主機探索選項
| 選項 | 說明 |
|---|---|
-sn |
只做主機探索,不掃描連接埠(原 -sP) |
-Pn |
跳過主機探索,直接掃描所有目標(假設全部存活) |
-PS [port] |
用 TCP SYN 封包做主機探索 |
-PA [port] |
用 TCP ACK 封包做主機探索 |
-PU [port] |
用 UDP 封包做主機探索 |
-PE |
用 ICMP echo request(ping)做主機探索 |
-n |
不做 DNS 解析(加快速度) |
-R |
對所有目標做 DNS 反查 |
範例:
# 只 ping 掃描,找出網段內存活的主機
nmap -sn 192.168.1.0/24
# 目標可能封鎖 ping,直接強制掃描
nmap -Pn 192.168.1.100
連接埠狀態說明
Nmap 將連接埠分為以下 六種狀態,這是理解掃描結果最重要的基礎:
| 狀態 | 圖示 | 說明 |
|---|---|---|
open |
🟢 | 有應用程式正在監聽此連接埠,可接受連線 |
closed |
🔴 | 連接埠可達,但目前沒有應用程式在監聽 |
filtered |
🟡 | 封包被防火牆攔截,無法判斷開放或關閉 |
unfiltered |
⚪ | 連接埠可達,但 Nmap 無法判斷開放或關閉(僅 ACK 掃描) |
open\|filtered |
🔵 | 無法區分是開放還是被過濾(常見於 UDP、FIN 掃描) |
closed\|filtered |
🟣 | 無法區分是關閉還是被過濾(僅 IP ID idle 掃描) |
💡 新手重點:
open代表服務存在,是攻擊者和管理員都最在意的狀態。filtered通常代表有防火牆。
掃描技術總覽
TCP 掃描
-sS — TCP SYN 掃描(預設、最常用)
sudo nmap -sS 192.168.1.1
- 又稱「半開放掃描」(Half-open Scan)
- 送出 SYN 封包,收到 SYN/ACK 表示開放,收到 RST 表示關閉
- 不完成完整 TCP 三次握手,較不易被日誌記錄
- 需要 root / 管理員權限
- 速度快,每秒可掃描數千個連接埠
Client → [SYN] → Target
Client ← [SYN/ACK] ← Target ← 表示 open
Client → [RST] → Target ← 立刻中斷,不完成握手
-sT — TCP Connect 掃描
nmap -sT 192.168.1.1
- 不需要 root 權限,使用系統的
connect()呼叫 - 完成完整三次握手,較容易被目標記錄在 log 中
- 當無法使用 SYN 掃描時的替代方案
-sU — UDP 掃描
sudo nmap -sU 192.168.1.1
- 掃描 UDP 連接埠(DNS:53、SNMP:161、DHCP:67 等)
- 速度較慢,因為 UDP 無回應通常代表
open|filtered - 常與 TCP 掃描合用:
sudo nmap -sS -sU 192.168.1.1
-sN / -sF / -sX — Null / FIN / Xmas 掃描
sudo nmap -sN 192.168.1.1 # Null 掃描(不設任何 flag)
sudo nmap -sF 192.168.1.1 # FIN 掃描
sudo nmap -sX 192.168.1.1 # Xmas 掃描(FIN+PSH+URG)
- 利用 TCP RFC 漏洞,可繞過部分非狀態防火牆
- 若收到 RST →
closed;無回應 →open|filtered - ⚠️ 對 Windows、Cisco 等設備效果不佳(會把所有埠回報為 closed)
-sA — TCP ACK 掃描
sudo nmap -sA 192.168.1.1
- 不用於找開放連接埠,而是用來分析防火牆規則
- 判斷防火牆是有狀態(stateful)還是無狀態(stateless)
連接埠指定方式
| 選項 | 範例 | 說明 |
|---|---|---|
-p [port] |
-p 80 |
掃描特定連接埠 |
-p [range] |
-p 1-1024 |
掃描連接埠範圍 |
-p [list] |
-p 22,80,443 |
掃描多個指定連接埠 |
-p- |
-p- |
掃描所有 65535 個連接埠 |
-F |
-F |
快速掃描(僅前 100 個常用埠) |
--top-ports [n] |
--top-ports 1000 |
掃描前 N 個最常用連接埠 |
# 掃描所有連接埠
sudo nmap -p- 192.168.1.1
# 只掃描 Web 相關埠
nmap -p 80,443,8080,8443 192.168.1.1
服務與版本偵測
nmap -sV 192.168.1.1
啟用服務版本偵測,Nmap 會進一步探測每個開放連接埠實際執行的應用程式與版本號。
輸出範例:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu
80/tcp open http Apache httpd 2.4.52
443/tcp open ssl/http nginx 1.22.0
版本偵測強度控制
nmap -sV --version-intensity 5 # 預設(0-9,數字越高越詳盡但越慢)
nmap -sV --version-light # 快速但準確度較低(等同 --version-intensity 2)
nmap -sV --version-all # 最詳盡(等同 --version-intensity 9)
作業系統偵測
sudo nmap -O 192.168.1.1
Nmap 透過分析目標的 TCP/IP 協定實作差異,推測目標的作業系統。
輸出範例:
OS details: Linux 5.4 - 5.15
Running: Linux 5.X
OS CPE: cpe:/o:linux:linux_kernel:5
⚠️ OS 偵測需要 root 權限,且至少需要一個開放和一個關閉的連接埠才能準確判斷。
Nmap 腳本引擎
NSE(Nmap Scripting Engine) 是 Nmap 最強大的功能之一,使用 Lua 語言撰寫的腳本可執行各種進階任務。
腳本分類
| 類別 | 說明 |
|---|---|
auth |
身份驗證相關(如預設密碼測試) |
brute |
暴力破解密碼 |
discovery |
服務探索與資訊蒐集 |
exploit |
漏洞利用 |
malware |
偵測惡意軟體後門 |
safe |
安全、不具破壞性的腳本 |
vuln |
漏洞偵測 |
使用方式
# 使用預設腳本集合(safe + discovery 類)
nmap -sC 192.168.1.1
# 執行特定腳本
nmap --script=http-title 192.168.1.1
# 執行某個類別的所有腳本
nmap --script=vuln 192.168.1.1
# 執行多個腳本
nmap --script=http-headers,http-methods 192.168.1.1
常用 NSE 腳本
| 腳本名稱 | 用途 |
|---|---|
http-title |
取得網頁標題 |
http-headers |
顯示 HTTP 回應標頭 |
ssh-hostkey |
取得 SSH 主機金鑰 |
smb-os-discovery |
透過 SMB 取得 OS 資訊 |
ftp-anon |
檢查 FTP 是否允許匿名登入 |
ssl-cert |
取得 SSL 憑證資訊 |
vuln |
執行所有漏洞偵測腳本 |
banner |
抓取服務 Banner |
時間與效能控制
時序模板(Timing Templates)
Nmap 提供 6 個時序等級,用 -T<0-5> 指定:
| 等級 | 名稱 | 說明 | 適用情境 |
|---|---|---|---|
-T0 |
Paranoid | 極慢,每 5 分鐘送一個封包 | 躲避 IDS 偵測 |
-T1 |
Sneaky | 非常慢 | 躲避 IDS 偵測 |
-T2 |
Polite | 慢速,減少對目標影響 | 降低網路負載 |
-T3 |
Normal | 預設值 | 一般使用 |
-T4 |
Aggressive | 較快,適合快速網路 | 本機網路、CTF |
-T5 |
Insane | 最快,可能遺漏資訊 | 極快速網路 |
# 最常用的快速掃描組合
nmap -T4 -A 192.168.1.1
細部效能選項
--min-rate 1000 # 每秒最少送出 1000 個封包
--max-retries 2 # 最多重試 2 次
--host-timeout 30m # 單一主機逾時設為 30 分鐘
--scan-delay 1s # 每次探測間隔 1 秒
輸出格式
| 選項 | 說明 |
|---|---|
-oN <file> |
一般文字格式輸出 |
-oX <file> |
XML 格式輸出(可匯入其他工具) |
-oG <file> |
Grepable 格式(方便 grep/awk 處理) |
-oA <basename> |
同時輸出以上三種格式 |
-v |
顯示詳細過程(verbose) |
-vv |
更詳細的過程輸出 |
--open |
只顯示開放的連接埠 |
--reason |
顯示判斷連接埠狀態的原因 |
# 掃描並儲存所有格式的結果
nmap -A -T4 -oA scan_result 192.168.1.0/24
# 只顯示開放埠,並儲存為文字
nmap --open -oN open_ports.txt 192.168.1.1
常用指令速查表
# ── 快速掃描 ──────────────────────────────────────────
nmap 192.168.1.1 # 預設掃描(1000 常用 TCP 埠)
nmap -F 192.168.1.1 # 快速掃描(100 個最常用埠)
nmap -p- 192.168.1.1 # 掃描全部 65535 個埠
# ── 主機探索 ──────────────────────────────────────────
nmap -sn 192.168.1.0/24 # 僅 ping 掃描,不掃連接埠
nmap -Pn 192.168.1.1 # 跳過 ping,直接掃描
# ── 服務 & OS 偵測 ────────────────────────────────────
nmap -sV 192.168.1.1 # 服務版本偵測
nmap -O 192.168.1.1 # OS 偵測(需 root)
nmap -A 192.168.1.1 # 全面掃描(OS + 版本 + Script + Traceroute)
# ── 掃描類型 ──────────────────────────────────────────
sudo nmap -sS 192.168.1.1 # SYN 掃描(預設,需 root)
nmap -sT 192.168.1.1 # TCP Connect 掃描(不需 root)
sudo nmap -sU 192.168.1.1 # UDP 掃描
sudo nmap -sN 192.168.1.1 # NULL 掃描
# ── NSE 腳本 ──────────────────────────────────────────
nmap -sC 192.168.1.1 # 執行預設腳本
nmap --script=vuln 192.168.1.1 # 漏洞偵測
nmap --script=http-title 192.168.1.1 # 取得網頁標題
# ── 輸出 ──────────────────────────────────────────────
nmap -oN output.txt 192.168.1.1 # 輸出文字結果
nmap -oX output.xml 192.168.1.1 # 輸出 XML 結果
nmap -oA all_formats 192.168.1.1 # 輸出所有格式
# ── 最常用的綜合指令 ──────────────────────────────────
sudo nmap -A -T4 -p- -oA full_scan 192.168.1.1
實際範例演練
範例 1:探索內網存活主機
nmap -sn 192.168.1.0/24
目的: 快速找出內網中哪些 IP 有主機在線上。
範例 2:對某主機做完整偵查
sudo nmap -A -T4 scanme.nmap.org
輸出解讀:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 5.3p1
80/tcp open http Apache httpd 2.2.14
646/tcp filtered ldp
9929/tcp open nping-echo Nping echo
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.39
範例 3:針對 Web 伺服器的快速資訊蒐集
nmap -p 80,443,8080,8443 -sV --script=http-title,http-headers 192.168.1.10
範例 4:同時掃描 TCP 和 UDP
sudo nmap -sS -sU -p T:22,80,443,U:53,161,67 192.168.1.1
範例 5:儲存完整掃描結果
sudo nmap -A -T4 -p- -oA pentest_report 192.168.1.1
# 會產生:pentest_report.nmap / pentest_report.xml / pentest_report.gnmap
法律與倫理警告
重要:使用 Nmap 前請務必閱讀
根據 Nmap 官方文件的法律聲明:
合法使用 Nmap 的情境:
– 掃描你自己擁有的系統或網路
– 獲得書面授權後對他人系統進行安全稽核
– 在隔離的測試環境(如虛擬機、實驗室)中練習
禁止的行為:
– 未經授權掃描他人的系統或網路
– 掃描公共網路上不屬於你的主機
– 利用掃描結果進行惡意攻擊
未經授權的網路掃描在許多國家和地區屬於違法行為,可能面臨民事或刑事責任。在台灣,依《個人資料保護法》及《刑法》第 358-363 條,未授權存取電腦系統可構成刑事犯罪。
建議練習環境:
– 官方練習目標:scanme.nmap.org(Nmap 官方授權掃描)
– 本機虛擬機(VirtualBox / VMware)
– 平台:Hack The Box、TryHackMe、VulnHub
參考資源
| 資源 | 連結 |
|---|---|
| Nmap 官方手冊 | https://nmap.org/book/man.html |
| Nmap 官方下載 | https://nmap.org/download.html |
| NSE 腳本資料庫 | https://nmap.org/nsedoc/ |
| Zenmap(GUI 版) | https://nmap.org/zenmap/ |
| 官方練習目標 | scanme.nmap.org |
