[工具應用] 009 Nmap 完整入門指南

來源: 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
飛飛
飛飛

講師學歷:臺科資工所、逢甲資工系畢業。
技術專長:OSINT、滲透測試、網站開發、專業易懂教育訓練。
證照書籍:OSCP、OSCE³、著《資安這條路:領航新手的 Web Security 指南》。
教學經驗:60+ 企業教學經驗、指導過上百位學員。
教學特色:新手友善、耐心指導、擅長圖解(流程圖、心智圖)引導學習。
社群經驗:目前經營全臺資安社群 CURA,曾任臺科資安社社長、逢甲黑客社社長。
社群交流:LINE 社群《飛飛的資安大圈圈》,即時分享經驗、鼓勵交流。
社群分享:FB 粉專《資安這條路,飛飛來領路》,分享文章與圖卡整理。
個人網站:feifei.tw 分享資安技術文章;pbtw.tw 分享 AI 相關應用;ssdlc.feifei.tw 分享軟體安全開發流程文章。

飛飛
電話:02-23120400
Email:[email protected]
地址:臺北市中山區復興北路48號7樓