Nmap 端口扫描:网络发现与安全审计

FreeGuideOnline 最新 2026-06-13

Nmap 端口扫描:网络发现与安全审计完全指南

什么是 Nmap ?

Nmap(Network Mapper)是一款开源的网络扫描与安全审计工具。它被全球系统管理员、渗透测试工程师及安全研究人员广泛使用,核心作用是发现网络上的主机、识别主机上开放的服务、探测操作系统以及因应开放的端口做进一步脆弱性分析

对于初学者来说,可以把 Nmap 理解为一台“网络照相机”——它能快速告诉你一个网络中有哪些设备“在线”,这些设备上哪些“门”(端口)是打开的,以及门后面大概运行着什么软件。

核心应用场景

  • 网络资产盘点:自动列出公司内网所有存活主机及其开放服务。
  • 安全基线检查:确认是否有非必要的端口对外开放。
  • 漏洞验证辅助:通过服务版本信息判断是否存在已知漏洞。
  • 合规性测试:例如 PCI DSS 要求定期对外部网络进行端口扫描。

安装 Nmap

Nmap 支持 Windows、Linux 和 macOS 等主流平台。

Linux(Debian/Ubuntu)

sudo apt update
sudo apt install nmap

Linux(RedHat/CentOS/Fedora)

sudo yum install nmap   # 或 dnf install nmap

macOS

brew install nmap

Windows

前往官方页面 https://nmap.org/download.html 下载安装包,图形化版本 Zenmap 适合不熟悉命令行的用户,本教程主要聚焦于强大的命令行接口。

安装完成后,在终端输入 nmap --version,看到版本信息即表示安装成功。


主机发现:哪些主机在线?

在执行端口扫描前,通常需要先找到网络中存活的主机。Nmap 提供了多种**主机发现(Ping 扫描)**技术。

简单 ping 扫描

-sn 参数告诉 Nmap 只进行主机发现,不进行端口扫描。

nmap -sn 192.168.1.0/24

该命令会检测 192.168.1.0 这个 24 位子网内所有 IP 是否在线。它默认发送 ICMP Echo 请求、TCP SYN 包到 443 端口、TCP ACK 包到 80 端口以及 ICMP 时间戳请求。这是一种快速且相对隐蔽的存活探测方式。

指定主机发现技术

  • -PE:使用 ICMP Echo 请求(标准 ping)。
  • -PS<端口列表>:TCP SYN Ping,发送 SYN 包到指定端口,例如 -PS80,443,22
  • -PA<端口列表>:TCP ACK Ping。
  • -PU<端口列表>:UDP Ping,向指定 UDP 端口发送空报文,期望触发 ICMP Port Unreachable 响应。

实战技巧:防火墙通常允许访问常见服务端口,因此对 Web 服务器使用 -PS80,443 能显著提高发现率。

nmap -sn -PS80,443,8080 10.0.0.0/24

端口扫描技术:探测开放的“门”

端口是网络通信的入口。Nmap 将端口分为 6 种状态:

  • open:端口上正有应用监听。
  • closed:可访问,但没有应用监听。
  • filtered:被防火墙、过滤规则拦截,无法判断是否开放。
  • unfiltered:端口可访问,但 Nmap 无法确定 open 还是 closed。
  • open|filtered:无法区分处于 open 还是 filtered。
  • closed|filtered:无法区分处于 closed 还是 filtered。

TCP SYN 扫描(半开放扫描,默认)

使用 -sS(管理员权限下为默认扫描方式)。它向目标端口发送 SYN 包:

  • 收到 SYN/ACK → 端口开放(open)
  • 收到 RST → 端口关闭(closed)
  • 无响应或收到 ICMP 不可达错误 → filtered

Nmap 在收到 SYN/ACK 后并不完成三次握手,直接发送 RST 中断连接,因此速度极快且不易被应用层日志记录,是最常用的扫描方式。

sudo nmap -sS 192.168.1.1

TCP Connect 扫描

-sT 方式通过调用系统 connect() 函数完成完整 TCP 三次握手,普通用户即可执行。缺点是速度较慢,且会在目标主机日志留下记录。适用于无管理员权限的环境。

nmap -sT 192.168.1.1

UDP 扫描

UDP 端口扫描比 TCP 更耗时且困难,因为 UDP 是无连接协议。使用 -sU 参数。Nmap 通常发送 UDP 数据包至目标端口:

  • 收到 ICMP Port Unreachable → 端口 closed
  • 收到 UDP 响应 → 端口 open
  • 无任何响应 → open|filtered

重要:UDP 扫描建议配合 -sV(版本探测)以增加准确度。

sudo nmap -sU 192.168.1.1

其他高级扫描方式

  • -sN:TCP Null 扫描,不设置任何标志位。
  • -sF:TCP FIN 扫描,仅设置 FIN 标志。
  • -sX:Xmas 扫描,设置 FIN、PSH、URG 标志。

这三种扫描利用了 RFC 规定:关闭的端口需回复 RST,开放的端口应忽略该畸形包。因此如果收到 RST,说明端口关闭;若无响应,则可能是开放或被过滤。它们常用于绕过某些无状态防火墙。


指定扫描端口和扫描速度

端口范围定义

  • -p 22:仅扫描 22 端口。
  • -p 1-1000:扫描 1 到 1000 端口。
  • -p-:扫描所有 65535 个端口。
  • --top-ports 100:扫描 Nmap 统计的 100 个最常见端口(默认是 1000)。
# 只扫描 80,443,8080
nmap -p 80,443,8080 192.168.1.1

# 快速扫描前 100 端口
nmap --top-ports 100 192.168.1.1

时序模板(Timing Templates)

-T 选项控制扫描的激进程度,从 0 (Paranoid) 到 5 (Insane):

  • -T0 至极慢,用于 IDS 规避。
  • -T3 默认值,平衡了速度与隐蔽性。
  • -T4 激进模式,假定网络可靠且有一定带宽,允许更快扫描。
  • -T5 疯狂模式,牺牲准确性换取速度,仅适用于高速本地网络。
nmap -T4 -p- 192.168.1.1

服务与版本探测

端口开放仅告诉你有程序在监听,但并不知道具体是什么服务。例如,端口 80 可能运行着 Apache 或 Nginx,也可能被伪装成其他应用。

使用 -sV 参数进行服务版本探测。Nmap 会发送多种探针到开放端口,分析返回的 banner 和行为特征,给出服务名称和详细版本号。

sudo nmap -sV 192.168.1.1

输出示例:

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5
80/tcp open  http    Apache httpd 2.4.41

增强扫描强度:版本探测的强度级别可通过 --version-intensity 调节(0 到 9),默认为 7。数字越大探测越细致,但也越慢越显眼。

nmap -sV --version-intensity 9 192.168.1.1

操作系统检测

Nmap 的操作系统检测(OS Fingerprinting) 基于 TCP/IP 协议栈特征指纹。它发送一系列精心构造的 TCP、UDP 和 ICMP 数据包,然后对比指纹库来判断目标操作系统类型、版本和网络距离。

使用 -O 参数:

sudo nmap -O 192.168.1.1

结合端口和服务扫描可大幅提升准确度:

sudo nmap -O -sV 192.168.1.1

如果 Nmap 无法精确匹配,可尝试 --osscan-guess 强制显示可能性最高的猜测。


Nmap 脚本引擎 (NSE)

NSE 是 Nmap 最强大的功能之一。它可以利用已有脚本完成漏洞检测、暴力破解、恶意软件发现、高级服务探测等大量任务。脚本存放在 /usr/share/nmap/scripts 目录下,类别包括 safe, intrusive, vuln, exploit 等。

基础用法

  • --script=<脚本名>:执行指定脚本。
  • --script=类别:执行某一类别的全部脚本,例如 --script=vuln 运行所有漏洞检测脚本。
  • --script-help:查看脚本帮助。

示例1:检测 HTTP 常见漏洞

nmap --script=vuln 192.168.1.1

示例2:使用特定脚本进行 Samba 共享枚举

nmap --script=smb-os-discovery,smb-enum-shares 192.168.1.1

示例3:执行暴力破解检查(需谨慎,可能触发锁定)

nmap --script=ssh-brute 192.168.1.1

传递脚本参数

许多脚本支持自定义参数,使用 --script-args 传递。

nmap --script=http-title --script-args=http.useragent="Mozilla" <target>

输出格式与报告

Nmap 提供多种输出选项,便于分析、存档或集成到其他工具。

  • -oN <file>:标准文本输出。
  • -oX <file>:XML 格式输出,便于程序解析。
  • -oG <file>:可 Grep 格式,便于使用 grep/awk 处理。
  • -oA <basename>:一次性输出上述三种格式(以 basename 为前缀)。

推荐做法:使用 -oA 生成全部格式。

nmap -oA scan_results 192.168.1.0/24
# 将生成 scan_results.nmap, scan_results.xml, scan_results.gnmap

实战示例组合

1. 完整的内网存活与开放端口扫描

sudo nmap -sn 10.0.0.0/24 -oN live_hosts.txt
sudo nmap -sS -p- -T4 -oA full_scan 10.0.0.1-254

先快速发现存活主机,再对全部主机进行全端口 SYN 扫描。

2. 针对 Web 服务器的深度探测

sudo nmap -sV -sC -O -p80,443,8080,8443 <target>

-sC 等价于 --script=default,运行默认安全脚本集合,能提取 HTTP 标题、服务器版本、SSL 证书信息等。

3. 隐蔽扫描并绕过防火墙

sudo nmap -sS -T2 -f --data-length 24 -D RND:5 <target>
  • -f:将 TCP 头分段(fragment),绕过简单包过滤。
  • --data-length 24:在每个包尾部附加 24 字节随机数据,迷惑基于包长匹配的规则。
  • -D RND:5:使用 5 个随机诱饵 IP 混淆真实扫描源。

4. 快速检查 Top 20 端口与服务版本

轻量级的日常巡检命令:

nmap --top-ports 20 -sV -O --osscan-guess -T4 <target>

法律与道德边界

Nmap 是一把双刃剑。未经授权扫描他人网络、主机是违法行为,可能触犯《网络安全法》等相关法规。务必只在以下环境中使用:

  • 自有设备或网络;
  • 获得明确书面授权的渗透测试项目;
  • 公开漏洞奖励计划(Bug Bounty)允许的目标。

始终遵循“先授权,再扫描”的铁律。


下一步学习

  • 阅读官方《Nmap Network Scanning》书籍(在线版免费)。
  • 研究 /usr/share/nmap/scripts/script.db 内成百上千的脚本。
  • 学习结合 unpwdb 进行常见凭证字典突破。
  • 探索 ncatndiff 等配套工具,用于后持续监控与差分分析。

Nmap 不仅仅是一个端口扫描器,它已是网络探测领域的准标准语言。掌握它的原理与技巧,将使你在网络管理与安全领域游刃有余。