ZMap 是一款由美国普林斯顿大学计算机科学系开发的、开源的、快速的互联网-wide 扫描器,它在学术界和工业界被广泛使用,尤其是在大规模网络研究和安全审计领域。

ZMap 是什么?
ZMap 是一个大规模、高速、轻量级的网络扫描工具,它主要用于在短时间内向整个互联网或大规模 IP 地址范围发送特定的网络数据包(如 TCP SYN 包、UDP 包、ICMP 包等),并收集响应。
它的核心设计目标是速度和规模,能够在短短几分钟内扫描整个 IPv4 地址空间。
ZMap 的核心特点与优势
a. 极致的速度
ZMap 的速度是其最显著的特点,通过以下技术实现:
- 内核旁路: 它直接在 Linux 内核的网络协议栈层面进行数据包的发送和接收,绕过了传统用户态网络库(如 libpcap/SOCK_RAW)带来的性能开销。
- 零拷贝: 在数据包处理过程中,尽量减少数据在内核空间和用户空间之间的复制。
- 高度优化的代码: 使用 C 语言编写,并针对性能进行了深度优化。
b. 轻量级与低资源消耗
与 Nmap 等功能全面的扫描器相比,ZMap 非常轻量,它专注于“发送”和“接收”这两个核心动作,不包含端口识别、服务版本探测、脚本扫描等复杂功能,这使得它可以在一台普通的机器上,以极低的 CPU 和内存占用完成海量 IP 的扫描。

c. 简单易用
ZMap 的命令行接口非常简洁,其基本语法是 zmap [扫描选项] [输出选项],用户只需指定要扫描的端口、要发送的包类型、输出文件等,就可以开始扫描。
b. 合规性与道德考量
ZMap 的设计者非常清楚大规模扫描的敏感性,它在工具中内置了严格的速率限制和黑名单机制,旨在帮助用户负责任地使用该工具,避免对网络造成冲击。
- 速率限制: 用户可以设置每秒发送的数据包数量,防止网络拥塞。
- 排除列表: ZMap 默认会扫描一个公开的排除列表,其中包含不希望被扫描的网络范围(如
.arpa域、RFC 1918 私有地址等),用户也可以自定义自己的排除列表。
ZMap 与 Nmap 的对比
这是一个非常常见的问题,两者并非替代关系,而是互补关系。
| 特性 | ZMap | Nmap |
|---|---|---|
| 核心目标 | 速度与规模,面向整个互联网的普查式扫描 | 功能与深度,针对特定目标的详细扫描 |
| 扫描类型 | 主要支持TCP Connect、TCP SYN、UDP、ICMP | 支持所有主流扫描类型(TCP SYN/Connect/ACK/FIN, UDP, ICMP, ARP, SCTP等) |
| 功能丰富度 | 非常有限,只负责发包和收包 | 极其丰富,包括端口扫描、服务/版本探测、操作系统检测、脚本引擎、路由跟踪等 |
| 资源消耗 | 极低 | 较高,尤其是在进行深度扫描时 |
| 典型工作流 | 用 Zmap 快速扫描整个互联网,找出开放了 80 端口的 IP。 2. 从结果中随机抽样 1000 个 IP。 3. 用 Nmap 对这 1000 个 IP 进行详细的 OS 和服务版本探测。 |
确定一个具体的扫描目标(如 example.com 或 168.1.0/24)。 2. 使用 Nmap 对其进行全面、深入的扫描。 |
| 适用场景 | 大规模研究、互联网普查、僵尸网络检测、DDoS 缓解 | 网络发现、安全审计、漏洞评估、主机探测 |
一句话总结:Zmap 用来“找鱼群”(发现大量目标),Nmap 用来“解剖鱼”(分析单个目标)。

ZMap 的典型工作流程
-
明确扫描目标与目的:
- 目标: 是扫描整个互联网,还是特定的 IP 段(如
0.0.0/8)? - 目的: 是找出开放了 Web 服务的服务器,还是响应了 ICMP Echo 请求的设备?
- 目标: 是扫描整个互联网,还是特定的 IP 段(如
-
选择扫描类型:
-p 80: 扫描 TCP 80 端口(Web 服务)。-p 53: 扫描 UDP 53 端口(DNS 服务)。--probe-module=syn: 使用 TCP SYN 扫描(需要 root 权限)。--probe-module=connect: 使用 TCP Connect 扫描(不需要 root,但速度较慢)。
-
配置扫描参数(负责任地使用):
--rate=10000: 设置发送速率为 10000 包/秒。--exclude-file=my-exclude.txt: 指定自定义的排除列表。--output-fields=saddr,ttl: 指定输出字段,如源 IP 和 TTL 值。
-
执行扫描并收集结果:
- 扫描结果通常以 CSV 格式输出到标准输出,方便后续用
grep,awk,Python等工具进行处理。
- 扫描结果通常以 CSV 格式输出到标准输出,方便后续用
实践示例
示例 1:扫描整个互联网,找出所有开放了 TCP 80 端口的 Web 服务器,并将结果保存到 web_servers.csv。
# 需要 root 权限进行 SYN 扫描 sudo zmap -p 80 --probe-module=syn --output-fields=saddr,ttl --output-file=web_servers.csv
示例 2:扫描本地 /24 网段,找出所有响应了 ICMP Echo 请求的设备。
# ICMP 扫描通常不需要 root zmap --probe-module=icmp --target-port=0 --output-fields=saddr --output-file=live_hosts.txt 192.168.1.0/24
示例 3:对 ZMap 的结果进行二次分析
假设我们得到了一个包含开放了 22 端口(SSH)的服务器列表 ssh_servers.csv,我们可以从中抽取一部分,用 Nmap 进行详细扫描。
# 从 ZMap 结果中随机抽取 100 行 shuf -n 100 ssh_servers.csv | cut -d',' -f1 > targets.txt # 使用 Nmap 对这些目标进行详细扫描 nmap -iL targets.txt -sV -O -oA ssh_detailed_scan
重要注意事项与法律/道德风险
⚠️ 极其重要:
- 授权是前提: 绝对不要在没有获得明确书面授权的情况下,对任何不属于你的网络或 IP 地址范围进行扫描,这违反了计算机犯罪法,可能导致严重的法律后果。
- 网络影响: 即使是低速扫描,也可能对目标网络或服务器造成压力,高频率的扫描会被防火墙和 IDS/IPS 视为攻击行为,导致你的 IP 被封禁。
- 日志记录: 几乎所有的网络设备和服务器都会记录扫描活动,你的扫描行为会被留下痕迹。
- 仅在测试环境使用: 初学者应在自己搭建的、完全隔离的虚拟网络环境中学习和使用 ZMap,例如使用
168.x.x或x.x.x等私有 IP 段。
ZMap 是一个功能强大且专业的工具,是网络研究人员和安全专家的“利器”,但它的强大也意味着巨大的责任,使用者必须具备高度的专业素养和道德意识。
