第1部分:认识Nmap —— 网络中的“地图绘制仪”
本文最后更新于5 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

Nmap(Network Mapper)是一款开源的网络探测和安全审计工具。你可以把它想象成网络世界里的“地图绘制仪”或“雷达”,它的核心作用是帮你发现、探索和理解网络。

  • 它能做什么?
    • 发现主机:找出网络里有哪些设备在线。
    • 扫描端口:检查目标设备上哪些“门”(端口)是打开的。
    • 识别服务:判断这些开放的“门”后运行的是什么程序(如Web服务器、数据库),甚至是什么版本。
    • 推测系统:分析目标设备运行的操作系统类型。
    • 高级脚本:通过内置脚本引擎进行漏洞检测等更深入的工作。
  • 重要前提:法律与道德
    未经授权扫描他人的网络或系统,在很多地区是违法行为。请仅在你拥有合法权限的网络(如你自己的家庭网络、公司授权测试的网络、或专门的实验环境如Metasploitable2)中进行练习。

第2部分:安装Nmap

Nmap支持所有主流操作系统。官方下载地址是 https://nmap.org/download.html

  • Windows系统
    1. 从官网下载安装包(如 nmap-7.98-setup.exe)。
    2. 运行安装程序,务必勾选安装 Npcap(这是实现扫描功能的核心驱动)。
    3. 可选勾选 Zenmap(图形界面,适合新手入门)。
    4. 安装完成后,打开“命令提示符”,输入 nmap --version,如显示版本号则安装成功。
  • Linux (Ubuntu/Debian)
    在终端中执行: sudo apt-get update sudo apt-get install nmap
  • macOS
    如果你安装了Homebrew,在终端执行: brew install nmap

第3部分:核心操作实战 —— 从简单到精通

Nmap的基本命令格式为:nmap [扫描类型] [选项] {目标}。下面我们从最简单的命令开始。

第一步:验证安装与首次扫描
打开命令行(终端/CMD),输入以下命令,这将对Nmap官方提供的测试主机进行一次最基础的扫描。

nmap scanme.nmap.org

你会看到一个简单的报告,列出该主机开放的端口及对应的服务名称(如 80/tcp open http)。

第二步:掌握四大核心扫描技术
针对不同场景和目标,你需要选择不同的扫描方式。下表对比了最常用的几种:

扫描类型命令选项工作原理特点与适用场景所需权限
TCP SYN扫描 (半开放扫描)-sS发送SYN包,收到SYN/ACK回复即认为端口开放,随后中断连接,不完成三次握手。速度快、隐蔽性好,是最常用、默认的扫描方式。需要管理员/root权限
TCP Connect扫描 (全连接扫描)-sT完成完整的TCP三次握手建立连接。无需特殊权限,在无法使用SYN扫描时使用。但速度较慢,且会在目标日志中留下完整连接记录普通用户权限即可。
UDP扫描-sU向目标端口发送UDP包,根据响应判断状态。用于探测DNS、DHCP、SNMP等UDP服务。速度很慢,因为UDP协议无连接,需要等待超时。需要管理员/root权限。
Ping扫描 (主机发现)-sn不扫描端口,只检查网段中有哪些主机在线。快速盘点网络资产,例如 nmap -sn 192.168.1.0/24通常需要管理员权限。

核心扫描技术详解与实战示例

理解不同扫描类型的关键在于明白它们如何与目标主机的端口进行“对话”。下面我们通过一个假设的目标IP 192.168.1.105 来演示。

1. TCP SYN扫描 (-sS): 默认的、最受欢迎的扫描

工作原理:它发送一个SYN包(请求连接),如果端口开放,目标会回复SYN/ACK包;Nmap收到后,不会完成握手(不发送ACK),而是发送一个RST包中断连接。这个过程没有建立完整连接,因此相对隐蔽。

命令例子

sudo nmap -sS 192.168.1.105

注意:在Linux/Unix系统上,-sS 扫描通常需要 sudo 获取root权限,因为需要构造原始数据包。

在初学的时侯,我们不都是直接采用sudo命令吗?这里为什么要提到获取root权限?一般不都是安卓才会提到root吗?sudo 本身就是“临时获取root权限”的工具,不是独立的权限,安卓的root和Linux的root是同一个概念,只是场景叫法不同。

通俗拆解

1. root是Linux/Unix的“最高管理员权限”
系统里所有核心操作(如构造原始数据包、修改系统文件、查看所有进程)都需要root权限,普通用户默认没有,-sS半开放扫描需要构造自定义IP/TCP数据包,属于核心操作,必须root。

2. sudo是“临时借root权限”的命令
你输入 sudo 某命令 ,本质是告诉系统:“请以root身份执行这个命令”,执行完后权限会自动回到普通用户,避免一直用root操作带来的风险(比如误删系统文件)。

3. 安卓的root和Linux的root是一回事
安卓本身是基于Linux内核的系统,安卓里说的“获取root”,就是拿到安卓系统的最高管理员权限,和Linux/Unix里的root权限完全同源,只是手机端为了安全,默认把root权限锁死了,需要额外操作解锁;而电脑端的Linux/Unix(如Ubuntu、CentOS)默认不锁root,但普通用户执行高权限操作需要用sudo临时调用。

简单说:不是“sudo之外还要获取root”,而是“通过sudo来获取执行该命令所需的root权限”。

输出与解读

Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-29 19:35 +0800
Nmap scan report for 192.168.1.105
Host is up (0.0000070s latency).

PORT      STATE SERVICE
1/tcp     open  tcpmux
3/tcp     open  compressnet
4/tcp     open  unknown
6/tcp     open  unknown
7/tcp     open  echo
9/tcp     open  discard
13/tcp    open  daytime
63331/tcp open  unknown
64623/tcp open  unknown
64680/tcp open  unknown
65000/tcp open  unknown
65129/tcp open  unknown
65389/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.80 seconds

这个扫描结果极有可能是“不真实”或“被误导”的。 它显示目标主机(192.168.1.105)有超过900个TCP端口全部开放,这在真实世界中几乎不可能发生。

2. TCP Connect扫描 (-sT): 无需特权的后备方案

工作原理:使用系统自带的 connect() 函数完成完整的三次握手。因为行为与普通应用程序连接完全相同,所以不需要特殊权限,但也因此会在目标系统日志中留下完整的连接记录,不够隐蔽。

命令例子

nmap -sT 192.168.1.105

输出与SYN扫描对比
输出结果与 -sS 扫描相似,都能发现开放的端口。但关键区别在于行为层面:目标系统的网络连接日志(如/var/log/secure或Windows事件日志)里,-sT扫描会产生类似于 “Client 192.168.1.100 connected to 192.168.1.105:22” 的记录,而 -sS扫描可能只留下一个不完整的连接尝试记录,甚至被某些防火墙忽略。

# Nmap 7.98 scan initiated Thu Jan 29 20:15:19 2026 as: nmap -sT -T4 -v --reason -p 1-100 -oN tcp_detailed.txt 192.168.0.104
Nmap scan report for 192.168.0.104
Host is up, received localhost-response (0.000017s latency).
All 100 scanned ports on 192.168.0.104 are in ignored states.
Not shown: 100 closed tcp ports (conn-refused)

Read data files from: D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap
# Nmap done at Thu Jan 29 20:15:20 2026 -- 1 IP address (1 host up) scanned in 0.76 seconds

3. UDP扫描 (-sU): 探索另一片天地

工作原理:向目标UDP端口发送一个空的UDP包。如果收到“端口不可达”的ICMP响应,则端口为closed;如果收到任何其他UDP响应,则端口为open;如果完全没有响应,则状态为open|filtered(开放或被过滤)。

命令例子

sudo nmap -sU -p 53,67,123,161 192.168.1.105

-p指定了常见的UDP端口:DNS, DHCP, NTP, SNMP。UDP扫描非常慢,所以务必指定端口。)

输出与解读

D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap -sU -p 53,67,123,161 192.168.0.104
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-29 20:18 +0800
Nmap scan report for 192.168.0.104
Host is up (0.000095s latency).

PORT    STATE  SERVICE
53/udp  closed domain
67/udp  closed dhcps
123/udp closed ntp
161/udp closed snmp

Nmap done: 1 IP address (1 host up) scanned in 0.83 seconds
  • 输出解析
    • Host is up:目标主机在线
    • 延迟极低(0.000095秒),说明在同一局域网内。
端口服务状态含义
53/udpdomain (DNS)closedDNS服务未运行
67/udpdhcps (DHCP服务器)closedDHCP服务器未运行
123/udpntp (时间同步)closedNTP时间服务未运行
161/udpsnmp (网络管理)closedSNMP服务未运行

4. Ping扫描 (-sn): 快速网络普查

工作原理:不扫描任何端口,只发送ICMP回声请求、TCP SYN包到443端口、TCP ACK包到80端口等组合探针,来探测主机是否在线。这是快速绘制网络地图的最佳工具。

命令例子

sudo nmap -sn 192.168.1.0/24

输出与解读

D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap -sn 192.168.0.104/24
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-29 20:31 +0800
Nmap scan report for 192.168.0.1
Host is up (0.060s latency).
MAC Address: 74:39:89:D7:9F:1C (TP-Link Technologies)
Nmap scan report for 192.168.0.100
Host is up (0.076s latency).
MAC Address: DE:07:9A:12:91:AD (Unknown)
Nmap scan report for 192.168.0.101
Host is up (0.19s latency).
MAC Address: 52:2C:14:9E:05:E8 (Unknown)
Nmap scan report for 192.168.0.102
Host is up (0.14s latency).
MAC Address: EA:89:88:56:76:7D (Unknown)
Nmap scan report for 192.168.0.103
Host is up (1.4s latency).
MAC Address: 52:B8:77:87:4B:BB (Unknown)
Nmap scan report for 192.168.0.104
Host is up.
Nmap done: 256 IP addresses (6 hosts up) scanned in 6.51 seconds
  • 输出解析
    • 它快速扫描了整个 192.168.1.0192.168.1.255 的网段,发现了3台在线设备。
    • 列出了每台设备的IP和MAC地址,甚至根据MAC地址推测了厂商,这对网络拓扑分析非常有帮助。

总结与综合应用示例

可以参考下表:

扫描类型典型命令核心目的输出关键信息注意事项
TCP SYN扫描sudo nmap -sS 目标全面、隐蔽的端口普查所有开放的TCP端口及服务名。需要Root权限,是专业渗透测试首选。
TCP Connect扫描nmap -sT 目标在无法获得Root权限时进行端口扫描。同上,但准确性可能受防火墙影响。会在目标留下日志,速度较慢。
UDP扫描sudo nmap -sU -p 常用端口 目标发现DNS、DHCP、SNMP等UDP服务openopen|filteredclosed极其缓慢,必须指定端口范围。
Ping扫描sudo nmap -sn 网段快速发现网络中有哪些活跃主机在线主机的IP和MAC地址。不扫描端口,纯粹用于主机发现。

第三步:常用功能组合与目标指定
实际应用中,我们常组合多个选项,并对不同类型的目标进行扫描。

  • 指定扫描端口
    • -p 80:只扫描80端口。
    • -p 1-1000:扫描1到1000号端口。
    • -p 22,80,443:扫描指定的22、80、443端口。
    • -p-:扫描所有65535个端口(速度慢,谨慎使用)。
  • 服务与版本探测
    加上 -sV 选项,Nmap会尝试连接开放端口,并探测运行服务的具体软件名称和版本号,这对安全评估至关重要。 nmap -sV 目标IP
  • 操作系统探测
    加上 -O 选项,Nmap会尝试猜测目标主机的操作系统nmap -O 目标IP
  • 综合扫描(“火力全开”)
    使用 -A 选项,可以同时启用操作系统检测、版本检测、脚本扫描和路由跟踪,一次性获取最全面的信息。 nmap -A 目标IP
  • 指定目标的方式
    • 单个IP:192.168.1.1
    • 主机名:example.com
    • 网段(CIDR格式):192.168.1.0/24
    • 范围:192.168.1.1-100
    • 从文件读取目标列表:-iL targets.txt

好的,我们深入探讨Nmap的进阶技巧,这部分内容能让你的扫描从“基础探测”升级为“专业评估”。

第4部分:进阶技巧与策略详解

掌握这些技巧,你将能更高效、更隐蔽、更深入地完成扫描任务。

1. 脚本引擎(NSE)实战:让Nmap“拥有智慧”

Nmap脚本引擎是它的“超级大脑”,通过上千个脚本实现了各种自动化任务。脚本库主要分为几类:safe(安全)、intrusive(侵入性)、vuln(漏洞)、exploit(利用)、auth(认证破解)、discovery(发现)等。

(1)信息搜集类脚本
在渗透测试的信息搜集阶段非常有用。

  • 获取HTTP服务信息
  nmap --script http-headers,http-title,http-robots.txt -p 80,443 114.66.59.86

输出解读

D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap --script http-headers,http-title,http-robots.txt -p 80,443 114.66.59.86
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-29 22:23 +0800
Nmap scan report for 114.66.59.86
Host is up (0.023s latency).

PORT    STATE  SERVICE
80/tcp  open   http
|_http-title: Did not follow redirect to http://183.136.132.24   #访问 http://114.66.59.86 会重定向到 http://183.136.132.24,Nmap默认不跟随重定向,所以无法获取标题,被肘击了
| http-headers:
|   Server: Apache       # Web服务器:Apache
|   Content-Type: text/html;charset=UTF-8       # 内容类型和编码
|   Content-Length: 0      # 响应体为空(只有重定向)
|   Cache-control: no-store     # 禁止缓存
|   Location: http://183.136.132.24   # 重定向目标
|   Connection: close       # 关闭连接
|
|_  (Request type: GET)
443/tcp closed https

Nmap done: 1 IP address (1 host up) scanned in 9.30 seconds

这个命令一次性获取了服务器类型、编程语言、网站标题和潜在的敏感目录,是Web渗透的起点。

  • 发现更多服务信息
  nmap --script dns-brute --script-args dns-brute.domain=example.com 8.8.8.8

这个脚本会尝试对example.com进行DNS子域名暴力猜解,可能发现mail.example.comadmin.example.com等隐藏资产。

(2)漏洞检测类脚本
这是NSE最强大的用途之一,能自动检测已知漏洞。

  • 检测常见漏洞
  nmap --script vuln -p 80,443,21,25 192.168.1.105

输出解读(如果发现漏洞)

  21/tcp open  ftp
  | ftp-anon: Anonymous FTP login allowed (FTP code 230) # 发现FTP匿名登录!
  | ftp-syst:
  |   STAT:
  |_   此FTP服务器很可能被配置错误
  80/tcp open  http
  | http-slowloris-check:
  |   VULNERABLE:
  |   Slowloris DOS attack
  |     State: VULNERABLE
  |     Description:
  |       This web server is vulnerable to the Slowloris Denial of Service attack.
  |_    (风险详情和参考链接)

这个扫描直接识别出了允许匿名登录的FTP服务器(一个严重的安全配置错误)和潜在的Slowloris拒绝服务漏洞

  • 针对特定服务的漏洞检测
  nmap --script smb-vuln-ms17-010 -p 445 192.168.1.120

这个著名的“永恒之蓝”漏洞检测脚本,会专门检查目标Windows主机的445端口是否受MS17-010漏洞影响。

没有漏洞检测结果,由于端口状态是filtered:Nmap无法建立SMB连接,脚本无法发送检测包,因此无法判断是否存在漏洞

(3)安全审计类脚本
用于检查配置弱点,而非直接利用。

  • 检查数据库弱口令
  nmap --script mysql-brute --script-args userdb=/path/users.txt,passdb=/path/pass.txt 192.168.1.105

该脚本会使用提供的用户名和密码字典,尝试对MySQL服务进行暴力破解,验证是否存在弱密码。

(4)综合应用示例

# 对Web服务器进行一次深入且相对安静的“侦察”
nmap -sS -p 80,443 --script http-enum,http-sql-injection,http-xssed --script-args httpspider.maxpagecount=50 -T2 192.168.1.105
  • http-enum:枚举网站目录,寻找/admin/login等。
  • http-sql-injection:对发现的网页参数进行简单的SQL注入测试。
  • http-xssed:检查已知的XSS(跨站脚本)漏洞。
  • -T2:降低速度,减少对目标的影响和自身暴露的风险。

2. 调整扫描速度(-T模板)的实际影响

-T参数(0-5)不只是调节速度,它改变了扫描的并行度、重试次数、超时时间等一整套行为。

命令对比与场景分析:

# 场景1:扫描家用路由器,追求极速(牺牲隐蔽性)
nmap -T5 -F 192.168.1.1
# -T5 (Insane):极快,适合你完全控制的、稳定的内部网络。可能因速度过快漏报端口。

# 场景2:对生产服务器进行初步扫描,平衡速度与准确性
nmap -T4 -sS --top-ports 1000 目标服务器IP
# -T4 (Aggressive):默认推荐,在速度和可靠性间取得良好平衡。

# 场景3:进行隐蔽扫描,避免触发安全警报
nmap -T2 -sS -p 1-10000 目标IP
# -T2 (Polite):显著降低发包速度,增加延迟,使扫描流量混入正常背景流量中,难以被IDS(入侵检测系统)的阈值警报发现。

# 场景4:扫描网络链路差或严格过滤的设备
nmap -T1 -sS --max-retries 3 目标IP
# -T1 (Sneaky):非常慢,用于扫描老旧的、反应慢的或网络状况不佳的设备,也极其隐蔽。

3. 输出扫描结果:为报告和分析做准备

专业的扫描必须保存结果。

# 最佳实践:使用 -oA 一次性保存所有格式
sudo nmap -sS -sV -O -A -oA full_scan_report 192.168.1.105

这条命令执行综合扫描,并生成三个文件:

  • full_scan_report.nmap标准文本格式,便于人类阅读。
  • full_scan_report.xml结构化XML格式,可导入Metasploit、NeXpose、OpenVAS等漏洞管理平台进行后续分析。
  • full_scan_report.gnmapGrep友好格式,便于用grepawk等命令行工具快速提取特定信息,如 cat full_scan_report.gnmap | grep "open"

XML格式的优势:可以用浏览器打开,或使用Nmap自带的xsltproc工具转换为美观的HTML报告:

xsltproc full_scan_report.xml -o full_scan_report.html

4. 绕过防火墙/IDS的简单技巧

这些技巧主要针对简单的状态检测防火墙或基于规则的初级IDS。

  • 分片扫描 (-f) 与诱饵扫描 (-D)
  # 将TCP头分成多个小数据包发送,可能绕过简单的包过滤和IDS检测
  sudo nmap -f -sS 目标IP

  # 使用诱饵扫描,隐藏真实扫描源IP
  sudo nmap -D RND:5,me -sS 目标IP
  # 这条命令会生成5个随机的诱饵IP,并将自己的真实IP(me)混在其中,目标防火墙会看到来自6个不同IP的扫描流量,难以定位真实的你。
  • 指定源端口 (--source-port)
  # 假设目标防火墙信任来自53端口(DNS)的流量
  sudo nmap --source-port 53 -sS 目标IP

原理:一些配置不当的防火墙规则可能写着“允许来自53端口(UDP/TCP)的流量进入”,利用这一点可以穿过规则。

  • 使用随机顺序扫描 (--randomize-hosts) 和慢速扫描 (--scan-delay)
  # 随机化扫描主机的顺序,并设置每个探针之间的延迟
  sudo nmap -sS --randomize-hosts --scan-delay 1s 192.168.1.0/24

这会让扫描行为看起来不像一个自动化工具在按顺序“爬”IP地址,从而规避一些基于行为模式的IDS检测。

重要提醒:现代企业级防火墙和下一代IDS(如Suricata)具备深度包检测和异常流量分析能力,上述简单技巧很可能无效。它们主要用于应对老旧或配置简单的防御设备。

综合实战案例:一次完整的内部网络安全评估

假设你被授权评估 192.168.10.0/24 网段:

# 第1步:安静的资产发现,找出所有在线主机
sudo nmap -sn -T2 -oA network_hosts 192.168.10.0/24

# 第2步:分析上一步的结果文件,提取出在线主机IP(例如是 .50, .101, .150)
cat network_hosts.gnmap | grep "Status: Up" | cut -d" " -f2 > live_hosts.txt
# 第3步:对关键服务器(假设是.101)进行深度、隐蔽的端口和服务发现
sudo nmap -sS -sV -O -p- --script safe,discovery -T3 -oA deep_scan_101 192.168.10.101
# 第4步:根据第3步的结果,针对发现的特定服务(如Web、SMB)进行漏洞扫描
sudo nmap -p 80,443,445 --script vuln,http-vuln*,smb-vuln* -T2 -oA vuln_scan_101 192.168.10.101

通过这种分层、逐步深入的扫描策略,你可以在不惊扰目标系统的情况下,系统性地完成从发现到深度评估的全过程。

Nmap目标说明 – 详细教学指南

目标说明是Nmap扫描的起点,它定义了“你要扫描谁”。灵活且准确地指定目标是高效扫描的第一步。


第一部分:基础目标格式详解与示例

  1. 单个IP地址
    • 说明:最直接的形式,指向网络中的一台特定设备。
    • 示例
      bash nmap 192.168.1.1
      (扫描本地网关)
  2. 主机名(域名)
    • 说明:Nmap会自动通过DNS系统将主机名解析为IP地址。这非常方便,但需要注意,如果DNS记录不准确或存在CDN,扫描的可能是错误的服务器。
    • 示例
      bash nmap scanme.nmap.org nmap www.example.com
  3. CIDR无类别域间路由表示法
    • 核心概念/<位数> 表示网络前缀固定的长度。位数越大,范围越小越精确。
    • 记忆技巧:把它想象成“邮政编码”。/24 表示一个“小区”(256个地址),/16 表示一个“城区”(65536个地址)。
    • 示例与解析
      • 192.168.1.0/24
        • 含义:扫描从 192.168.1.0192.168.1.255 的所有IP(共256个)。
        • 应用场景:扫描整个家庭或小型办公网络。
      • 10.0.0.0/8
        • 含义:扫描从 10.0.0.010.10.255.255.255 的所有IP(约1677万个)。这是整个A类私有地址段。
        • 应用场景:大型企业内部网络发现(需谨慎,范围极大)。
      • 203.0.113.100/30
        • 含义:只扫描 203.0.113.100, 203.0.113.101, 203.0.113.102, 203.0.113.103 这4个IP。
        • 应用场景:扫描一个小的子网或一对点对点链路。
  4. 八位字节范围列表(最灵活)
    • 说明:这是Nmap最强大的目标指定功能之一。你可以为IP地址的四个部分(如 A.B.C.D)分别指定列表或范围。
    • 格式[范围1].[范围2].[范围3].[范围4]
    • 示例与解析
      • 192.168.1,2,3.1-254
        • 含义:扫描 192.168.1.1-254192.168.2.1-254192.168.3.1-254 三个网段的所有主机,但排除 .0(网络地址)和 .255(广播地址)。
        • 应用场景:扫描多个不连续的子网,并自动避开边界地址。
      • 10.0-255.0-255.1
        • 含义:扫描所有形如 10.x.y.1 的IP(x和y从0到255)。即所有子网的第一个可用主机(通常是网关)。
        • 应用场景:在大型网络中快速定位所有子网的网关。
      • 172.16-31.0-255.100-200
        • 含义:扫描整个B类私有地址段 172.16.0.0/12 中,所有IP最后一个字节在100到200之间的主机。
        • 应用场景:针对特定类型的服务器(如IP范围固定的终端服务器)进行扫描。

第二部分:高级目标选择选项详解与示例

这些选项用于管理复杂的扫描目标列表。

  1. -iL <文件名>:从列表文件输入
    • 为什么需要它:当你有成百上千个目标时,无法在命令行手动输入。你可以从资产管理系统、日志文件或其他扫描工具中导出目标列表。
    • 文件格式:每行一个目标,支持所有Nmap格式(IP、主机名、CIDR、范围)。支持空格、制表符分隔。
    • 示例
      1. 创建一个文件 targets.txt,内容如下:
        scanme.nmap.org 192.168.1.1 192.168.1.10-50 10.1.1.0/24
      2. 运行命令:
        bash nmap -iL targets.txt
    • 特殊用法:使用 - 从标准输入读取。可以与其他命令结合。
      bash echo “192.168.1.1” | nmap -iL - cat massive_list.txt | grep “web-server” | nmap -iL -
  2. -iR <数量>:随机目标生成
    • 警告仅在您拥有完全授权、用于学术研究或安全普查时使用! 随机扫描互联网主机在许多地区是非法的,且极易触发安全警报。
    • 用途:网络测量学研究、评估互联网服务的暴露面、测试IDS/IPS规则。
    • 示例
      bash # 随机选择100个IP地址,扫描其80和443端口 nmap -iR 100 -p 80,443 –open
  3. --exclude <目标1,目标2,...>--excludefile <文件名>:排除目标
    • 核心价值:在扫描一个大的范围时,避免扫描关键生产服务器、已知的蜜罐、或友邻网络,从而减少干扰和风险。
    • 示例
      bash # 扫描整个192.168.1.0/24网段,但不扫描网关和一台特定服务器 nmap 192.168.1.0/24 --exclude 192.168.1.1,192.168.1.50 # 扫描多个网段,但排除一个敏感的子网nmap 192.168.1.0/24,10.0.0.0/16 --exclude 10.0.1.0/24
    • --excludefile 用法与 -iL 类似,用于管理复杂的排除列表。

第三部分:使用指南与实践

  1. 如何选择目标格式?—— 决策流程图
    • 单台主机或域名 -> 直接使用IP或主机名
    • 一个连续的IP段(子网)-> 优先使用CIDR(如 /24),它最简洁。
    • 多个不连续IP、复杂范围、需要跳过特定地址 -> 必须使用八位字节范围列表
    • 目标列表已存在于文件中 -> 使用 -iL
    • 大范围扫描中需要避免某些主机 -> 结合使用 --exclude--excludefile
  2. 综合示例
    bash # 场景:扫描内部办公网络(192.168.10.0/24),但排除IT部门的服务器段(.100-.120)和打印机(.50),同时扫描DMZ区的一台Web服务器。 nmap 192.168.10.0/24,203.0.113.5 --exclude 192.168.10.100-120,192.168.10.50 -oN internal_scan.txt

Nmap主机发现 – 详细教学指南

主机发现的目标是将庞大的IP地址列表缩减为一份“活动主机”清单。盲目扫描所有IP的所有端口,在时间和资源上都是灾难。


第一部分:核心概念与默认行为解析

1. 核心比喻:如何“敲门”
想象你要确定一栋公寓楼里哪些房间有人。你可以:

  • 轻轻敲门(ICMP Echo):说“你好,有人吗?”
  • 试图拧动门把手(TCP SYN):看门是否锁着。
  • 检查门缝下是否有光(ARP请求):在同一个楼道里,直接喊房间主人的名字。
    Nmap的主机发现就是运用了网络世界中各种“敲门”方式。

2. 默认行为是什么?(必须知道)
当你在命令行只输入 nmap <目标> 而不指定任何发现选项时,Nmap会执行一套组合拳

  • 对局域网内的目标:默认使用 ARP发现 (-PR)。这是最快的,因为ARP是局域网通信的基础协议,无法被主机防火墙阻止。
  • 对非局域网(互联网)的目标
    • 发送一个 TCP ACK报文 到目标的80端口。
    • 发送一个 ICMP回声请求(ping)
    • (非特权用户) 发送一个 TCP SYN报文 到目标的80端口(通过connect()系统调用)。

补充

Nmap核心通过目标IP的网段属性+本地网卡的路由/子网配置判断目标是局域网(内网)还是外网,核心分3步执行,判断逻辑:

1. 匹配本地子网:Nmap先读取本地所有网卡的IP、子网掩码(如 192.168.1.0/24 、 10.0.0.0/8 ),判断目标IP是否落在本地直连的子网网段内,若是则判定为局域网。
2. 检查路由表:若目标IP不在本地子网,Nmap查询系统路由表,看目标是否指向直连的网关接口(而非公网网关),直连则为内网,否则为外网。
3. 特殊情况兜底:对 127.0.0.0/8 (本地回环)、 169.254.0.0/16 (链路本地)等私有/保留网段,直接判定为内网。

  • 只要判定为局域网目标,默认扫描就优先用 -PR (ARP扫描),因为ARP是二层协议,不经过IP路由,防火墙无法拦截,速度最快;
  • 判定为外网目标,则放弃ARP(二层协议跨网段无效),改用你说的TCP ACK+ICMP Ping+(非特权)TCP SYN的三层/四层探测组合。

简单验证方法

在命令行输入 nmap -v <目标IP> ,通过verbose日志能直接看到Nmap的判定结果:

  • 内网目标会显示 Initiating ARP Ping Scan ;
  • 外网目标会显示 Initiating Ping Scan (对应TCP/ICMP探测)。

判断方法:看Nmap初始化的首个探测类型(最直接,和IP段无关)

Nmap会根据内外网,自动触发不同的存活探测方式,扫描日志第一行的探测关键词是核心标识,这是比IP段更贴合扫描结果的判断依据:

外网目标:日志首行显示「 Initiating Ping Scan 」

  • 对应你第二个扫描(114.66.59.86):第一行就是 Initiating Ping Scan ,这是Nmap对外网的默认存活探测,只会对跨网段的公网目标触发;
  • 补充:外网Ping Scan实际是「TCP ACK+ICMP回声+(非特权)TCP SYN」的组合探测,日志里简化显示为Ping Scan。

内网目标:日志会显示「 Initiating ARP Ping Scan 」(核心特征)

  • 若你第一个内网扫描(192.168.48.1)未跳过ARP探测,日志首行会优先出现这个关键词,这是Nmap对内网直连目标的专属探测(二层ARP协议,外网无法使用);
  • 你第一个扫描未显示该日志,是因为Nmap快速完成SYN扫描并确认主机存活,跳过了显式的ARP Ping Scan日志,但这是内网扫描的「特殊情况」,而非常态。

辅助判断:看扫描延迟+探测顺序(内外网差异明显)

1. 内网:主机存活延迟极低(如你第一个扫描 0.00098s ),通常毫秒级甚至微秒级;外网延迟至少几十ms起步(公网路由转发有耗时);
2. 内网:若未跳过ARP探测,ARP Ping Scan会在DNS解析/端口扫描前执行;外网则是Ping Scan先执行,再走DNS解析+端口扫描(和你第二个扫描的顺序完全一致)。

总结:脱离IP段,纯看扫描结果的3步快速判断法

1. 找日志最开头的探测行:有 ARP Ping Scan =内网,有 Ping Scan =外网(核心);
2. 看主机存活延迟:≤0.01s(千分之一秒)=内网,≥0.01s且更高=外网(辅助);
3. 看探测与DNS的顺序:ARP探测在DNS前=内网,Ping探测在DNS前=外网(验证)。

针对两个扫描的纯结果判定(抛开IP)

  • 192.168.48.1(内网):延迟 0.00098s (内网典型低延迟),Nmap直接触发SYN扫描且无外网的 Ping Scan 前置探测,符合内网扫描特征;
  • 114.66.59.86(外网):日志首行明确 Initiating Ping Scan (外网专属探测),探测后才执行DNS解析+SYN扫描,完全匹配外网扫描逻辑。

理解这一点至关重要:这解释了为什么扫描本地网络飞快,而扫描外部IP有时会慢一些,并且有些主机明明在线却没被发现(因为防火墙拦住了默认的探测包)。


第二部分:主机发现选项详解与场景应用

我们按“策略类型”来重新组织这些选项,方便你理解。

A. 策略性选项(决定“敲不敲门”或“怎么敲门”)

  1. -sL (列表扫描) —— “只查看门牌号”
    • 本质零扫描。不向目标发送任何探测包,仅进行DNS反向解析,列出所有目标。
    • 用途
      • 目标清单核实:确保你要扫描的IP范围正确,避免误扫。
      • 信息搜集:通过DNS解析 (nmap -sL --dns-servers <DNS_IP> 目标),可能发现如 printer1.corp.comfw.dmz.com 等有价值的主机名。
    • 示例
      bash # 查看192.168.1.0/24网段所有主机名 nmap -sL 192.168.1.0/24 # 仅输出IP,不进行DNS解析(更快) nmap -sL -n 192.168.1.0/24
  2. -sn (原 -sP) (Ping扫描) —— “只敲门,不进去”
    • 本质仅主机发现。执行发现步骤,一旦确认主机存活就停止,不进行端口扫描
    • 重要细节
      • 它使用的是Nmap默认的或你指定的主机发现探针(如-PS-PA等),不仅仅是ICMP ping。
      • 在局域网上,特权用户默认会使用ARP (-PR)。
    • 用途
      • 网络清点:快速统计网络中有多少在线设备。
      • 存活监控:定期运行以监控关键服务器是否在线。
    • 示例
      bash # 快速找出192.168.1.0/24网段所有在线主机 nmap -sn 192.168.1.0/24 # 使用更激进的探针来穿透防火墙进行存活判断 nmap -sn -PS22,80,443 -PA21,25,3389 -PU53 203.0.113.0/24
  3. -Pn (原 -P0) (无Ping) —— “假设所有门后都有人,直接尝试开锁”
    • 本质跳过主机发现,将所有目标视为在线,直接进行后续的端口扫描、版本探测等。这是穿透严格防火墙的常用手段。
    • 警告:这会显著增加扫描时间,因为会对每一个指定的IP(即使是死的)进行全套扫描。
    • 用途
      • 目标主机配置为不响应任何Ping探测
      • 明确知道目标网络在线,但防火墙过滤了发现探针。
    • 示例
      bash # 假设目标防火墙丢弃ICMP和非常用端口的SYN/ACK,直接扫描其Web端口 nmap -Pn -p 80,443,8080,8443 10.0.0.0/24
nmap -sL -n 192.168.48.0/24
nmap -sn -PS22,80,443 -PA21,25,3389 -PU53 192.168.48.0/24
nmap -Pn -p 80,443,8080,8443 192.168.48.0/24

B. 主动探测选项(决定“用什么方式敲门”)

这些选项可以组合使用,以增加穿透能力。

  1. -PS <端口列表> (TCP SYN Ping) —— “轻轻拧一下门把手”
    • 向指定端口发送一个SYN包(试图建立连接)。
    • 如果端口关闭,目标回复 RST (表示“门锁着,别拧了”) -> 主机存活
    • 如果端口开放,目标回复 SYN/ACK (表示“门开了,请进”) -> 主机存活
    • Nmap会发送RST终止连接,避免建立完整连接。
    • 示例nmap -sn -PS80,443 192.168.1.100 (探测目标的80和443端口)
  2. -PA <端口列表> (TCP ACK Ping) —— “推一下看似虚掩的门”
    • 向指定端口发送一个ACK包(假装是已建立连接的一部分数据)。
    • 无论端口状态如何,一个未发起连接的主机都必须回复 RST -> 主机存活
    • 价值:用于穿透只过滤入站SYN包(新连接) 的简单无状态防火墙。ACK包看起来像是对内部主机向外发起连接的回应,可能被放行。
  3. 组合拳:-PS -PA
    • 最佳实践:同时使用SYN和ACK Ping,以应对不同类型的防火墙规则(无状态 vs 有状态)。
    • 示例nmap -sn -PS80 -PA80 目标
  4. -PU <端口列表> (UDP Ping) —— “往门里扔个小纸条”
    • 向指定端口发送一个空的UDP包
    • 如果端口关闭,目标回复 ICMP端口不可达 -> 主机存活
    • 如果端口开放,大部分服务会忽略空包,无回应 -> Nmap可能误判为关机。因此,应选择大概率关闭的高端口(如默认的31338)。
    • 用途:穿透只过滤TCP的防火墙/规则。
    • 示例nmap -sn -PU53,161 目标 (探测DNS和SNMP服务常用的UDP端口)
  5. ICMP Ping系列 (-PE, -PP, -PM)
    • -PE: 标准ICMP Echo请求(传统ping)。
    • -PP: ICMP时间戳请求。
    • -PM: ICMP地址掩码请求。
    • 用途:在内部网络中,管理员可能只允许特定的ICMP类型。-PP-PM可作为-PE的替代。
    • 示例nmap -sn -PE -PP 目标
  6. -PR (ARP Ping) —— “在楼道里喊名字”
    • 局域网专属,最快最可靠。
    • Nmap对同一网段的目标默认启用,除非你使用 --send-ip 强制使用IP层探测。

C. 辅助选项

  • -n (不解析域名): 扫描过程中不进行DNS反向解析,提升速度。
  • -R (总是解析域名): 对所有活动IP进行反向DNS解析(即使未扫描),获取更多信息。
  • --dns-servers <serv1[,serv2]>: 指定自定义DNS服务器进行解析,在内网渗透中非常有用。
  • --traceroute: 在扫描后进行路由追踪(不是发现选项,但常与发现结合使用)。

补充1:-sL 只列出网段,既不探测,也不判断,到底有什么用呢?

-sL (列表扫描)看似只列IP没实际探测,但却是渗透测试、网络管理中前期网段规划/信息梳理的高效工具,核心作用是无探测、无痕迹地完成网段IP枚举,解决”提前知道目标网段有哪些IP可测”,”避免扫描误触”等问题,且全程不发任何数据包,不会被防火墙/IDS检测到,这是它和常规扫描的差异。

那问题就是目标网段的IP,它既然是全部列出,不进行任何判断的话,那么一个学习过这个IP地址划分的,他都应该知道这个网站还有多少IP啊?那这样子有什么用呢?

手动懂IP划分≠实操中高效/精准/可复用, -sL 的价值从来不是“教你网段有多少IP”,,而是把“手动懂的理论”直接转化为“可直接用的实操结果”哪怕完全懂子网划分,手动操作在实操场景中依然有硬伤, -sL 是纯工具化的解决方案,举几个最常见的例子:

1.小网段手动算还行,大网段/非标准掩码,手动算直接歇菜

懂/24、/27这些常用掩码,但遇到/22、/19、/29这类非标准掩码,或者大网段(如10.0.0.0/16,65536个IP),手动算:

  • 要算网络地址、广播地址、可用IP范围,步骤多且易算错;
  • 就算算对了,也不可能把几千/几万个IP一个个列出来;
    而 -sL 不管是/29还是/16,直接列出全量IP,无任何计算误差,这是手动做不到的。

2.实操中需要“现成的IP列表”,而非“知道有多少IP”

学习时只需要“知道192.168.48.0/24有254个可用IP”,但工作/渗透中,需要的是“192.168.48.1、48.2……48.254”这个现成的列表:

  • 网管要批量ping网段内IP,需要把IP复制到脚本里;
  • 渗透测试要把IP导入masscan/Metasploit,需要纯IP格式的文本;
    手动敲这些IP,不仅慢,还容易漏/错,而 -sL 可以直接导出结构化的IP列表,无缝对接其他工具,这是“知道数量”完全替代不了的。

3.避免“理论正确,实操踩坑”的低级错误

比如理论上知道/24网段的网络地址是x.x.x.0,广播地址是x.x.x.255,这两个IP不可用,但手动整理列表时,很容易不小心把这两个IP加进去,导致后续扫描/批量操作出现无效请求;
而 -sL 会严格按子网掩码枚举,列出的IP范围精准无误,直接规避这种“知道但做不对”的实操坑。

4.多人协作/批量操作中,统一扫描范围,避免沟通成本

团队中有人懂IP划分,有人不懂,若手动说“扫192.168.48.0/24”,不懂的人可能会扫错范围;
而用 -sL 生成统一的IP列表,团队所有人直接用这个列表操作,无需再沟通“哪些IP要扫、哪些不要”,彻底消除认知差异带来的操作误差。


第三部分:核心使用指南与最佳实践

1. 如何选择主机发现策略?—— 决策流程图

目标在网络中? 
  ├─ 是(局域网)→ 默认使用 `-PR` (ARP) 最快。可加 `-sn` 仅发现。
  └─ 否(互联网/跨网段)→ 
        ├─ 常规探测 → 使用 `-sn -PS80,443 -PA80` (默认行为的强化版)
        ├─ 目标禁Ping → 使用 `-Pn` (跳过发现,直接端口扫描)
        └─ 防火墙严苛 → 使用组合探针:`-sn -PS<常用端口> -PA<常用端口> -PU<UDP端口>`

2. 综合实战示例

# 场景1:内部网络资产清点(快速、安静)
nmap -sn -PR 10.10.0.0/24 -oN inventory_scan.txt

# 场景2:外部Web服务器存活探测(穿透力强)
# 假设目标防火墙可能允许去往Web端口的ACK包和来自外部的DNS查询
nmap -sn -PS80,443 -PA80,443 -PU53 --dns-servers 8.8.8.8 203.0.113.50-100

# 场景3:对已知禁Ping的服务器进行全端口扫描
nmap -Pn -p- --min-rate=1000 -T4 10.0.0.100 -oA full_scan_no_ping

# 场景4:安全评估中的全面发现(组合拳)
nmap -sn -PE -PS21,22,23,25,80,110,139,443,445,3389 -PA80,443 -PU53,161,162 目标/24

Nmap主机发现

主机发现是网络侦察的首要阶段,其目标是将一个IP地址范围(如一个子网)缩减为实际在线的、可响应的主机列表。跳过此步骤直接进行全端口扫描,在效率上是不可行的。

一、 核心概念与技术基础

1.1 主机发现的基本原理

主机发现通过向目标发送特定的网络探测报文,并根据响应(或缺乏响应)来判断其存活状态。其本质是网络协议栈的交互测试,而非直接检测主机物理电源状态。

1.2 Nmap默认发现行为解析

当执行 nmap <target> 而未指定任何主机发现选项(如 -sn, -Pn)时,Nmap的行为逻辑如下:

  1. 目标网络位置判定
    • Nmap首先基于本地路由表与网络接口配置,判断目标IP地址相对于扫描主机的网络位置。
    • 局域网判定:若目标IP位于扫描主机任一网络接口的直连子网内,或经由直连网关可达的私有/保留网段(如 127.0.0.0/8, 169.254.0.0/16),则视为局域网目标。
    • 互联网判定:否则,视为互联网(外网)目标。
  2. 默认探测策略执行
    • 对局域网目标:默认采用 ARP发现 (-PR)。因为ARP是二层协议,不涉及IP路由,效率最高且通常无法被主机防火墙过滤。此行为在日志中体现为 Initiating ARP Ping Scan。若ARP探测快速成功,后续的IP层探测可能被跳过。
    • 对互联网目标:放弃ARP(无效),转而执行一套IP层探测组合,日志中显示为 Initiating Ping Scan。该组合包括:
      a. 一个 TCP ACK报文 发往目标的80端口 (-PA80)。
      b. 一个 ICMP Echo Request (Type 8) 报文 (-PE)。
      c. 若扫描进程 无特权(如非root用户),则追加一个通过 connect() 系统调用发起的 TCP SYN报文 到目标的80端口(等效于 -PS80,但以非特权方式)。

验证方法:使用 nmap -v <target> 命令,观察初始日志行即可明确Nmap执行的发现类型。主机存活延迟(通常显示为 latency)亦可作为辅助判断依据:局域网延迟通常在亚毫秒至毫秒级,而互联网延迟至少为数十毫秒。

二、 主机发现选项详解

主机发现选项可分为策略性、主动探测性和辅助性三类。

2.1 策略性选项

这些选项控制主机发现的整体执行方式。

  • -sL (列表扫描)
    • 功能:生成目标列表但不进行任何网络探测。仅对目标执行DNS反向解析(除非使用 -n 禁用)。
    • 技术细节:该选项严格依据输入的目标规范(如 192.168.1.0/24)枚举所有可能的IP地址,并(可选地)进行反向DNS查询。它不区分网络地址、广播地址或可用主机地址,纯粹进行列表生成与解析。
    • 用途
      1. 验证目标范围定义的准确性,避免因输入错误导致扫描非预期网络。
      2. 通过反向DNS记录提前获取主机名信息,辅助情报收集(如识别 mail.corp.com, dc1.internal)。
      3. 生成纯净的IP地址列表,供其他脚本或安全工具(如 masscan, hydra)作为输入源。
    • 示例
      bash # 枚举网段并尝试解析主机名 nmap -sL 192.168.48.0/24 # 仅枚举网段IP,不进行DNS解析(更快,无网络请求) nmap -sL -n 192.168.48.0/24
  • -sn (Ping扫描,曾用 -sP)
    • 功能:仅执行主机发现,发现主机存活后即停止,不进行后续的端口扫描、版本探测或操作系统识别。
    • 技术细节-sn 并非仅指ICMP Ping。它会执行其关联的、或用户通过 -PS, -PA, -PU, -PE 等选项指定的所有主机发现探针。在局域网上,默认包含ARP探测(-PR)。
    • 用途
      1. 快速网络资产清点与存活主机统计。
      2. 监控关键主机或网络段的在线状态。
    • 示例
      bash # 快速发现192.168.48.0/24网段内存活主机(特权用户在局域网默认用ARP) nmap -sn 192.168.48.0/24 # 对互联网目标使用自定义探针组合进行存活判断 nmap -sn -PS22,80,443 -PA80,443 -PU53 203.0.113.0/28
  • -Pn (无Ping扫描,曾用 -P0, -PO)
    • 功能:跳过主机发现阶段,假定所有指定目标均为在线状态,并直接对它们进行后续的端口扫描等操作。
    • 警告:此选项会显著增加扫描时间与网络流量,因为将对清单中的每一个IP(包括实际离线的)执行完整的后续扫描步骤。
    • 用途
      1. 扫描已知禁用或过滤所有主机发现探针(ICMP, TCP SYN/ACK to specific ports)的目标。
      2. 穿透配置严格的防火墙,这些防火墙通常允许对特定服务端口(如80, 443)的访问,但屏蔽发现性流量。
    • 示例
      bash # 假设目标网络过滤了ICMP和非常用端口的探测,直接扫描其Web服务端口 nmap -Pn -p 80,443,8080,8443 10.0.0.0/24

2.2 主动探测选项

这些选项定义用于探测主机存活的具体网络报文类型,可组合使用以提高穿透性。

  • -PS <port list> (TCP SYN Ping)
    • 原理:向目标指定端口发送一个设置了SYN标志位的TCP报文。
      • 若端口关闭,目标应返回一个RST报文。→ 主机存活
      • 若端口开放,目标应返回一个SYN/ACK报文。→ 主机存活
      • 若无响应,可能为过滤或主机离线。
    • 备注:Nmap在收到SYN/ACK后,会发送RST以终止连接尝试,避免建立完整连接。
    • 示例
      bash nmap -sn -PS80,443 192.168.1.100
  • -PA <port list> (TCP ACK Ping)
    • 原理:向目标指定端口发送一个设置了ACK标志位的TCP报文。
      • 对于未建立连接的主机,无论目标端口状态如何(开放或关闭),合规的TCP/IP协议栈都必须回复一个RST报文。→ 主机存活
    • 价值:用于尝试穿透仅过滤入站SYN报文(新连接请求)的简单无状态防火墙/ACL。ACK报文可能被误认为是已建立连接的数据包而被放行。
    • 最佳实践:常与 -PS 组合使用 (-PS80 -PA80),以应对有状态或无状态的过滤规则。
  • -PU <port list> (UDP Ping)
    • 原理:向目标指定端口发送一个空的UDP数据报。
      • 若端口关闭,目标可能(但不保证)返回一个ICMP端口不可达(Type 3, Code 3)错误。→ 主机存活
      • 若端口开放,服务通常忽略空报文,无响应。→ Nmap可能将其标记为 open|filtered 并视情况判断主机状态。
    • 关键点:应选择大概率关闭的高端口作为探测端口(默认是40125),或选择目标网络可能开放的UDP服务端口(如53-DNS, 161-SNMP)。
    • 用途:探测仅过滤TCP流量或特定UDP服务有响应的主机。
  • -PE/-PP/-PM (ICMP Ping Types)
    • -PE:发送 ICMP Echo Request (Type 8),即传统”ping”请求。期望收到ICMP Echo Reply (Type 0)。
    • -PP:发送 ICMP Timestamp Request (Type 13)。期望收到ICMP Timestamp Reply (Type 14)。部分主机可能响应此请求而忽略Echo Request。
    • -PM:发送 ICMP Address Mask Request (Type 17)。期望收到ICMP Address Mask Reply (Type 18)。现已较少使用。
    • 用途:在内部网络中,管理员可能选择性允许部分ICMP类型,可组合使用以增加发现概率。
  • -PR (ARP Ping)
    • 原理:在以太网等支持ARP的局域网中,直接发送ARP请求查询目标IP对应的MAC地址。若收到ARP回复,则主机存活。
    • 特性仅适用于本地网络。速度极快,且由于是二层协议,主机防火墙通常无法阻止(因处理在驱动层)。
    • 注意:Nmap对局域网目标默认启用此选项。使用 --send-ip 可强制禁用ARP,改用IP层探测。

2.3 辅助选项

  • -n:禁止在扫描过程中进行DNS反向解析。可提升扫描速度。
  • -R:始终对目标进行DNS反向解析(即使目标不存活)。用于信息收集,但会减慢速度。
  • --dns-servers <server1[,server2...]>:指定用于解析的自定义DNS服务器。在内网渗透中可用于指定内部DNS。

三、 策略选择与综合应用

3.1 决策逻辑

选择主机发现策略应基于目标网络环境和扫描目标。

3.2 综合实战示例

  1. 内部网络资产快速清点 # 安静、快速地列出所有在线设备 nmap -sn -PR 10.10.0.0/24 -oN network_inventory.txt
  2. 外部Web服务器集群存活探测 # 使用Web服务端口作为探针,并结合DNS查询 nmap -sn -PS80,443 -PA80,443 -PU53 --dns-servers 8.8.8.8 203.0.113.50-100
  3. 对严格过滤环境的目标进行全端口扫描 # 假设目标丢弃所有Ping和非常规端口探测,直接扫描全部TCP端口 nmap -Pn -p- --min-rate=1000 -T4 10.0.0.100 -oA full_scan_no_discovery
  4. 安全评估中的全面主机发现
    bash # 组合多种探针,最大化发现机会 nmap -sn -PE -PS21,22,23,25,80,110,139,443,445,3389 -PA80,443 -PU53,161,162 目标IP/24

通过理解上述原理并根据实际场景灵活组合选项,可以有效提升主机发现的准确性与效率,为后续深入的端口扫描与服务识别奠定可靠基础。


第4部分:专业扫描技术 —— 隐匿、欺骗与深度探测

在掌握了四大核心扫描技术后,你将从一个网络地图的“绘制者”升级为“洞察者”。Nmap的真正威力在于其丰富的扫描技术矩阵,它们能帮你规避防火墙、探测安全设备策略,甚至进行完全匿名的扫描。下表是这些高级技术的战略地图:

扫描技术命令选项核心战术目的工作原理比喻关键限制与战场标识
隐秘扫描-sN; -sF; -sX绕过简陋的包过滤设备,进行更安静的侦察。派遣“行为异常的信使”(不含SYN/RST/ACK的包)去敲门。守规矩的目标(如Linux)只对关闭的门回应;不守规矩的(如Windows)则会回应所有门。高度依赖目标操作系统。对Windows、Cisco设备通常无效,结果会显示所有端口 closed
防火墙探测扫描-sA绘制防火墙规则图,探测其是有状态还是无状态,哪些端口被“看守”。派一个“点头确认的信使”(ACK包)闯关。如果关卡(防火墙)不存在或不管,目标主机会直接拒绝(RST);如果关卡拦截,则信使石沉大海。无法判断端口开放与否,只能标记 unfiltered(包可达)或 filtered(包被拦)。
空闲扫描-sI <僵尸主机>实现完全匿名的端口扫描,嫁祸于一台无辜的“僵尸”主机。操控一个“机械计数”的第三方(僵尸机),通过观察其计数(IP ID)的变化,间接推测目标端口的开闭状态,整个过程你的真实IP从未出现。需要找到一台闲置、IP ID递增且可预测的“僵尸”主机,过程复杂但极其隐蔽。
IP协议扫描-sO探测目标主机支持哪些网络层协议(如ICMP, IGMP, GRE),发现潜在的隧道或协议漏洞。不检查房子的“门”(端口),而是检查它支持哪些“建筑材料”(IP协议)。需要root权限,报告的是协议号(如 protocol 47 是GRE)而非端口。

1. 隐秘扫描三剑客 (-sN, -sF, -sX):规则的漏洞

这三者原理一致,仅发送的TCP标志位不同,旨在利用RFC 793的一个理论漏洞:关闭的端口必须用RST响应任何不包含SYN、RST或ACK的报文,而开放的端口应忽略此类报文。

命令示例与输出解读:

sudo nmap -sF 192.168.48.1

典型输出:

Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-30 17:51 +0800
Nmap scan report for 192.168.48.1
Host is up (0.00s latency).
All 1000 scanned ports on 192.168.48.1 are in ignored states.
Not shown: 1000 closed tcp ports (reset)

Nmap done: 1 IP address (1 host up) scanned in 0.79 seconds

解读

  • 目标设备(192.168.48.1)大概率是局域网内的网络设备(如路由器、交换机)或关闭了所有常见端口的电脑 / 服务器; 端口全部关闭的原因可能是:
    • 设备本身是网络基础设施(如路由器),其管理端口(如 8080、22)可能未在 “1000 个常用端口” 中,或被管理员手动修改到非默认端口;
    • 设备开启了严格的防火墙规则,拒绝响应外部端口扫描,或主动关闭了所有不必要的 TCP 服务(出于安全考虑);
    • 设备是纯网络转发设备(如交换机),本身不提供上层网络服务(无开放端口是正常现象)。

通俗拆解
想象你用一种外星语言去喊门。地球上有的房子(Linux/Unix)约定:听懂就保持沉默(端口开放),听不懂就骂一句“滚开”(RST,端口关闭)。但有的房子(Windows)不管听不听得懂,只要你用外星语,它就骂“滚开”。于是,在后者眼里,你扫描的所有门都显示“关闭”,侦察失败。


2. ACK扫描 (-sA):绘制防火墙的“地形图”

这是探测防火墙规则的神器,而非用来找开放服务。

命令示例与输出解读:

sudo nmap -sA 192.168.48.1

输出:

解读1000 unfiltered tcp ports (reset)

  • unfiltered(未被过滤):目标设备的防火墙没有拦截Nmap 发送的 ACK 探测包(即防火墙对这些端口的 ACK 包 “放行”,不做拦截);
  • (reset):目标设备收到 ACK 探测包后,返回了「TCP 重置包」—— 这表明端口本身是关闭的(因为没有对应的活跃连接需要 “确认”,所以用 reset 包拒绝);
  • 简单说:这些端口 “没被防火墙拦着,但本身确实没开服务”。
  • in ignored states:Nmap 已确认所有端口的状态(未过滤 + 关闭),无需进一步探测,所以标记为 “忽略状态”(无需额外处理)。

通俗拆解
你派一个信使跑到每个城门前,只做一件事:对着城门点一下头(发送ACK)。如果城里卫兵直接把你赶出来(RST),说明城门通道是通的,卫兵在岗。如果点头后毫无反应,说明在护城河外就被哨塔(防火墙)射杀了,你连城门通不通都不知道。这个动作帮你摸清了哨塔的防御范围。


3. 空闲扫描 (-sI):完美的“幽灵”行动

这是Nmap中最隐蔽、构思最巧妙的扫描方式,实现了真正的匿名

工作原理简述

  1. 寻找“僵尸”:你需要一台闲置且IP ID序列为全局递增(每发一个包就+1)的主机。
  2. 间接探针:你先问“僵尸”:“你现在的IP ID是多少?”(记下ID)。然后,伪造一个源地址为“僵尸”的数据包发给目标端口。
  3. 观察变化:再次询问“僵尸”的IP ID。如果目标端口开放,目标主机会向“僵尸”回送响应包,“僵尸”的IP ID会因此增加2(一次你的询问,一次目标的回应);如果目标端口关闭,则只增加1。

命令示例:

sudo nmap -sI 192.168.48.1:80 144.66.59.86

解读

  • 192.168.48.1:80 是你控制的僵尸主机及其源端口。
  • 144.66.59.86是你要扫描的真实目标。
  • 最终,目标 144.66.59.86的防火墙日志只会显示扫描来自 192.168.48.1

通俗拆解
这就像你控制了一个每隔一秒就喊一次数字的机械木偶(僵尸机)。你想知道隔壁房间的门锁着没,就戴着木偶的面具(伪造IP)去推一下门。如果门开着,里面的人会追出来拍一下木偶的肩膀,木偶受惊后喊数字的节奏就会乱(IP ID跳变2次)。你只需躲在远处听木偶喊的数字,就能知道门的状态,而房间里的人只记住了木偶的脸。


技术选择决策流

面对复杂环境时,你可以遵循以下决策路径来选择扫描技术:


除了上述内容,对端口选择与扫描顺序的进一步说明如下:

端口说明和扫描顺序

1. 精确指定端口与混合协议 (-p)
此选项的核心在于灵活性,您可以根据测试目标精确控制扫描范围。

  • 基本示例:扫描目标最常见的 Web 和服务端口。
    bash nmap -p 80,443,22,21,25,110,143,3306,3389 target.com
  • 范围示例:扫描一个连续的端口段,常用于发现开发或测试服务器上的非标准服务。
    bash nmap -p 8000-8100 192.168.1.100
  • 混合协议示例这是原文提到但未举例的关键用法。同时扫描特定的 TCP 和 UDP 端口。 bash nmap -sS -sU -p U:53,67,161,T:21-25,80,135,139,445 192.168.1.1
    • -sS: TCP SYN 扫描
    • -sU: UDP 扫描
    • 该命令将扫描 UDP 的 DNS、DHCP、SNMP 端口以及 TCP 的文件共享、Web 和管理端口。

2. 快速扫描 (-F) 的实际意义
快速扫描的速度优势在大型网络扫描中极为明显。

  • 对比示例
    • 默认扫描(约1600个端口): bash nmap 10.0.0.0/24
      • 这将对 256 个 IP 地址的每个地址扫描约1600个端口,总尝试次数约为 409,600 次
    • 快速扫描(约1200个端口): bash nmap -F 10.0.0.0/24
      • 扫描每个 IP 的约1200个端口,总尝试次数约为 307,200 次。减少了约25%的探测包。
    • 极端自定义示例:假设您仅关心内部网络的 Web(80,443,8080)、SSH(22)和数据库(3306,5432)服务。
      1. 创建一个文件 my-services,内容如下:
        80/tcp http 443/tcp https 8080/tcp http-proxy 22/tcp ssh 3306/tcp mysql 5432/tcp postgresql
      2. 运行命令:
        bash nmap -F --datadir . 10.0.0.0/24
      • 此时,Nmap 将只扫描这 6 个端口,扫描速度极快,总尝试次数仅为 1,536 次,非常适合日常的资产存活检查和快速审计。

3. 顺序扫描 (-r) 的调试场景

  • 防火墙规则测试示例:假设您怀疑防火墙对 1000-2000 端口有特殊的速率限制规则。 bash nmap -p 1000-2000 -r --max-parallelism 1 --scan-delay 1s firewall.example.com
    • -r: 按顺序(1,2,3…)扫描,使触发行为可预测。
    • --max-parallelism 1: 一次只扫描一个端口。
    • --scan-delay 1s: 每个探测包间隔1秒。
    • 这种“慢速顺序扫描”可以帮助您精确观察在扫描到哪个特定端口时,防火墙开始丢弃数据包或触发警报。

服务和版本探测(命令示例补充)

1. 基本版本探测与强度控制

  • 标准版本扫描bash nmap -sV 192.168.48.1
    • 输出示例:
      • Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-30 19:52 +0800
      • Nmap scan report for 192.168.48.1
      • Host is up (0.000012s latency).
      • Not shown: 995 closed tcp ports (reset)
      • PORT STATE SERVICE VERSION
      • 139/tcp open netbios-ssn Microsoft Windows netbios-ssn
      • 445/tcp open microsoft-ds?
      • 902/tcp open ssl/vmware-auth VMware Authentication Daemon 1.10 (Uses VNC, SOAP)
      • 912/tcp open vmware-auth VMware Authentication Daemon 1.0 (Uses VNC, SOAP)
      • 2179/tcp open vmrdp?
      • Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
  • 轻量级模式 (--version-light):适合快速了解主要服务。 bash nmap -sV --version-light 192.168.48.1
    • 它可能只识别出 SSH 和 HTTP,而不会尝试去识别一个运行在 8080 端口的、不那么常见的 Java 应用服务器。
      • D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap -sV –version-light 192.168.48.1
      • Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-30 20:04 +0800
      • Nmap scan report for 192.168.48.1
      • Host is up (0.00015s latency).
      • Not shown: 995 closed tcp ports (reset)
      • PORT STATE SERVICE VERSION
      • 139/tcp open netbios-ssn Microsoft Windows netbios-ssn
      • 445/tcp open microsoft-ds?
      • 902/tcp open ssl/vmware-auth VMware Authentication Daemon 1.10 (Uses VNC, SOAP)
      • 912/tcp open vmware-auth VMware Authentication Daemon 1.0 (Uses VNC, SOAP)
      • 2179/tcp open vmrdp?
      • Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
      • Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
      • Nmap done: 1 IP address (1 host up) scanned in 16.93 seconds
  • 全面模式 (--version-all):当您怀疑目标运行着老旧或非标准服务时使用。 bash nmap -sV --version-all 192.168.48.1
    • 这会尝试所有探测,可能会识别出一个旧型号路由器在 80 端口运行的、定制版本的 Boa Web 服务器。

2. 处理特殊情况:加密服务与打印机

  • 识别 HTTPS 背后的服务bash nmap -sV -p 443 192.168.48.1
    • 如果 Nmap 支持 SSL,输出会是 ssl/http Apache httpd 2.4.41ssl/https-node.js Express 等,明确揭示了加密层后的具体软件。
      • D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap -sV –version-all 192.168.48.1
      • Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-30 20:29 +0800
      • Stats: 0:00:07 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
      • Service scan Timing: About 40.00% done; ETC: 20:29 (0:00:09 remaining)
      • Nmap scan report for 192.168.48.1
      • Host is up (0.00044s latency).
      • Not shown: 995 closed tcp ports (reset)
      • PORT STATE SERVICE VERSION
      • 139/tcp open netbios-ssn Microsoft Windows netbios-ssn
      • 445/tcp open microsoft-ds?
      • 902/tcp open ssl/vmware-auth VMware Authentication Daemon 1.10 (Uses VNC, SOAP)
      • 912/tcp open vmware-auth VMware Authentication Daemon 1.0 (Uses VNC, SOAP)
      • 2179/tcp open vmrdp?
      • Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
      • Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
      • Nmap done: 1 IP address (1 host up) scanned in 67.34 seconds
  • 强制扫描所有端口(包括打印机端口)bash # 警告:这可能会让网络打印机打印出乱码! nmap -sV –allports 192.168.48.1
    • D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap -sV –allports 192.168.48.1
    • Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-30 20:38 +0800
    • Nmap scan report for 192.168.48.1
    • Host is up (0.00018s latency).
    • Not shown: 995 closed tcp ports (reset)
    • PORT STATE SERVICE VERSION
    • 139/tcp open netbios-ssn Microsoft Windows netbios-ssn
    • 445/tcp open microsoft-ds?
    • 902/tcp open ssl/vmware-auth VMware Authentication Daemon 1.10 (Uses VNC, SOAP)
    • 912/tcp open vmware-auth VMware Authentication Daemon 1.0 (Uses VNC, SOAP)
    • 2179/tcp open vmrdp?
    • Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
    • Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
    • Nmap done: 1 IP address (1 host up) scanned in 22.16 seconds
    • 更安全的做法是编辑 nmap-service-probes 文件,在 Exclude 部分精确添加您网络中打印机的 IP 或端口,而不是使用 --allports

3. RPC 扫描 (-sR) 的独立使用

  • 当您已经通过其他方式(如 -sS)知道了开放端口,只想快速验证其中是否有 RPC 服务时: bash nmap -sR -p 111,2049,32771 192.168.1.102
    • 输出会直接显示类似 111/tcp open rpcbind 2-4 (RPC #100000) 的信息,而不会进行 HTTP、SSH 等无关的探测。

操作系统探测–详解与示例

Nmap的操作系统探测是其最强大的功能之一,它依赖于对TCP/IP协议栈实现中细微差别的深度分析。这些“指纹”差异如同人类的指纹,不同厂商、版本甚至设备类型的系统都有其独特之处。以下将通过示例,深入阐述其使用方法和高级场景。

1. 基础操作系统探测 (-O) 及其前置条件
操作系统探测的有效性高度依赖于从目标获取足够多的响应信息。最关键的一点是,Nmap需要至少一个开放端口和一个关闭端口来完成可靠的检测。这是因为许多测试(如TCP序列号生成、窗口大小等)需要对比目标主机对不同状态端口的反应。

  • 基础示例nmap -O 192.168.48.1
    • 输出分析
      • D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap -O 192.168.48.1
      • Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-30 20:45 +0800
      • Nmap scan report for 192.168.48.1
      • Host is up (0.00s latency).
      • Not shown: 995 closed tcp ports (reset)
      • PORT STATE SERVICE
      • 139/tcp open netbios-ssn
      • 445/tcp open microsoft-ds
      • 902/tcp open iss-realsecure
      • 912/tcp open apex-mesh
      • 2179/tcp open vmrdp
      • Device type: general purpose
      • Running: Microsoft Windows 10
      • OS CPE: cpe:/o:microsoft:windows_10
      • OS details: Microsoft Windows 10 1511 – 1607
      • Network Distance: 0 hops
    • 解读Device type: general purpose:目标是通用用途设备(普通 PC / 服务器),不是打印机、路由器、工控机、摄像头等专用设备; Running: Microsoft Windows 10核心结论—— 目标主机运行的操作系统是Windows 10OS CPE: cpe:/o:microsoft:windows_10:标准化的CPE 标识(通用平台枚举),精准指向微软 Windows 10 系统,方便自动化工具 / 脚本识别; OS details: Microsoft Windows 10 1511 - 1607:更细致的版本范围 ——Windows 10 的15111607 版本,Nmap 通过指纹匹配推断出的具体版本区间; Network Distance: 0 hop网络跳数为 0,说明你的扫描主机和目标 192.168.48.1 在同一物理局域网 / 同一网段,没有经过路由器、交换机等设备转发,这也是延迟几乎为 0 的根本原因。
      如果目标主机所有端口都被防火墙过滤(全闭或全开),-O 扫描可能失败。

2. 高效扫描:限制检测目标 (--osscan-limit)
在对大型网络(如 /24 网段)进行扫描时,盲目对所有IP进行完整的OS检测非常耗时。--osscan-limit 选项能智能地节省时间。

  • 场景示例:快速找出一个网段中所有在线主机及其操作系统。 bash nmap -sn 10.0.0.0/24 -oG hosts-up.txt grep Up hosts-up.txt | awk '{print $2}' > targets.txt nmap -O --osscan-limit -iL targets.txt
    • 命令分解
      1. nmap -sn: 进行Ping扫描,仅发现存活主机,结果存为hosts-up.txt
      2. grepawk: 提取存活主机的IP地址到 targets.txt
      3. nmap -O --osscan-limit -iL targets.txt: 仅对 targets.txt 列表中的主机进行操作系统检测,并且只对那些满足“有开有关端口”条件的主机执行完整的OS指纹检测。这避免了在无法检测的主机上浪费时间。

3. 推测与模糊匹配 (--osscan-guess, --fuzzy)
当 Nmap 无法找到完全匹配的指纹时,它会尝试寻找最接近的匹配。--osscan-guess--fuzzy 选项会提高其报告这些推测结果的阈值,让你看到更多可能性。

  • 示例:扫描一个不常见的嵌入式设备或定制系统。 bash
    • 可能输出
      Aggressive OS guesses: ASUS RT-AC52U wireless router (96%), Linux 3.1 (95%), Linux 3.2 (94%), Linux 3.4 (94%), BlueArc Titan 2100 NAS device (93%)
    • 解读:Nmap 列出了多个高置信度的可能系统。排名第一的是华硕无线路由器,这与“嵌入式设备”的场景高度吻合。这个功能在识别 IoT 设备、工业控制系统等非标准系统时极为有用。

4. 高级信息:运行时间与序列号预测
操作系统探测过程会顺带分析其他安全相关信息。

  • 查看详细输出bash nmap -O -v 192.168.1.1
    • 在详细输出中,你可能会看到
      TCP Sequence Prediction: Difficulty=258 (Good luck!) IP ID Sequence Generation: All zeros Uptime guess: 12.990 days (since Wed Jan 17 08:23:15 2024)
    • 信息解读
      • TCP序列号预测难度Difficulty=258 意味着预测下一个TCP序列号非常困难(“祝你好运!”),这表明系统不易受到基于TCP序列号预测的欺骗攻击(如旧式IP欺骗)。如果显示 Difficulty=0,则风险极高。
      • IP ID 生成方式All zeros 表示该主机发出的IP包中,ID字段总是0。这是某些系统(如旧的Linux内核配置)的特性,可能用于信息收集。
      • 运行时间猜测:通过TCP时间戳选项估算。12.990天 表示主机已连续运行近13天,这对于评估系统补丁更新(更新通常需要重启)和稳定性有参考价值。

5. 综合扫描示例 (-A)
-A 选项集成了操作系统检测、版本检测、脚本扫描和跟踪路由,是“全力进攻”的信息收集模式。

  • 示例bash nmap -A 192.168.48.1
    • 输出将包含
      1. 开放的端口及状态。
      2. 服务的具体版本(如 OpenSSH 8.4p1)。
      3. 操作系统的详细类型(如 Linux 5.4)。
      4. 可能运行默认脚本 (-sC) 发现的额外信息。
    • 注意-A 扫描会产生大量流量和日志,在隐秘性要求高的环境中应慎用。
D:\Program\Professional\01_Offensive_Security\01_Reconnaissance\Nmap>nmap -A 192.168.48.1
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-30 21:21 +0800
Nmap scan report for 192.168.48.1
Host is up (0.00052s latency).
Not shown: 995 closed tcp ports (reset)
PORT     STATE SERVICE         VERSION
139/tcp  open  netbios-ssn     Microsoft Windows netbios-ssn
445/tcp  open  microsoft-ds?
902/tcp  open  ssl/vmware-auth VMware Authentication Daemon 1.10 (Uses VNC, SOAP)
912/tcp  open  vmware-auth     VMware Authentication Daemon 1.0 (Uses VNC, SOAP)
2179/tcp open  vmrdp?
Device type: general purpose
Running: Microsoft Windows 10
OS CPE: cpe:/o:microsoft:windows_10
OS details: Microsoft Windows 10 1511 - 1607
Network Distance: 0 hops
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode:
|   3.1.1:
|_    Message signing enabled and required
|_clock-skew: -1s
| smb2-time:
|   date: 2026-01-30T13:21:55
|_  start_date: N/A

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 39.51 seconds

时间优化与性能调详:场景与示例

理解参数只是第一步,知道在什么情况下使用它们才是关键。以下通过几个典型场景来说明。

场景一:闪电扫描——对本地/数据中心高速网络进行资产清点
假设需要快速扫描 192.168.1.0/24 这个局域网段,找出所有在线主机及其开放的常用端口。

nmap -T4 -F 192.168.48.0/24
  • -T4 (Aggressive): 使用激进模板,这是核心。它自动设定了更短的超时(--max-rtt-timeout 1250ms)和更高的并行度,非常适合低延迟、高带宽的可靠网络。
  • -F (Fast scan): 快速模式,只扫描约100个最常见端口,而非默认的1000个端口。这能极大减少总探测包数。
  • 效果:这是速度与信息量之间最佳的平衡命令之一,能在几秒内完成一个C类网段的基础扫描。

更进一步,如果只关心主机是否在线(发现阶段):

nmap -T5 -sn -n 192.168.1.0/24
  • -T5 (Insane): 为了追求极致的发现速度,在网络极佳的情况下可以尝试。但需注意,-T5设置的超时极短(--max-rtt-timeout 300ms),在跨网段或稍有延迟的网络中会造成大量误判(将在线主机判为离线)。
  • -sn (No port scan): 仅进行主机发现(Ping扫描),不扫描端口。
  • -n (No DNS resolution): 不进行DNS反向解析,节省时间。
  • 建议:对于主机发现,更稳妥且依然极快的组合是 nmap -T4 -sn --min-parallelism 100 192.168.1.0/24。通过手动将 --min-parallelism 设高,强制Nmap同时发送大量探测包,充分利用本地网络的性能。

场景二:沉稳渗透——扫描受防火墙保护或高延迟的互联网主机
目标是一个跨互联网的企业服务器,可能存在包过滤、速率限制或较高的网络延迟。

nmap -T2 --max-rtt-timeout 1500ms --script-args http.useragent="Mozilla/5.0" example.com
  • -T2 (Polite): 降低发送速率,减少被目标防火墙或IDS标记为“扫描攻击”的风险。
  • --max-rtt-timeout 1500ms: 手动放宽超时上限,给跨网段、高延迟的响应留出足够时间。这是避免漏报的关键。
  • --script-args http.useragent="...": 这是一个较少提及但至关重要的技巧。在使用NSE脚本(如http-title)时,使用常见的浏览器User-Agent可以避免被WAF(Web应用防火墙)轻易拦截。

如果需要穿透严格的防火墙进行端口探测:

nmap -T3 -sS -Pn --scan-delay 500ms --max-parallelism 1 --max-retries 2 xxx.xxx.com
  • -Pn (Treat all hosts as online): 跳过主机发现阶段。因为防火墙可能屏蔽ICMP,导致Ping不通但主机实际在线。
  • -sS (Stealth SYN scan): TCP SYN扫描,比全连接扫描(-sT)更隐蔽。
  • --scan-delay 500ms--max-parallelism 1: 组合使用,强制扫描在每发送一个探测包后等待半秒,且不同时发送其他包。这能将扫描流量降到极低,模拟慢速的正常连接尝试,有效规避基于流量的阈值检测。
  • --max-retries 2: 减少重试次数,默认是10次。在明确网络被严格过滤时,过多的重试是徒劳的。

场景三:大规模调查——扫描整个IP段(如10.0.0.0/16,含65536个IP)
这是对Nmap性能和策略的真正考验。

nmap -T4 -sS -Pn -n --min-hostgroup 256 --max-retries 1 --min-parallelism 50 -oA mass_scan_10.0.0.0 10.0.0.0/16
  • -Pn -n: 同样,跳过Ping和DNS解析,专注于端口扫描。
  • --min-hostgroup 256: 这是大规模扫描的灵魂参数。强制Nmap一次性将至少256个IP作为一个组进行并行扫描。这极大地减少了管理开销,提升了整体吞吐量。对于/16网络,这个命令会创建约256个并行扫描任务,效率远高于默认的小组开始。
  • --max-retries 1: 面对数万个IP,总有部分不响应。将重试次数减至1,可以大幅节省在“死”IP上的等待时间。
  • -oA <basename>: 将结果以三种格式(标准、Grepable、XML)同时输出,便于后续分析。这是生产环境扫描的必备操作

场景四:精准评估与躲避——针对特定IDS/IPS的慢速扫描
模拟一个高级持续性威胁(APT)风格的、极难被检测的扫描。

nmap -T1 -sS -Pn --scan-delay 5-10s --max-scan-delay 10s --max-retries 3 --randomize-hosts xxx.xxx.com/24
  • -T1 (Sneaky): 本身就增加了延迟。
  • --scan-delay 5-10s: 使用随机延迟(5到10秒之间),这比固定延迟更难被规则匹配。
  • --max-scan-delay 10s: 确保随机延迟不会超过此值。
  • --randomize-hosts: 另一个关键技巧。随机打乱扫描目标的顺序。如果不这样做,按顺序扫描一个网段的行为模式本身就会触发警报。
  • 注意:这个扫描会非常、非常慢。扫描一个C段(254个IP)的少量端口可能需要数小时。它只在特定渗透测试阶段有使用价值。

总结

  1. 模板优先,微调在后:总是先指定时间模板(如 -T3 或 -T4),再添加其他微调选项。因为模板会覆盖它之前的手动参数。
  2. 局域网用 -T4,互联网用 -T3 或手动调整-T4是可靠高速网络的通用选择。跨互联网扫描时,默认的-T3或手动调整超时(--max-rtt-timeout)和延迟(--scan-delay)更为稳妥。
  3. 大规模扫描,组大小是关键:使用 --min-hostgroup(如256或512)来提升管理效率。
  4. 想隐蔽,必随机:结合 --scan-delay(带范围值)和 --randomize-hosts 是规避基于阈值检测的主要手段。
  5. 善用输出和状态:使用 -oA 保存结果。在扫描运行时,按 回车键 或 d/D 键,Nmap会动态显示详细的进度和统计信息(已完成比例、预计剩余时间),这是一个非常实用的内置功能。

防火墙/IDS躲避和哄骗

核心思想在于增加扫描行为的“噪音”伪装扫描源利用目标网络的安全配置弱点,从而降低被精准识别和屏蔽的概率。下面通过具体示例来阐明这些技术的应用。

1. -f (报文分段); --mtu (使用指定的MTU)
此技术旨在将一个完整的TCP头部拆分成多个更小的IP分片,从而可能绕过那些没有正确实现分片重组检测逻辑的简单包过滤器和老式IDS。
命令示例

   # 使用默认的8字节偏移进行分片扫描
   nmap -f <目标IP>

   # 使用自定义的MTU值(必须是8的倍数),这里16字节一分片
   nmap --mtu 16 <目标IP>

补充解释与注意:现代下一代防火墙(NGFW)和IDS通常具备强大的流重组与深度包检测(DPI)能力,简单的分片扫描已很难奏效。它更主要的作用是用于测试目标网络设备在处理异常分片包时的行为(是否崩溃或出错),这属于“模糊测试”范畴。如您所述,务必在授权环境下测试,因为部分老旧系统可能因处理异常分片而宕机。

2. -D <decoy1 [,decoy2][,ME],...> (使用诱饵隐蔽扫描)
此选项通过在扫描流量中混入大量虚假源IP(诱饵),使防御方难以辨别真实的攻击源。如果在第6个位置或 更后的位置使用ME选项,一些常用 端口扫描检测器(如Solar Designer’s excellent scanlogd)就不会报告 这个真实IP。如果不使用ME选项,Nmap 将真实IP放在一个随机的位置
命令示例

   # 使用3个诱饵IP,并将真实扫描IP(ME)随机插入列表中(例如排在第二位)
   nmap -D RND:3 <目标IP>

   # 精确指定诱饵IP,并将真实IP(ME)固定在列表第四位。诱饵IP应尽量选择活跃的主机。
   nmap -D 192.168.1.99,10.0.0.1,172.16.31.254,ME,203.0.113.5 <目标IP>

补充解释与注意:诱饵扫描会显著增加网络流量,因为每个探测包都会以每个诱饵IP的名义发送一次。如果诱饵主机不在线,目标回复的SYN-ACK或RST包将得不到响应,这可能无意中对诱饵IP造成一次轻微的“SYN洪水”反射。因此,选择公司外部已知的、稳定的Web服务器或网关作为诱饵比选择随机内网地址更“礼貌”且有效。RND 是一个Nmap内置的快捷方式,用于生成随机、未分配的互联网IP作为诱饵。

3. 源地址欺骗 (-S) 与接口绑定 (-e)
这两个选项通常结合使用,用于完全伪造扫描报文的源IP,并指定从哪个网络接口发出。
命令示例

   # 假设攻击者拥有IP 10.0.0.5,但想伪装成来自 192.168.100.100 的扫描
   # 同时,指定从本机的 eth0 接口发送这些欺骗包
   nmap -S 192.168.100.100 -e eth0 -Pn <目标IP>

补充解释与注意:纯粹的欺骗扫描(-S无法建立完整的TCP连接或接收任何回复信息,因为回复包会发送到被欺骗的IP地址(192.168.100.100),而非扫描者。因此,它通常与不需要建立完整连接的扫描类型(如 -sN NULL扫描、-sF FIN扫描)或仅需要发送探测包(-Pn 跳过主机发现)结合使用,用于探测目标主机的“静默丢弃”或“响应”行为,这是一种盲扫描技术。-e 选项在主机有多个网卡(如同时连接有线、无线和VPN)时至关重要,它能确保扫描流量从正确的路径发出。

4. --source-port <portnumber>; -g <portnumber> (源端口哄骗)
注意到DNS响应来自于53端口,FTP连接 来自于20端口,很多管理员会掉入一个陷阱,即允许来自于这些端口的数据进入 网络。他们认为这些端口里不会有值得注意的攻击和漏洞利用Windows 2000和Windows XP中包含的IPsec过滤 器也包含了一些隐含规则,允许所有来自88端口(Kerberos)的TCP和UDP数据流。另 一个常见的例子是Zone Alarm个人防火墙到2.1.25版本仍然允许源端口53(DNS)或 67(DHCP)的UDP包进入。此技术利用了管理员为特定服务(如DNS、FTP-DATA)错误地开放宽松。防火墙规则这一常见配置失误。
命令示例

   # 假设目标防火墙信任来自53端口(DNS)的UDP流量,可用于探测其后的UDP服务
   nmap -sU -g 53 --data-length 32 <目标IP>

   # 假设目标信任来自20端口(FTP数据端口)的TCP连接,可用于进行SYN扫描
   nmap -sS -g 20 <目标IP>

补充解释:这里的核心是信任转移。Nmap本身并不发送真正的DNS或FTP流量,它只是将扫描探针的源端口号设置为这些受信任的端口。如果防火墙规则是基于“源端口等于53则放行”这种不安全的假设,那么Nmap的扫描包就能顺利通过。--data-length 选项在这里与 -g 结合使用,可以使伪造的DNS查询(UDP 53端口)看起来更“像”一些,因为真实的DNS查询包也有一定长度。

5. --data-length <number> (发送报文时 附加随机数据)
此选项通过改变扫描包的“形状”,使其更接近某些正常应用数据流,从而规避基于固定包长特征的IDS规则。
命令示例

   # 在TCP SYN扫描的每个探针包后附加100字节的随机数据
   nmap -sS --data-length 100 <目标IP>

补充解释:一些简单的入侵检测系统可能有一条规则:“如果一个IP在短时间内发送了大量仅有TCP头部(40字节)的SYN包,则视为端口扫描”。通过附加随机数据,包的长度变成了140字节,可能就不再匹配那条规则。这增加了扫描流量与正常HTTP请求(携带User-Agent等头部)等业务的相似性。

6. --ttl <value> (设置IP time-to-live域)
修改IP包的生存时间,可以用于模仿来自不同网络距离的主机,或测试网络路径。
命令示例

   # 将扫描包的TTL设置为1,这些包在离开第一跳路由器后就会被丢弃。
   # 这可用于探测本地网关,或者使远程IDS看到的TTL值异常。
   nmap --ttl 1 <目标IP>

补充解释:TTL值每经过一个路由器减1。通过设置一个较小的TTL,可以让扫描包在到达目标前就过期,这在某些特定测试中有用。反之,设置一个较大的、不常见的TTL值(如200),有时也能作为一个微小的混淆因素,因为操作系统的默认初始TTL通常是64、128或255。

7. 随机化主机顺序 (--randomize-hosts)
避免按IP地址顺序(如 192.168.1.1, 192.168.1.2, 192.168.1.3…)进行扫描,这种模式极易被识别为自动化扫描。
命令示例

   # 对一个C类子网(254个主机)进行随机顺序的ping扫描和SYN扫描
   nmap -sn  --randomize-hosts 192.168.1.0/24

补充解释:这是一个非常实用且低成本的规避技巧。它将线性的、可预测的扫描模式,变成了一个看似随机的、对多个主机的“点状”访问模式,更类似于正常用户或服务器的行为,可以有效绕过那些基于“对连续IP地址进行快速端口探测”这一模式的简单检测算法。

8. MAC地址欺骗 (--spoof-mac)
在局域网(二层)层面伪装身份,主要用于绕过基于MAC地址的访问控制列表(ACL)或避免在交换机的CAM表日志中留下真实MAC记录。
命令示例

   # 伪装成一台Cisco设备的MAC地址(前缀为00:40:96)
   nmap --spoof-mac Cisco <目标IP>

   # 使用一个完全随机的MAC地址
   nmap --spoof-mac 0 <目标IP>

   # 使用指定的MAC地址
   nmap --spoof-mac 00:1A:2B:3C:4D:5E <目标IP>

补充解释:此选项仅在同网段扫描时有意义。它迫使Nmap在链路层构造以太网帧,这隐含了 --send-eth 选项。如果目标网络使用了“IP+MAC绑定”或基于MAC的端口安全策略,欺骗一个已授权设备的MAC地址可能允许扫描通过。但请注意,这可能导致短暂的地址冲突,且在同一广播域内,两个相同MAC地址的设备通信会出问题,因此需谨慎使用。

综合实战示例

一个谨慎的攻击者或渗透测试员可能会组合使用多种技术,发起一次隐蔽性较强的扫描:

# 组合使用:诱饵扫描、源端口欺骗、报文分段、随机化主机、附加随机数据
nmap -sS -D 8.8.8.8,1.1.1.1,ME -g 53 -f --randomize-hosts --data-length 64 --max-rate 50 -oN stealth_scan.log <目标网段>

这条命令的意图是

  • -sS: 使用半开SYN扫描。
  • -D ...: 混入两个知名公共DNS服务器作为诱饵,真实IP随机插入。
  • -g 53: 所有SYN包伪装成来自DNS查询的回复流量(源端口53)。
  • -f: 对报文进行分段,增加分析难度。
  • --randomize-hosts: 不打草惊蛇,不按顺序扫描。
  • --data-length 64: 让每个包看起来都像携带了一点数据。
  • --max-rate 50: 严格控制发包速率,避免触发基于流量的阈值警报。
  • -oN ...: 将结果保存到文件。
stealth_scan.log

输出功能的补充与示例

Nmap的输出选项不仅仅是保存扫描结果的简单功能,它们构成了专业渗透测试和网络审计中文档化、可追溯、可分析工作流程的核心。合理使用这些选项可以极大提高工作效率。

1. 输出格式

-oN <filespec> (标准输出)
这是最常用的可读格式,适合直接查看和快速分析。

# 保存详细扫描结果到文件,同时屏幕上仍会显示
nmap -sS -p 1-1000 -oN basic_scan.txt 192.168.48.1

# 只保存结果到文件,不显示在屏幕上(重定向标准输出)
nmap -sS -p 1-1000 -oN silent_scan.txt 192.168.1.1 > /dev/null

补充技巧:标准输出文件非常适合用grep快速查找信息。例如,查找所有开放了SSH服务的主机:

grep -E "22/open.*ssh" scan_results.nmap

2.-oX <filespec> (XML输出)
这是最强大的结构化格式,适合自动化处理和生成报告。

# 生成XML格式的输出
nmap -sV -O -oX detailed_scan.xml 192.168.1.0/24

# 使用XSLT样式表转换为HTML报告
xsltproc -o report.html /usr/share/nmap/nmap.xsl detailed_scan.xml

# 如果nmap.xsl不在默认路径,可以这样指定
nmap -sV -oX scan.xml --stylesheet https://nmap.org/data/nmap.xsl target

补充解释:XML格式包含了最完整的信息,包括服务版本、操作系统指纹、脚本输出等所有细节。很多安全工具(如Metasploit、OpenVAS)都可以直接导入Nmap的XML格式进行后续处理。几乎所有主流编程语言(C/C++、Python、Java、Perl)都有免费的 “XML 解析器”(现成的工具库),能轻松读取、提取、分析 XML 里的信息。比如你想写个 Python 脚本,自动从扫描结果里挑出所有开放的 80/443 端口,解析 XML 比解析杂乱的纯文本容易得多;还可以使用Python的xml.etree.ElementTree库编写自定义解析脚本:

import xml.etree.ElementTree as ET
tree = ET.parse('scan.xml')
root = tree.getroot()
for host in root.findall('host'):
    ip = host.find('address[@addrtype="ipv4"]').get('addr')
    print(f"Host: {ip}")

Grepable输出 (-oG)
虽然官方已不建议使用,但在某些快速分析场景中仍有其价值。

# 生成grepable格式
nmap -F -oG quick_scan.gnmap 192.168.1.0/24

# 快速提取所有开放80端口的主机
grep "80/open" quick_scan.gnmap | cut -d' ' -f2

# 提取运行特定服务的主机
grep -i "http" quick_scan.gnmap | awk '{print $2}'

重要说明:这种格式在处理复杂扫描结果(如多个端口、多个主机)时容易出错,且不支持Nmap的所有功能(如NSE脚本输出)。对于重要项目,强烈建议使用XML格式

所有格式 (-oA)
这是最方便的一键输出选项,特别适合需要多种格式的场景。

# 一次性生成三种格式的文件:scan_base.nmap, scan_base.xml, scan_base.gnmap
nmap -sS -sV -oA scan_base 192.168.1.0/24

# 指定输出目录
mkdir -p scans/2023-10-01
nmap -sS -oA scans/2023-10-01/internal_scan 192.168.1.0/24

最佳实践:在渗透测试中,始终使用-oA保存所有格式的结果,这样既有人类可读的版本,也有机器可处理的版本。

2. 输出控制选项详解

详细输出 (-v / -vv)
控制输出详细程度,对于监控扫描进度和了解Nmap内部工作非常有帮助。

# 一级详细:显示发现的开放端口和估计完成时间
nmap -v 192.168.48.1

# 二级详细:显示更多细节,包括发送的每个数据包类型
nmap -vv -p 80 192.168.1.0/24

# 结合详细输出和文件保存
nmap -v -v -oN verbose_scan.txt 192.168.1.0/24
nmap -v 192.168.48.1
nmap -vv -p 80 192.168.1.0/24

实际应用:在长时间扫描中,使用-v可以实时了解进度;在调试扫描问题时,-vv可以提供更多线索。

调试输出 (-d / -d9)
提供Nmap内部工作的详细信息,主要用于故障排除。

# 中级调试(级别3)
nmap -d3 192.168.1.1

# 最高级别调试(会生成大量输出)
nmap -d9 -p 22 192.168.1.1 2>&1 | head -100

# 将调试输出保存到文件以便分析
nmap -d9 192.168.1.1 2> debug_log.txt

注意:调试输出发送到标准错误(stderr),需要使用2>重定向。级别越高输出越详细,但可能包含数千行技术细节。

包追踪 (--packet-trace)
显示Nmap发送和接收的每个数据包的摘要,是理解Nmap工作原理的最佳方式。

# 追踪针对少量端口的扫描数据包
nmap --packet-trace -p 22,80,443 192.168.1.1

# 结合端口扫描和版本检测的包追踪
nmap -sS -sV --packet-trace -p 80 192.168.1.1

学习价值:通过观察包追踪输出,您可以了解:

  • Nmap如何发送SYN包进行端口扫描
  • 如何根据响应判断端口状态
  • 版本检测阶段发送了哪些探测包

3. 高级输出管理技巧

恢复中断的扫描 (--resume)
这是处理长时间扫描的关键功能,确保意外中断后可以继续。

# 开始一个大型扫描并保存标准输出
nmap -p- -oN full_port_scan.txt 192.168.1.1

# 如果扫描中断(如网络问题、系统重启),可以这样恢复
nmap --resume full_port_scan.txt

# 恢复扫描时也可以更改输出文件名
nmap --resume full_port_scan.txt -oN resumed_scan.txt

重要限制:只能恢复使用-oN-oG保存的扫描。XML格式不支持恢复功能。恢复时会从上次成功扫描的最后一个主机继续。

接口和路由信息 (--iflist)
在复杂网络环境中,了解Nmap如何看到网络接口至关重要。

# 显示所有网络接口和路由表
nmap --iflist

# 结合接口选择进行扫描
nmap --iflist
# 根据输出选择正确的接口
nmap -e eth1 -oN scan.txt 192.168.2.0/24

应用场景:当主机有多个网络接口(物理网卡、VPN、虚拟机网络)时,确保Nmap使用正确的接口发送数据包。

4. 实战综合示例

完整的渗透测试扫描工作流:

# 1. 初始发现扫描,保存所有格式
nmap -sn -oA phase1_discovery 10.0.0.0/24

# 2. 从发现结果中提取活跃主机
grep "Status: Up" phase1_discovery.gnmap | cut -d' ' -f2 > live_hosts.txt

# 3. 对活跃主机进行详细扫描
nmap -sS -sV -O -p- --min-rate 500 -oA phase2_full_scan -iL live_hosts.txt

# 4. 使用NSE脚本进行漏洞检测
nmap -sV --script vuln -oA phase3_vuln_scan -iL live_hosts.txt

# 5. 合并所有结果生成报告
xsltproc -o final_report.html phase2_full_scan.xml

自动化报告生成脚本示例:

#!/bin/bash
# auto_nmap_scan.sh - 自动化扫描和报告生成

TARGET=$1
DATE=$(date +%Y%m%d_%H%M%S)
OUTPUT_DIR="scans/$DATE"

mkdir -p $OUTPUT_DIR

echo "[*] 开始扫描 $TARGET"
nmap -sS -sV -O -p- --min-rate 1000 -oA $OUTPUT_DIR/scan $TARGET

echo "[*] 生成HTML报告"
xsltproc -o $OUTPUT_DIR/report.html /usr/share/nmap/nmap.xsl $OUTPUT_DIR/scan.xml

echo "[*] 提取关键信息"
echo "=== 开放端口汇总 ===" > $OUTPUT_DIR/summary.txt
grep -E "^[0-9]+/(tcp|udp)" $OUTPUT_DIR/scan.nmap >> $OUTPUT_DIR/summary.txt

echo "[+] 扫描完成!结果保存在 $OUTPUT_DIR/"

根据您提供的文本,这部分内容涵盖了Nmap的一些其他重要选项,包括IPv6支持、激烈扫描模式、数据文件位置、数据发送方式、权限控制以及基本的版本和帮助信息。下面我将对这些选项进行详细的补充说明,重点是添加实际应用示例、使用场景和注意事项,以帮助您更好地理解和应用这些功能。


其他选项

这些选项虽然不像端口扫描或脚本引擎那样常用,但在特定的网络环境和扫描需求下却非常关键。合理使用这些选项可以解决许多实际扫描中遇到的问题。

1. IPv6扫描 (-6)

随着IPv6的逐渐普及,对IPv6网络的扫描变得日益重要。Nmap对IPv6的支持虽然有限,但覆盖了核心功能。

命令示例:

# 基本的IPv6主机发现
nmap -6 -sn 2001:db8::1

# IPv6端口扫描
nmap -6 -sT 2001:db8::1

# IPv6 SYN扫描(需要root权限)
sudo nmap -6 -sS 2001:db8::1

# 完整的IPv6扫描,包括版本和操作系统检测
sudo nmap -6 -A 2001:db8::/64

补充说明与技巧:

  1. IPv6地址表示:IPv6地址可以用多种格式表示,Nmap支持所有标准格式:
   # 完整格式
   nmap -6 2001:0db8:0000:0000:0000:0000:0000:0001

   # 压缩格式(推荐)
   nmap -6 2001:db8::1

   # 混合格式(IPv4映射的IPv6地址)
   nmap -6 ::ffff:192.168.1.1
  1. 扫描范围:IPv6地址空间极其庞大(2^128个地址),不能像IPv4那样扫描整个子网。通常需要:
  • 通过DNS发现目标
  • 使用邻居发现协议(NDP)获取本地链路地址
  • 扫描已知的服务器地址
  1. 实际应用场景
   # 扫描IPv6 Web服务器
   nmap -6 -p 80,443 -sV www.ipv6.google.com

   # 发现本地链路地址
   nmap -6 --script targets-ipv6-multicast-echo
  1. 隧道配置:如果网络不支持原生IPv6,可以使用6to4或Teredo隧道:
   # 在配置了6to4隧道的系统上
   ip tunnel add tun6to4 mode sit remote any local 192.168.1.100
   ip link set tun6to4 up
   ip addr add 2002:c0a8:0164::1/16 dev tun6to4
   nmap -6 -e tun6to4 2002:c0a8:0164::2

2. 激烈扫描模式 (-A)

这是一个”一键式”高级扫描选项,集成了多个常用功能,非常适合快速全面的安全评估。

命令示例:

# 基本激烈扫描
nmap -A 192.168.1.1

# 结合时间和输出选项
nmap -A -T4 -v -oA full_scan 192.168.1.1

# 对多个目标使用激烈扫描
nmap -A 192.168.1.1,2,3

# 从文件中读取目标列表
nmap -A -iL targets.txt

-A选项实际启用的功能:

  • 操作系统检测 (-O)
  • 版本检测 (-sV)
  • 脚本扫描 (-sC) – 使用默认脚本集
  • 路由追踪 (--traceroute) – 如果可能的话

补充说明:

  1. 性能影响-A会显著增加扫描时间,因为它执行了多个阶段的检测:
   # 对比普通扫描和激烈扫描的时间
   time nmap -sS 192.168.1.1
   time nmap -A 192.168.1.1
  1. 自定义激烈扫描:如果需要更多控制,可以手动组合选项:
   # 相当于 -A 但更可控
   nmap -sS -sV -O --traceroute --script=default 192.168.1.1

   # 增强版激烈扫描,包含更多脚本
   nmap -A --script=vuln,auth,intrusive 192.168.1.1
  1. 在渗透测试中的应用
   # 第一阶段:快速发现
   nmap -sn 10.0.0.0/24 -oA discovery

   # 第二阶段:对发现的主机进行激烈扫描
   grep "Status: Up" discovery.gnmap | cut -d' ' -f2 > live_hosts.txt
   nmap -A -T4 -iL live_hosts.txt -oA detailed_scan

3. --datadir <directoryname> (说明用户Nmap数据文件位置)

Nmap使用多个数据文件来支持其功能,自定义这些文件可以扩展Nmap的能力。

数据文件详解:

  1. 关键数据文件
  • nmap-service-probes:服务版本检测的探针
  • nmap-services:端口到服务的映射
  • nmap-os-db:操作系统指纹数据库
  • nmap-mac-prefixes:MAC地址厂商前缀
  • nmap-rpc:RPC程序号映射
  • nmap-protocols:IP协议号映射
  1. 命令示例
   # 使用自定义数据目录
   nmap --datadir /path/to/my/nmap-data/ 192.168.1.1

   # 创建自定义服务探针
   cp /usr/share/nmap/nmap-service-probes ~/.nmap/
   vim ~/.nmap/nmap-service-probes  # 添加自定义探针
   nmap --datadir ~/.nmap/ -sV 192.168.1.1
  1. 实际应用场景
   # 场景1:添加自定义服务的版本检测
   # 在nmap-service-probes中添加:
   # Probe TCP MyApp q|GET /version HTTP/1.0\r\n\r\n|
   # ports 8080
   # match myapp m|^MyApp v([\d.]+)| p/$1/

   # 场景2:自定义操作系统指纹
   # 将新的指纹添加到nmap-os-db文件中

   # 场景3:为内部网络添加自定义端口服务映射
   echo "9999/tcp  myinternal" >> ~/.nmap/nmap-services
  1. 数据文件搜索顺序
    Nmap按以下顺序查找数据文件:
   1. --datadir指定的目录
   2. NMAPDIR环境变量指定的目录
   3. ~/.nmap/(用户家目录)
   4. 可执行文件所在目录的../share/nmap/
   5. 编译时指定的数据目录(通常是/usr/share/nmap)
   6. 当前工作目录

4. 数据发送选项 (--send-eth, --send-ip)

这两个选项控制Nmap在OSI模型的哪一层发送数据包,对于调试和特殊网络环境非常有用。

命令示例与解释:

# 强制使用以太网帧(数据链路层)
sudo nmap --send-eth 192.168.1.1

# 强制使用原始IP包(网络层)
sudo nmap --send-ip 192.168.1.1

# 查看实际使用的发送方式(结合--packet-trace)
sudo nmap --send-eth --packet-trace -p 80 192.168.1.1
sudo nmap --send-ip --packet-trace -p 80 192.168.1.1

使用场景对比:

场景推荐选项原因
常规Linux扫描默认(–send-ip)更高效,使用原始套接字
Windows扫描默认(–send-eth)Windows限制原始套接字
虚拟化环境–send-eth虚拟机网络栈可能异常
VPN连接–send-ipVPN工作在IP层
调试网络问题两者都试确定问题所在层

技术细节:

  • --send-eth:使用PF_PACKET套接字直接操作以太网帧
  • --send-ip:使用原始套接字(RAW_SOCKET)操作IP包
  • 在Linux上,非root用户可能需要特殊权限:
  # 给nmap程序添加CAP_NET_RAW能力
  sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap

  # 验证能力
  getcap /usr/bin/nmap

5. 特权模式 (--privileged)

这个选项对于在非root但具有特殊权限的环境中运行Nmap非常有用。

命令示例:

# 假设用户有raw socket权限但非root
nmap --privileged -sS 192.168.1.1

# 在容器环境中可能需要的配置
docker run --cap-add=NET_RAW --cap-add=NET_ADMIN nmap --privileged -sS target

实际应用场景:

  1. Docker容器
   # Dockerfile示例
   FROM alpine:latest
   RUN apk add --no-cache nmap
   RUN addgroup -S nmapgroup && adduser -S nmapuser -G nmapgroup
   USER nmapuser
   ENTRYPOINT ["nmap", "--privileged"]
   # 运行容器
   docker run --cap-add=NET_RAW mynmap -sS 192.168.1.1
  1. Linux能力(Capabilities)
   # 查看当前进程的能力
   cat /proc/$$/status | grep Cap

   # 为特定用户配置能力
   sudo setcap cap_net_raw+ep /usr/bin/nmap
  1. SELinux/AppArmor环境
   # 检查SELinux状态
   getenforce

   # 如果SELinux阻止,可以创建策略模块
   audit2allow -a -M nmap_local
   semodule -i nmap_local.pp

6. 版本和帮助信息 (-V, -h)

虽然简单,但这些选项在实际工作中非常实用。

命令示例:

# 检查Nmap版本
nmap -V

# 显示简短帮助
nmap -h

# 结合其他命令使用
nmap --version | grep "Nmap version"

实用技巧:

  1. 版本比较
   # 在脚本中检查Nmap版本
   REQUIRED_VERSION="7.80"
   CURRENT_VERSION=$(nmap -V | grep -oP 'Nmap \K[0-9]+\.[0-9]+')

   if [[ $(echo "$CURRENT_VERSION >= $REQUIRED_VERSION" | bc) -eq 1 ]]; then
       echo "Nmap版本符合要求"
   else
       echo "需要升级Nmap"
   fi
  1. 帮助信息过滤
   # 查找特定选项的帮助
   nmap -h | grep -i "version"
   nmap -h | grep -A2 -B2 "scan"

   # 生成完整的选项列表
   nmap -h | grep -E "^-" | sort
  1. 自动化脚本中的使用
   #!/bin/bash
   # 检查必要的工具
   if ! command -v nmap &> /dev/null; then
       echo "错误:未找到Nmap"
       exit 1
   fi

   # 检查版本兼容性
   NMAP_VERSION=$(nmap -V | head -1)
   echo "使用 $NMAP_VERSION"

   # 显示基本用法
   if [[ $1 == "--help" ]]; then
       echo "=== 自定义扫描脚本 ==="
       nmap -h | grep -A5 "SCAN TECHNIQUES"
       exit 0
   fi

7. 综合应用示例

完整的网络评估脚本:

#!/bin/bash
# comprehensive_network_scan.sh

TARGET=$1
SCAN_DATE=$(date +%Y%m%d)
OUTPUT_DIR="scans/${SCAN_DATE}"

# 创建输出目录
mkdir -p $OUTPUT_DIR

# 检查IPv6支持
echo "=== 检查IPv6支持 ==="
if ping6 -c 1 $TARGET &> /dev/null; then
    echo "目标支持IPv6,将进行IPv6扫描"
    IPV6_SCAN="yes"
else
    echo "目标不支持IPv6,仅进行IPv4扫描"
    IPV6_SCAN="no"
fi

# 基本扫描
echo "=== 执行基本扫描 ==="
nmap -sS -p- -T4 -oA ${OUTPUT_DIR}/basic_scan $TARGET

# 激烈扫描
echo "=== 执行激烈扫描 ==="
nmap -A -T4 -oA ${OUTPUT_DIR}/aggressive_scan $TARGET

# IPv6扫描(如果支持)
if [[ $IPV6_SCAN == "yes" ]]; then
    echo "=== 执行IPv6扫描 ==="
    nmap -6 -A -T4 -oA ${OUTPUT_DIR}/ipv6_scan $TARGET
fi

# 生成报告
echo "=== 生成HTML报告 ==="
xsltproc -o ${OUTPUT_DIR}/report.html /usr/share/nmap/nmap.xsl ${OUTPUT_DIR}/aggressive_scan.xml

echo "扫描完成!结果保存在 ${OUTPUT_DIR}/"

调试网络问题的诊断脚本:

#!/bin/bash
# network_diagnosis.sh

TARGET=$1

echo "=== 网络接口信息 ==="
nmap --iflist

echo -e "\n=== 数据包发送测试(IP层)==="
sudo nmap --send-ip --packet-trace -p 80 -T5 $TARGET 2>&1 | head -20

echo -e "\n=== 数据包发送测试(以太网层)==="
sudo nmap --send-eth --packet-trace -p 80 -T5 $TARGET 2>&1 | head -20

echo -e "\n=== 路由追踪 ==="
nmap --traceroute -p 80 $TARGET

echo -e "\n=== 使用自定义数据目录 ==="
if [[ -d ~/.nmap-custom ]]; then
    nmap --datadir ~/.nmap-custom -sV $TARGET
else
    echo "自定义数据目录不存在,使用默认设置"
    nmap -sV $TARGET
fi

一、为什么学 Nmap 之前必须先懂 TCP/IP?

Nmap ≈ 在“网络协议规则”允许的范围内,和目标主机对话、试探、偷听反应,它只是非常懂网络协议

如果你不知道:

  • 什么是 TCP / UDP
  • 什么是端口
  • 什么是握手、挥手
  • 为什么“没返回 ≠ 没有端口”
  • 为什么 SYN 扫描会“更隐蔽”

那你就看不懂 Nmap 的扫描结果


二、从“网络通信”最本质的概念说起

2.1 什么是网络通信?(一句话版本)

网络通信 = 两台设备,按照约定好的规则,互相发送数据

这套“约定好的规则”,就叫 网络协议(Protocol)


2.2 协议为什么要“分层”?

想象你寄一封快递:

现实世界网络世界
写内容应用层
装信封传输层
填地址网络层
交给快递员网络接口层

每一层只干一件事,互不干扰,这就是 TCP/IP 协议栈 的核心思想。


三、TCP/IP 协议栈整体结构(重点)

我们用最常见、也是 Nmap 直接打交道的 TCP/IP 四层模型

┌────────────────────┐
│ 应用层(Application) │ ← HTTP / FTP / SSH / DNS
├────────────────────┤
│ 传输层(Transport)   │ ← TCP / UDP
├────────────────────┤
│ 网络层(Internet)    │ ← IP / ICMP
├────────────────────┤
│ 网络接口层(Link)    │ ← Ethernet / ARP
└────────────────────┘

Nmap 最主要工作在:

  • 传输层(TCP / UDP)
  • 网络层(IP / ICMP)

四、每一层详细剖析(结合 Nmap)


4.1 网络接口层(最底层,通常被忽略)

它负责什么?

  • 同一局域网内找到目标设备
  • 把数据变成电信号 / 无线信号

核心协议

  • Ethernet
  • ARP(地址解析协议)

ARP 是什么?(非常重要)

问题:“我知道你的 IP,但不知道你的 MAC 地址,怎么发数据?”

答案:

  • 发送 ARP 请求
  • 局域网内广播:“谁是 192.168.1.1?”
  • 目标回复 MAC 地址

和 Nmap 的关系

  • nmap -sn 192.168.1.0/24
  • 局域网主机发现时,大量依赖 ARP
  • 比 ICMP 更快、更准

4.2 网络层(IP & ICMP)

IP 协议是干嘛的?

一句话:负责“把数据送到哪台主机”,IP 地址 ≈ 现实中的“家庭住址”

特点

  • 不保证到达
  • 不保证顺序
  • 不保证不丢包

IP 本身很“冷漠”。


ICMP(很多新手误会它)

你可能听过:

  • ping
  • TTL exceeded
  • Destination unreachable

这些都是 ICMP

ping 的真实本质

ICMP Echo Request  →  
ICMP Echo Reply

和 Nmap 的关系

  • 主机是否存活(Host Discovery)
  • 防火墙是否拦截 ICMP,会影响扫描结果

注意:ping 不通 ≠ 主机不存在


4.3 传输层(Nmap 的核心)

这里只有两个主角:

协议特点
TCP面向连接、可靠
UDP无连接、不可靠

五、TCP 协议深度剖析(重中之重)

5.1 TCP 是什么?

TCP 是一种“打电话式”的通信方式

特点:

  • 先建立连接
  • 再传数据
  • 结束时礼貌断开

5.2 TCP 报文中的关键标志位(Flags)

标志含义
SYN请求建立连接
ACK确认
FIN请求关闭连接
RST强制中断
PSH推送数据

Nmap 本质就是在“玩这些标志位”


5.3 TCP 三次握手(建立连接)

类比

A:我能和你说话吗?
B:可以,你能听见我吗?
A:能,开始说正事吧


技术流程(标准)

客户端 → 服务端:SYN
服务端 → 客户端:SYN + ACK
客户端 → 服务端:ACK

至此,连接建立完成。


为什么是三次?

核心原因:

  • 防止旧连接干扰
  • 确认双方的发送 & 接收能力

Nmap 如何“利用”三次握手?

1.TCP Connect 扫描(-sT)

  • 完整走三次握手
  • 容易被日志记录

2.TCP SYN 扫描(-sS,半连接扫描)

SYN →
← SYN+ACK
RST →

不发送最后一次 ACK
连接没真正建立
更隐蔽


5.4 TCP 四次挥手(断开连接)

断开连接比建立复杂,这是 TCP 的“礼貌”。


标准流程

客户端 → 服务端:FIN
服务端 → 客户端:ACK
服务端 → 客户端:FIN
客户端 → 服务端:ACK

为什么是四次?

因为:

  • TCP 是全双工
  • 两个方向必须分别关闭

TIME_WAIT 状态(很多新手不懂)

断开后:

  • 客户端会等待一段时间(通常 2MSL)
  • 防止旧数据干扰新连接

端口扫描时看到“奇怪的等待状态”,别慌


六、UDP 协议(Nmap 新手最容易误解)

6.1 UDP 的本质

一句话:UDP = 发消息,不等回复

特点:

  • 无连接
  • 不保证到达
  • 没有握手

6.2 UDP 扫描为什么“慢又不准”?

因为:

  • 没有 ACK
  • 没有 SYN/FIN
  • 沉默 ≠ 关闭

Nmap 的逻辑是:

  • 收到 ICMP Port Unreachable → 端口关闭
  • 什么都没收到 → open | filtered

6.3 常见 UDP 服务

端口服务
53DNS
67/68DHCP
123NTP
161SNMP

很多 信息泄露型服务都在 UDP


七、把“协议原理”直接映射到 Nmap 思维

7.1 Nmap 到底在干嘛?

你可以把 Nmap 想成:

一个非常懂礼貌、也懂耍流氓的“网络访客”

它会:

  • 正常敲门(Connect)
  • 只敲一下就走(SYN)
  • 在门口听声音(ACK / Window)
  • 对没回应的门反复确认(UDP)

7.2 为什么“理解协议 = 看懂扫描结果”

比如你看到:

80/tcp  open   http
443/tcp filtered https

你应该立刻想到:

  • open:SYN → SYN+ACK
  • filtered:SYN → 没回应(被防火墙拦)

八、这一章你真正应该掌握的“硬核理解”

如果你能回答下面问题,说明你已经超过 70% 的 Nmap 初学者

为什么 SYN 扫描不算完整连接?
为什么 ping 不通主机仍可能存在?
为什么 UDP 扫描经常显示 open|filtered?
为什么 TCP 比 UDP “可靠”?
为什么端口扫描本质是“协议交互试探”?


第2章:UDP、ICMP、SCTP 等协议的核心特性与扫描相关性

核心目标:明白为什么不同协议,Nmap 的扫描方式、速度、准确性、结果含义完全不一样


一、先给你一个“全局地图”

在开始之前,先把这几个协议放在一张图里

协议所在层是否有连接扫描难度Nmap 中的作用
TCP传输层1主流端口扫描
UDP传输层4信息收集、慢
ICMP网络层2主机发现、防火墙判断
SCTP传输层有(类似 TCP)3电信/专用系统

Nmap 的扫描是:不同协议 = 不同“回应规则” = 不同“判断逻辑”


二、UDP 协议:最让初学者“崩溃”的协议


2.1 UDP 的本质

UDP = 我发给你了,至于你收没收,我不管

对比一下:

对比项TCPUDP
建立连接三次握手no
确认机制ACKno
重传no
可靠性
扫描难度

2.2 UDP 为什么“没有端口状态感”?

TCP 扫描时:

SYN → SYN+ACK = open
SYN → RST     = closed
非常清晰。

而 UDP:UDP 数据 → (可能什么都没有)


2.3 那 Nmap 怎么判断 UDP 端口状态?

靠的是 “间接证据”

三种典型情况

情况 1:收到 ICMP Port Unreachable
UDP →  
← ICMP Destination Unreachable (Port)
端口关闭(closed)

情况 2:收到应用层响应(极少)
UDP →  
← DNS / SNMP / NTP 响应
端口开放(open)

情况 3:什么都没收到(最常见)
UDP →  
(沉默)

open | filtered

可能是:

  • 服务在,但不回
  • 防火墙丢包
  • 真的没东西,但没 ICMP

2.4 为什么 UDP 扫描“慢得要命”?

原因只有一个:Nmap 必须“等超时”才能下结论

TCP:RST 立刻知道 closed

UDP:不回应 = 等到你心态爆炸

这也是为什么:-sU,默认非常慢。


2.5 UDP 在渗透和信息收集中为什么重要?

因为很多高价值服务用 UDP:

服务风险点
DNS区域传送、缓存投毒
SNMP明文社区字符串
NTP放大攻击
TFTP无认证文件下载

UDP 不多,但一旦开,往往“很肥”


三、ICMP 协议:不只是 ping 那么简单


3.1 ICMP 是什么?

ICMP = IP 层的“错误报告员 + 网络回声”,它不传数据,只传状态信息

3.2 常见 ICMP 类型(你必须认识)

类型作用
Echo Requestping 请求
Echo Replyping 回复
Destination Unreachable无法到达
Time ExceededTTL 超时

3.3 ping 的“真实扫描意义”

当你执行:ping 目标
你在问的是:“你这台主机,IP 层还活着吗?”

注意:

  • ping 通 ≠ 端口开放
  • ping 不通 ≠ 主机不存在

3.4 Nmap 中 ICMP 的真实用途

主机发现(Host Discovery)

Nmap 默认会先做:

  • ICMP Echo
  • TCP ACK
  • TCP SYN(80,443)

判断“这台主机值不值得继续扫”

2. 防火墙判断(非常重要)

不同 ICMP 返回,含义不同:

ICMP 类型暗示
Host Unreachable网络层阻断
Port UnreachableUDP 端口关闭
Time Exceeded可能在路径中

ICMP 是“网络态度”的体现

3.5 为什么很多服务器禁 ping?

因为:

  • 会被用来探测
  • 会被用在 DDoS
  • 会泄露网络结构

但禁 ICMP ≠ 安全,Nmap 还有很多“旁路确认手段”。


四、SCTP 协议:被忽视,但你必须知道

4.1 SCTP 是什么?(一句话版)

SCTP = 融合 TCP 可靠性 + UDP 灵活性的传输协议

主要用于:

  • 电信信令
  • 核心网络
  • 专用系统

4.2 SCTP 和 TCP 有什么像?

特性TCPSCTP
面向连接yesyes
有握手yesyes
可靠传输yesyes

4.3 SCTP 的“独门绝技”

四次握手(Cookie 机制)

目的:

  • 防 SYN Flood
  • 无需保存半连接状态

天生比 TCP 抗攻击

4.4 Nmap 如何扫描 SCTP?

常见方式:

-sY   # SCTP INIT 扫描
-sZ   # SCTP COOKIE-ECHO 扫描

判断逻辑类似 TCP:

  • 有响应 → open
  • Abort → closed
  • 沉默 → filtered

4.5 为什么很少见到 SCTP?

因为:

  • Web 不用
  • 普通服务器不用
  • 运营商网络、核心设备常见

如果扫到 SCTP,说明:很可能已经进入“非普通 IT 网络”


五、把三种协议放在一起对比(核心总结)

协议扫描信号判断依据误判率
TCPSYN / ACK / RST明确
UDPICMP / 应用响应间接
ICMPEcho / Error状态
SCTPINIT / ABORT明确

如果看到:

  • UDP open|filtered“不是 Nmap 不行,是协议本来就不说话”
  • ICMP 全禁,但 TCP 有回应“防火墙在装死,不是真死”
  • SCTP 响应“这不是普通服务器”

为什么 UDP 扫描必须慢
为什么 ICMP 是“侧信道信息”
为什么 Nmap 不同协议用不同扫描参数
为什么沉默本身也是一种“信号”


第 3 章:网络包结构详解

——TCP 报文头 & SYN / ACK / RST 等标志位的真实含义


先说一句非常重要的话

Nmap 的本质不是“扫端口”,而是“构造不同的网络包,观察对方如何回应”。

而“如何回应”,完全由网络包里的字段和标志位决定


二、什么是“网络包”?(直觉版)

你可以把一个网络包理解为:一封有固定格式的信件

它分成两部分:

┌──────────────┐
│   报文头     │  ← 控制信息(谁发的?干嘛?)
├──────────────┤
│   数据部分   │  ← 真正的内容
└──────────────┘

Nmap 绝大多数时候只关心“报文头”


三、TCP 报文整体结构(只保留重点)

一个 TCP 报文大致长这样(简化版):

┌───────────────────────────────┐
│ 源端口        | 目的端口        │
├───────────────────────────────┤
│ 序列号(Sequence Number)      │
├───────────────────────────────┤
│ 确认号(Acknowledgment Number)│
├───────────────────────────────┤
│ 头长度 | 保留 | Flags | 窗口大小 │
├───────────────────────────────┤
│ 校验和        | 紧急指针        │
├───────────────────────────────┤
│            可选字段            │
├───────────────────────────────┤
│              数据             │
└───────────────────────────────┘

只抓和扫描直接相关的字段


四、端口字段:扫描的“入口”

源端口 & 目的端口

字段含义
源端口谁发的
目的端口找谁

在 Nmap 中:

  • 目的端口 = 你在扫描的端口
  • Nmap 会随机化源端口(防检测)

五、Sequence / Acknowledgment:为什么要有它们?

5.1 序列号(Sequence Number)

告诉对方:我发的数据从哪一字节开始

作用:

  • 保证顺序
  • 防止丢包
  • 防止重放

5.2 确认号(ACK Number)

告诉对方:你发到哪一字节,我已经收到了

注意:只有 ACK 标志位被置位时,这个字段才有效


六、TCP Flags:这一章的“灵魂”

6.1 Flags 是什么?

Flags 是一组 1 bit 的开关,每一位代表一个“意图”。

你可以理解为:“我发这个包,是想干什么”

6.2 常见 TCP 标志位总览

标志位含义核心用途
SYNSynchronize请求建立连接
ACKAcknowledgment确认收到
FINFinish正常关闭连接
RSTReset强制中断
PSHPush立即交给应用
URGUrgent紧急数据

Nmap 主要用的是前四个


七、逐个拆解关键标志位(结合扫描)

7.1 SYN:连接的“敲门声”

SYN 的真实含义:“我想和你建立一个 TCP 连接”

特征:

  • 连接的第一个包
  • 不携带数据
  • 消耗系统资源(半连接)

SYN 在扫描中的意义

正常情况:

SYN  →
← SYN + ACK

说明:

  • 端口开放
  • 服务在监听

端口关闭:

SYN  →
← RST

Nmap 如何利用 SYN?

nmap -sS

只发 SYN,看回应,不完成连接

优点:

  • 隐蔽
  • 不易被记录完整会话

7.2 ACK:不是“同意”,而是“确认”

很多新手误会 ACK = 同意,这是错的。ACK 的真实含义:“我确认你刚才发的东西”它本身不表示连接状态

ACK 在扫描中的作用(非常高级)

nmap -sA

ACK 扫描逻辑:

返回含义
RST未被过滤
无回应被防火墙过滤

ACK 扫描是用来探测防火墙规则的,不是为了判断端口开不开。


7.3 RST:网络中的“挂电话”

RST 的真实含义“别说了,马上断!”

出现场景:

  • 端口不存在
  • 非法包
  • 异常连接

RST 在扫描中的地位

RST = 非常强的信号

收到 RST通常说明
SYN → RST端口关闭
ACK → RST防火墙未拦
建连中 RST被拒绝

为什么 RST 对扫描这么重要?

因为:

  • 明确
  • 不需要等待超时

7.4 FIN:礼貌的“我说完了”

FIN 的真实含义

“我这边不发数据了,但还能收你的”,TCP 是全双工,所以需要 四次挥手


FIN 在扫描中的妙用(经典)

nmap -sF

逻辑来源于 RFC:

端口状态对 FIN 的回应
open忽略
closedRST

这就是 FIN / NULL / Xmas 扫描的理论基础


八、特殊扫描的“包结构思维”

8.1 NULL 扫描(无标志位)

Flags = 0
  • open:沉默
  • closed:RST

8.2 Xmas 扫描

FIN + PSH + URG

“像圣诞树一样全亮”利用的是:“异常包 + RFC 行为差异”


九、为什么“沉默”本身是信息?

在网络扫描中,不回应 ≠ 没有信息

可能意味着:

  • 端口开放(UDP / FIN 类扫描)
  • 防火墙过滤
  • IDS 丢弃异常包

Nmap 的很多判断,来自“预期 vs 实际”


十、把一切连起来(从包 → 协议 → Nmap)

应该形成这样的链路思维:

TCP 包结构
   ↓
Flags 表达意图
   ↓
目标系统的 RFC 行为
   ↓
返回包 or 沉默
   ↓
Nmap 状态判断

SYN 和 ACK 各自表达什么“意图”?
为什么 ACK 扫描不能判断端口是否开放?
为什么 RST 是扫描中最“值钱”的响应?
为什么 FIN 扫描对 open 端口反而没回应?
为什么异常包能绕过部分防火墙?


第 4 章:端口状态机理

——open / closed / filtered 的底层判断逻辑(Nmap 视角)


一、先打破一个新手最常见的误解

很多初学者以为:Nmap 能“看到”端口端口是一个“真实存在的东西”这是完全错误的。


端口状态不是“被看到的”,而是“被推断出来的”。

Nmap 做的事只有三步:

发送特定网络包
↓
观察回应(或沉默)
↓
根据协议规则推断状态

端口状态 = 逻辑推理结果,不是事实拍照


二、Nmap 能给出的“标准端口状态”

先把全量状态列出来(后面逐个拆):

状态含义
open有服务在监听
closed没服务监听
filtered被过滤,无法判断
unfiltered未被过滤(但是否开放未知)
open|filtered开放或被过滤
closed|filtered关闭或被过滤(少见)

初学阶段,必须吃透前三个:open / closed / filtered


三、open(开放):最“干脆”的状态


3.1 open 的本质含义

目标主机上,有进程在监听该端口,并愿意回应你

注意关键词:

  • 有进程
  • 在监听
  • 愿意回应

3.2 TCP 中 open 是怎么“被确认”的?

典型 SYN 扫描流程

你 → SYN →
目标 → SYN+ACK →

Nmap 立刻得出结论:ope,为什么?SYN+ACK 只能由“正在监听的端口”发出


TCP Connect 扫描

SYN →
← SYN+ACK
ACK →

连接成功 = open

3.3 UDP 中 open 为什么“很难确认”?

UDP 没有握手。

只有两种情况能确认 open:

情况 1:收到应用层响应

UDP →  
← DNS / SNMP / NTP 响应

情况 2:已知协议的“正确回应模式”

所以 UDP open 很“金贵”

3.4 重要结论(必须记住)

open = 明确的、正向的协议响应


四、closed(关闭):最“直白”的状态

4.1 closed 的真实含义

目标主机存在,但该端口没有进程监听

注意:

  • 主机是活的
  • 只是端口没人接电话

4.2 TCP 中 closed 的判定逻辑

标准情况

SYN →
← RST

RST 的意思是:“别找了,这个端口没人”, RST = closed 的铁证


4.3 UDP 中 closed 的判定逻辑

UDP 没 RST,用的是 ICMP:

UDP →
← ICMP Destination Unreachable (Port)

明确告诉你:端口不可达


4.4 一个非常重要的现实判断

防火墙很少“伪造 RST 或 ICMP”

因为:容易被识别,成本高,所以:closed 通常是高置信度结论


五、filtered(被过滤):最让人困惑的状态


5.1 filtered 的一句话定义

Nmap 的探测包,没能到达目标端口,或者回应被拦截

关键点:

  • 不是端口状态
  • 是“通信路径状态”

5.2 filtered 是怎么“被推断”的?

核心特征只有一个:

发了包
↓
什么都没回来

注意:沉默 ≠ 无信息


5.3 常见导致 filtered 的原因

原因解释
防火墙丢弃包
ACL拒绝策略
IDS/IPS静默拦截
路由限制到不了

5.4 TCP 中 filtered 的典型场景

SYN →
(无回应)

Nmap 的推理是:“我不知道端口开没开,但我被挡住了”,filtered


5.5 UDP 中 filtered 更常见(也更痛苦)

UDP →
(沉默)

这时 Nmap 只能说:open | filtered

因为:open 端口可能不回,filtered 也不回


六、unfiltered:新手最容易误解的状态


6.1 unfiltered 是什么意思?

数据包没有被防火墙拦截

但注意:并不等于 open,是否有服务,不知道


6.2 ACK 扫描中的典型例子

ACK →
← RST

说明:

  • 包进去了
  • 防火墙没挡
  • 至于端口有没有服务:未知

状态 = unfiltered


七、open|filtered:不是 Nmap “不确定”,而是协议如此


7.1 open|filtered 出现的真实原因

协议允许“沉默即合理”

典型协议:

  • UDP
  • TCP FIN / NULL / Xmas 扫描

7.2 应该如何“解读” open|filtered?

不是问:“它到底开没开?”而是问:“我还能用什么方式再确认?”


八、把所有状态放进一个“判断矩阵”

TCP SYN 扫描为例

返回状态
SYN+ACKopen
RSTclosed
无回应filtered

UDP 扫描为例

返回状态
应用层响应open
ICMP Port Unreachableclosed
无回应open|filtered

九、为什么“端口状态”不是绝对真理?

一个现实:端口状态 = 在当前时间、当前路径、当前规则下的结果

改变任何一个变量:

  • 扫描方式
  • 源 IP
  • 时间
  • 包特征

结果都可能变。


十、扫描思维模型

我发了什么包?
↓
协议规定应该如何回应?
↓
实际发生了什么?
↓
哪个状态最符合?

而不是:“Nmap 说 open,那就是 open。”


区分“端口状态”和“防火墙状态”
理解沉默本身就是判断依据
明白为什么 UDP 结果总是模糊
知道什么时候要“换扫描方式验证”


第 5 章:RTT(Round-Trip Time)计算与超时机制

——Nmap 为什么“等多久”、什么时候“该放弃”

Nmap 是如何“估算网络反应速度”的超时不是拍脑袋,而是基于 RTT 的动态计算。为什么同样的命令,有时飞快,有时慢到怀疑人生;为什么 Nmap 有时“误判 filtered”;为什么 -T4 既香又危险。


一、先把 RTT 说到“一眼就懂”

1.1 RTT 是什么?

RTT(Round-Trip Time)= 往返时延

你 → 发包 → 目标
你 ← 回包 ← 目标

从“发出”到“收到回应”的总时间


1.2 生活化类比(非常重要)

你敲门问一句话:

  1. 对方 1 秒内回应 → 很近
  2. 5 秒才回 → 很远 / 很慢
  3. 一直不回 → 人不在 / 被保安拦了

Nmap 做的事情一模一样


二、为什么 RTT 是“扫描准确性”的基础?

先说结论:所有端口状态判断,都依赖于“我等了多久”

如果你:

  • 等太短 → 把“慢回应”当成 filtered
  • 等太久 → 扫描慢到爆炸

RTT = 准确性 vs 速度的平衡点


三、RTT 在 TCP 扫描中的真实计算

我们用最经典的 TCP SYN 扫描 来拆。


3.1 一个最基础的 RTT 样本

t0:发送 SYN
t1:收到 SYN+ACK
RTT = t1 - t0

这是一个“干净”的 RTT 样本

Nmap 会:记录多个 RTT,做统计计算(不是只信一次)


3.2 为什么要“多次取样”?

因为网络是不稳定的:拥塞,抖动,排队,路由变化

一次 RTT ≠ 真实 RTT


四、Nmap 如何“聪明地”计算 RTT?

4.1 Nmap 不是用“平均值”

而是类似:平滑 RTT(Smoothed RTT),RTT 方差(RTT Variance)

原理和 TCP 的 RTO(Retransmission Timeout) 非常像。


4.2 一个直觉公式(不用死记)

超时时间 ≈ RTT + 安全余量

安全余量取决于:

  • RTT 波动大小
  • 当前扫描负载
  • 扫描策略(T0~T5)

五、超时(Timeout)机制的核心逻辑

5.1 什么是“超时”?

在预期时间内没等到回应,就认为“这次失败了”

注意:

  • 超时 ≠ 端口一定被过滤
  • 超时 = 这次探测没得到信息

5.2 TCP 中的三种典型超时情形

情形 1:端口真的 filtered

SYN →
(防火墙丢弃)

情形 2:端口 open,但网络慢

SYN →
(延迟很久)
← SYN+ACK

情形 3:丢包

SYN →
(包丢了)

Nmap 只能通过“等待策略”来区分


六、重传(Retransmission):Nmap 的“再问一次”

6.1 为什么要重传?

因为:网络不可靠,一次失败不能下结论


6.2 Nmap 的基本策略

发包
↓
等超时
↓
重发(有限次数)
↓
仍无回应 → 推断状态

不是无限重试


6.3 重传次数的影响

次数影响
快,但误判多
准,但慢

七、RTT 与端口状态“误判”的直接关系

这是新手最容易踩坑的地方


7.1 RTT 估得太小,会发生什么?

  • 慢链路
  • 跨国网络
  • 卫星 / 移动网络

结果:

SYN →
(还在路上)
Nmap:超时 → filtered

假 filtered


7.2 RTT 估得太大,会发生什么?

  • 本地网络
  • 高速链路

结果:

  • 每个端口都等很久
  • 扫描效率暴跌

八、Nmap 的 Timing Template(T0~T5)本质是什么?

一句话真相:
-T 不是“快慢开关”,而是 RTT / 超时 / 并发 / 重传的组合预设


8.1 各 T 模式的“底层性格”

模式RTT & 超时性格
T0极长非常保守
T1很长极慢
T2稳妥低噪声
T3平衡默认
T4较激进常用
T5极短容易误判

8.2 为什么 T5 经常“翻车”?

因为:

  • RTT 估算不足
  • 超时太短
  • 重传次数少

“没回 ≠ 被过滤”被放大了


九、RTT 与 UDP 扫描:灾难级组合

9.1 UDP 没有“确认包”

TCP:

SYN → SYN+ACK

UDP:

UDP →
(沉默是合法的)

9.2 UDP 中 RTT 的尴尬现实

  • 没有明确“成功信号”
  • 只能靠 ICMP 或应用回应
  • RTT 只能用于“等多久放弃”

所以 UDP 扫描必然慢


十、RTT、并发(Parallelism)与“自我 DDoS”

10.1 并发扫描意味着什么?

同时发很多包
↓
网络排队
↓
RTT 人为变大

10.2 Nmap 的自适应调节

当 Nmap 发现:

  • RTT 突然上升
  • 丢包变多

它会:

  • 降低并发
  • 拉长超时

Nmap 会“踩刹车”

  • 跨国扫描慢,RTT 高,超时应放宽
  • filtered 特别多,可能 RTT 估算过小
  • UDP 几乎全是 open|filtered,正常,不是失败
  • T5 很爽但结果怪,超时与重传不够

Nmap 不是在“判断端口”,而是在“和网络做博弈”。

RTT 和超时机制= Nmap 判断世界的“时间感”。


第 5 章:IPv4 vs IPv6 基础差异及其在扫描中的影响

IPv4 和 IPv6 之间的差异,如何影响端口扫描,Nmap 如何处理这两种协议,如何应对 IPv6 扫描的复杂性——为什么 IPv6 扫描挑战更大,如何应对?


一、IPv4 和 IPv6 基础差异

1.1 IPv4 简单定义

IPv4(Internet Protocol version 4)是最广泛使用的协议,IPv4 地址是32 位(4 字节),表示为四组十进制数,每组 0~255,例如:192.168.1.1

特点:

  • 地址总数:约 43 亿个(2^32)
  • 用于全球互联网通信
  • 相对简洁,但因地址枯竭问题,逐渐被 IPv6 替代

1.2 IPv6 简单定义

IPv6(Internet Protocol version 6)是为了解决 IPv4 地址枯竭问题而推出的下一代协议。IPv6 地址是 128 位(16 字节),表示为八组 16 进制数,每组 4 个字符,例如:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

特点:

  • 地址总数:约 3.4 × 10^38(2^128)
  • 更复杂的地址体系,设计更现代,包含更多的功能(如自动配置、内置安全性等)

二、IPv4 与 IPv6 的关键区别

特性IPv4IPv6
地址长度32 位128 位
地址表示点分十进制(例如 192.168.1.1)十六进制:用冒号分隔(例如 2001:0db8:…)
地址类型单播、广播、多播单播、组播(无广播)
地址分配静态或动态(DHCP)静态分配或自动配置(SLAAC)
校验和必须计算无需计算
路由表大小较小较大(因地址空间巨大)
安全特性需要外部加密(如 IPSec)内建 IPSec

三、Nmap 对 IPv4 与 IPv6 扫描的支持差异

3.1 Nmap 对 IPv4 的扫描

Nmap 默认扫描 IPv4 地址,通过 TCP、UDP、ICMP 等协议来完成主机发现和端口扫描。这个过程已经经过多年的优化,支持的协议、扫描方式非常丰富

基本操作:

nmap 192.168.1.1       # IPv4 扫描

Nmap 会发送 SYN、ACK、FIN、UDP 等类型的包来判断端口状态。


3.2 Nmap 对 IPv6 的扫描

对于 IPv6,Nmap 同样支持,但相比 IPv4,它面临更多的挑战

  1. 地址空间巨大
    IPv6 地址空间极大,传统的 ping 扫描(使用 ICMP)变得不那么适用,因为扫描范围非常庞大。
  2. 防火墙和路由器过滤问题
    IPv6 的 防火墙和路由器通常比 IPv4 更严格,尤其在 自动配置链路本地地址的情况下,防火墙的拦截更加频繁
  3. 广播问题
    IPv6 不支持广播,只支持单播和组播,因此广播扫描(Nmap 的一些扫描方式)在 IPv6 中不再适用。

IPv6 扫描的基本操作:

nmap -6 2001:0db8:85a3:0000:0000:8a2e:0370:7334   # IPv6 扫描

四、IPv6 扫描中的常见挑战

4.1 地址空间的挑战

IPv6 地址空间巨大,如何有效扫描?

由于 IPv6 的地址空间为 128 位,在扫描时,Nmap 无法像 IPv4 那样直接扫一整个网络范围。因此,Nmap 对 IPv6 网络的扫描主要依赖于以下方式:

  • 指定范围:例如扫描某个特定的网络段。
  • 使用域名解析:使用 -6 参数和域名解析,使 Nmap 能够扫描与之相关的 IPv6 地址。
nmap -6 example.com    # 使用域名解析 IPv6 地址

4.2 自动配置与 SLAAC(Stateless Address Autoconfiguration)

IPv6 地址分配

IPv6 支持 SLAAC(无状态地址自动配置),即设备在无 DHCP 服务器的情况下根据网络前缀自动生成地址,这导致:

  • 动态生成的地址:使得网络扫描面临更多的挑战。
  • 网络拓扑的变化:IPv6 网络拓扑可能频繁变化,设备离线后很可能立即被其他设备接管其地址。

4.3 防火墙与路由问题

IPv6 防火墙的过滤机制和NAT(网络地址转换)的缺失,使得扫描面临更高的挑战:

  • NAT 不再使用,因此每台设备的每个地址在公网都可以直接访问,这可能导致扫描时 端口过滤规则更加严格
  • 端口扫描的隐蔽性:一些防火墙会在 IPv6 上使用更加复杂的规则,甚至是基于 IPsec 的加密和验证,造成 扫描时难以判断端口状态

五、如何有效地进行 IPv6 扫描?

5.1 设置扫描目标范围

扫描某个特定的 IPv6 地址段:

nmap -6 2001:0db8:85a3::/64   # 扫描整个子网

这种方式可以直接扫描整个 IPv6 子网,但是注意:由于 IPv6 地址范围的巨大,这个过程 非常慢,且通常会受到路由和防火墙限制


5.2 ICMP 探测(主机发现)

IPv6 的主机发现通常依赖 ICMPv6,因为 IPv6 没有广播,因此只能使用 邻居发现协议(NDP) 来发现主机。

nmap -6 -sn 2001:0db8:85a3::/64   # 仅做主机发现

5.3 扫描 IPv6 中的特定服务

和 IPv4 一样,可以使用不同的扫描方式来对 IPv6 地址上的服务进行识别,但需要注意:

  • 多次尝试:IPv6 的配置和路由可能导致一些服务变得不可访问,因此可能需要 多次扫描增加超时时间
  • 更多配置:因为 IPv6 的路由器和防火墙通常比 IPv4 更严格,可能需要调整扫描的参数,如使用 -T4-T5(快速扫描)。

六、IPv4 和 IPv6 在端口扫描中的核心差异

特性IPv4IPv6
地址表示32 位,点分十进制(例如 192.168.1.1)128 位,十六进制,冒号分隔(例如 2001:0db8:…)
地址数量约 43 亿约 3.4 × 10^38
主机发现ICMP Echo Request / ARPICMPv6 Neighbor Solicitation
网络扫描方式广播、单播、多播无广播,只能使用单播和组播
防火墙设置NAT,私有地址,端口映射无 NAT,全球唯一地址,每个设备公开可见
扫描方式的难度传统的端口扫描相对简单地址分配动态、扫描难度较大

好,这一部分非常关键,而且你抓的点很准:

“扫描失败 ≠ 用错工具,而是不会排错”
对初学者来说,Nmap 的学习曲线往往不是“不会用”,而是“用了却没结果、看不懂、不知道哪里出问题”。

下面我会以“写进教程即可用”的标准,帮你补全 第 2 章:故障排除与常见问题处理
风格上我会刻意 慢、白话、步骤化,确保零基础也能跟着排


故障排除与常见问题处理(Troubleshooting)

本章节用于解决:

  • 扫描没有结果
  • 扫描直接失败
  • 输出看不懂
  • 报错但不知道问题在哪

如果你在使用 Nmap 时“感觉它坏了”,请先读这一章。


2.1 常见错误诊断(初学者必看)

2.1.1 权限不足(最常见错误之一)

典型表现

You requested a scan type which requires root privileges.

或:

WARNING: TCP SYN Scan requires root privileges.

原因

  • Nmap 的某些扫描方式(如 SYN 扫描)
  • 需要直接构造底层网络数据包
  • 普通用户没有权限

这不是 Nmap 的问题,而是操作系统的安全限制

解决方法

Linux / macOS
sudo nmap <target>

例如:

sudo nmap -sS 192.168.1.1
Windows
  • 必须 “以管理员身份运行”
    • CMD
    • PowerShell
    • 或 Nmap Zenmap

如果不是管理员权限,很多扫描会 “看似执行了,实际上什么都没扫到”


2.1.2 “Host seems down” 错误

报错示例

Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn

最容易误解的地方很多人看到这句话会以为:“目标主机不在线”“IP 地址输错了”其实通常不是。

真正原因(90% 情况)

Nmap 默认会先做 主机存活探测(Ping Scan)

  • ICMP Ping
  • TCP ACK
  • TCP SYN

如果目标:

  • 防火墙屏蔽 Ping
  • 云服务器禁 ICMP
  • 内网设备禁回应

Nmap 会“以为”主机不在线

正确解决方法

使用 -Pn(跳过主机发现)

nmap -Pn 192.168.1.100

或:

nmap -Pn example.com

如果你确定目标是在线的,但 Nmap 说 “Host seems down”,第一反应:加 -Pn 再扫一次。


2.1.3 扫描超时(Timeout)

常见现象

  • 扫描卡很久
  • 扫描结束但几乎没有端口信息
  • 提示超时、重试次数过多

常见原因

原因说明
网络延迟高VPN、跨国扫描
防火墙丢包丢弃扫描包
扫描参数过激扫太多端口
目标性能低嵌入式设备

基础解决方案(新手可用)

1. 降低扫描强度
nmap -T3 <target>

或:

nmap -T2 <target>
2。缩小扫描范围
nmap -p 80,443 <target>

而不是:

nmap -p- <target>

2.2 扫描失败原因分析(为什么“什么都扫不到”)

分析问题”,而不是盲目换命令


2.2.1 防火墙拦截

表现特征

  • 所有端口显示为 filtered
  • 无服务指纹
  • 无版本信息

示例输出:

PORT   STATE    SERVICE
80/tcp filtered http

原因解释

  • 防火墙丢弃扫描包
  • IDS/IPS 检测到扫描行为
  • 云厂商安全组拦截

排查思路

  1. 确认目标是否允许访问
  2. 尝试 常见端口
  3. 切换扫描方式:
nmap -sT <target>

2.2.2 网络配置问题(本地)

常见场景

  • 虚拟机无法扫描外网
  • 扫描同网段失败
  • 公司 / 学校网络

排查清单(写进教程非常实用)

  • 是否在 NAT / 桥接模式
  • 是否开启 VPN
  • 是否有代理软件
  • 防火墙是否启用

教程中可以给一句经验总结:如果你连浏览器都访问不了目标地址,Nmap 也不可能扫到。


2.2.3 Windows 的 Npcap 驱动问题

表现

  • Nmap 能运行
  • 但 SYN 扫描无结果
  • Zenmap 报错

解决方案

  1. 重新安装 Npcap
  2. 安装时勾选:
    • ✔ “WinPcap API-compatible Mode”
  3. 重启系统

2.3 日志解读与调试选项(从输出中“学会排错”)


2.3.1 -v(Verbose:详细输出)

示例

nmap -v 192.168.1.1

能看到什么?

  • 当前扫描阶段
  • 正在探测的端口
  • 重试情况

新手调试第一步:永远先加 -v


2.3.2 -vv(更详细)

nmap -vv <target>

适合:

  • 扫描卡住
  • 扫描慢
  • 不确定扫到哪一步

2.3.3 -d(调试模式)

示例

nmap -d <target>

或:

nmap -d2 <target>

作用

  • 显示内部决策
  • 显示探测逻辑
  • 适合 进阶排错

-d 输出很多,新手只需知道:
“它在告诉你 Nmap 在干什么”


2.3.4 --log-errors(错误日志)

示例

nmap --log-errors 192.168.1.1

适合场景

  • 批量扫描
  • 后期分析
  • 保存错误信息

2.3.5 组合使用示例

sudo nmap -Pn -v --log-errors 192.168.1.1

教学意义:不是靠“多试几次”,而是靠“看输出找问题”。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇