需求:获取局域网所有设备的IP地址。
本文记录围绕上述需求学到的技术。
Nmap
官网,Network Mapper缩写,C/C++/Lua等语言实现、开源(GitHub,13.5K Star,2.9K Fork)跨平台网络扫描和安全审计工具,支持主机发现、端口探测、服务识别、操作系统类型和版本识别、漏洞检测等功能。
功能
目标指定
- 基础目标格式
支持主机名、IP、网段等多种格式,灵活适配不同扫描场景:
单个目标:scanme.nmap.org(域名)、192.168.199.107(IP)
网段目标:microsoft.com/24(CIDR格式)、192.168.0.1;10.0.0-255.1-254(分号分隔多网段)
范围目标:192.168.199.1-100(IP范围)
- 目标筛选参数
| 参数 | 功能描述 | 实战示例 |
|---|---|---|
-iL <inputfilename> |
从文件读取目标列表(每行一个目标) | nmap -iL targets.txt(targets.txt含192.168.199.1、scanme.nmap.org、(https://scanme.nmap.org/ "scanme.nmap.org")等) |
-iR <num hosts> |
随机选择指定数量的目标扫描 | nmap -iR 50 -p 80,随机扫描50个主机的80端口,适合批量探测 |
--exclude <host1,host2> |
排除指定目标(支持单个/多个/网段) | nmap 192.168.199.0/24 --exclude 192.168.199.1,192.168.199.107(排除网关和特定主机) |
--excludefile <exclude_file> |
从文件读取需排除的目标 | nmap 192.168.199.0/24 --excludefile exclude.txt,exclude.txt含需跳过的IP |
主机发现
用于判断目标主机是否在线,避免扫描离线主机浪费时间,官方帮助多种探测方式:
| 参数 | 功能描述 | 适用场景 | 示例 |
|---|---|---|---|
-sL |
仅列出目标列表,不探测存活 | 验证目标范围是否正确(如避免误扫外部网络) | nmap -sL 192.168.199.0/24 |
-sn |
Ping扫描(跳过端口扫描) | 迅速排查局域网在线设备 | nmap -sn 192.168.199.0/24(显示所有Status: Up的主机) |
-Pn |
跳过主机发现,默认所有目标在线 | 目标开启防火墙屏蔽Ping(如服务器),需强制扫描端口 | nmap -Pn 192.168.199.107 -p 22 |
-PS [portlist] |
TCP SYN探测(默认443端口) | 绕过拦截ICMP的防火墙 | nmap -PS22,80 192.168.199.107(用22、80端口SYN包探测存活) |
-PA [portlist] |
TCP ACK探测(默认80端口) | 检测对ACK包有响应的主机 | nmap -PA443 192.168.199.107 |
-PU [portlist] |
UDP探测(默认40125端口) | 探测路由器、IoT设备(多响应UDP包) | nmap -PU53 192.168.199.1(用DNS 53端口探测网关) |
-PY [portlist] |
SCTP探测 | 针对支持SCTP协议的主机(如电信设备) | nmap -PY3847 192.168.199.200 |
-PE |
ICMP Echo请求(类似环境ping) | 常规网络环境,准确性高 | nmap -PE 192.168.199.0/24 |
-PP |
ICMP时间戳请求 | 部分禁止Echo请求的环境(如企业防火墙) | nmap -PP 192.168.199.107 |
-PM |
ICMP子网掩码请求 | 探测路由器等网络设备(返回子网掩码信息) | nmap -PM 192.168.199.1 |
-PO [protocol list] |
IP协议探测(支持ICMP/TCP/UDP) | 复杂网络,多协议组合验证存活 | nmap -POicmp,tcp 192.168.199.107 |
--traceroute |
追踪到目标的路由路径 | 否在局域网内)就是排查网络跳转节点(如判断目标 | nmap -sn --traceroute 192.168.199.107 |
域名解析控制
| 参数 | 功能描述 | 适用场景 | 示例 |
|---|---|---|---|
-n |
禁用DNS解析(不获取主机名,提速) | 网络环境中DNS服务器不稳定或响应缓慢,希望快速结束扫描;对IP地址进行批量扫描,无需获取主机名信息的场景 | nmap -n 192.168.199.0/24 |
-R |
强制DNS解析(所有目标获取主机名) | 需准确获取目标主机名称,以便进一步定位或识别主机身份;在安全审计或网络管理中,需要将IP与主机名对应记录的场景 | nmap -R 192.168.199.107 |
--dns-servers <serv1,serv2> |
指定自定义DNS(如谷歌8.8.8.8) | 系统默认DNS解析不准确或无法解析目标;需绕过本地DNS服务器,使用更可靠的公共DNS服务器进行解析 | nmap --dns-servers 8.8.8.8,114.114.114.114 scanme.nmap.org |
--system-dns |
应用系统默认DNS解析 | 对解析结果依赖本地网络配置;在信任本地DNS服务器且网络环境稳定,希望使用默认配备快速执行扫描的场景 | nmap --system-dns 192.168.199.107 |
扫描技术
根据协议和探测方式分类,适配不同端口类型和防火墙环境:
- TCP扫描(最常用)
| 参数 | 扫描类型 | 原理 | 适用场景 | 示例 |
|---|---|---|---|---|
-sS |
TCP SYN扫描(半开扫描) | 发送SYN包,收到SYN-ACK即判定端口开放,不建立完整连接 | 隐蔽性高,避免目标日志记录完整连接 | nmap -sS 192.168.199.107 -p 22 |
-sT |
TCP Connect扫描(全连接) | 建立完整TCP三次握手 | 无raw socket权限(如普通用户),兼容性好 |
nmap -sT 192.168.199.107 -p 80 |
-sA |
TCP ACK扫描 | 发送ACK包,通过RST包判断端口状态 | 探测防火墙规则(如哪些端口被过滤) | nmap -sA 192.168.199.107 -p 1-1000 |
-sW |
TCP Window 扫描 | 基于TCP窗口大小判断端口开放 | 补充-sA扫描,提高准确性(仅对部分体系有效) |
nmap -sW 192.168.199.107 |
-sM |
TCP Maimon扫描 | 发送FIN/ACK包,利用系统响应差异 | 部分Linux系统可识别,隐蔽性较好 | nmap -sM 192.168.199.107 |
-sN |
TCP Null扫描 | 不设置TCP标志位,利用RFC 793漏洞 | 对遵循RFC的架构有效(如BSD) | nmap -sN 192.168.199.107 |
-sF |
TCP FIN扫描 | 仅设置FIN标志位 | 规避基础端口扫描检测 | nmap -sF 192.168.199.107 |
-sX |
TCP Xmas扫描 | 设置FIN、PSH、URG标志位 | 探测对标志位敏感的防火墙 | nmap -sX 192.168.199.107 |
--scanflags <flags> |
自定义TCP标志位 | 手动组合标志(如SYN+FIN) | 高级场景,定制扫描特征 | nmap --scanflags SYN,FIN 192.168.199.107 |
- 其他协议扫描
| 参数 | 扫描类型 | 功能描述 | 示例 |
|---|---|---|---|
-sU |
UDP扫描 | 探测UDP端口(如DNS 53、SNMP 161),耗时较长 | nmap -sU 192.168.199.1 -p 53,161 |
-sO |
IP协议扫描 | 探测目标支持的IP协议(如ICMP、TCP、UDP) | nmap -sO 192.168.199.107 |
-sY |
SCTP INIT扫描 | 类似TCP SYN扫描,针对SCTP协议端口 | nmap -sY 192.168.199.200 -p 3847 |
-sZ |
SCTP COOKIE-ECHO扫描 | 基于SCTP COOKIE机制,隐蔽性高 | nmap -sZ 192.168.199.200 |
-b <FTP relay> |
FTP弹跳扫描 | 通过FTP代理扫描目标,隐藏真实 IP | nmap -b ftp://user:pass@192.168.199.5 192.168.199.107(需FTP服务器支持) |
- 空闲扫描(高级隐蔽)
| 参数 | 功能描述 | 示例 |
|---|---|---|
-sI <zombie[:port]> |
利用僵尸主机扫描,隐藏真实IP | nmap -sI 192.168.199.6:80 192.168.199.107(用192.168.199.6作为僵尸主机) |
端口设置与扫描顺序
- 端口指定与过滤
| 参数 | 功能描述 | 示例 |
|---|---|---|
-p <port ranges> |
指定扫描端口(拥护TCP/UDP/SCTP区分) | -p 22(TCP 22)、-p U:53,T:80-443,S:9(UDP 53 + TCP 80-443 + SCTP 9) |
--exclude-ports <port ranges> |
排除指定端口 | nmap -p 1-1000 --exclude-ports 22,80 192.168.199.107 |
-F |
快速扫描(仅预设100个常用端口) | nmap -F 192.168.199.107(适合快速排查常见服务) |
--top-ports <number> |
扫描指定数量的常用端口 | nmap --top-ports 200 192.168.199.107(扫描前200个高频端口) |
--port-ratio <ratio> |
扫描使用频率高于指定比例的端口 | nmap --port-ratio 0.2 192.168.199.107(扫描使用频率>20%的端口) |
- 扫描顺序控制
| 参数 | 功能描述 | 示例 |
|---|---|---|
-r |
按端口号顺序扫描(默认随机) | nmap -r 192.168.199.107 -p 1-100(按 1→2→...→100 顺序扫描) |
| (默认) | 随机扫描端口(降低扫描行为特征) | nmap 192.168.199.107 -p 1-1000 |
服务与版本探测
精准识别端口对应的服务类型与版本,协助判断漏洞风险:
| 参数 | 功能描述 | 示例 |
|---|---|---|
-sV |
启用服务版本探测 | nmap -sV 192.168.199.107(显示如22/tcp open ssh OpenSSH 8.0) |
--version-intensity <level> |
设置探测强度(0-9,默认5) | nmap -sV --version-intensity 9 192.168.199.107(最精准,耗时最长,适合深度探测) |
--version-light |
轻量探测(强度2,快速) | nmap -sV --version-light 192.168.199.0/24(批量扫描时提速) |
--version-all |
全量探测(强度9,尝试所有探针) | nmap -sV --version-all 192.168.199.107(对服务版本识别有严格要求时使用) |
--version-trace |
显示版本探测的详细过程(调试用) | nmap -sV --version-trace 192.168.199.107(查看探测包交互细节) |
脚本扫描
基于Nmap脚本引擎(NSE),扩展扫描效果(漏洞检测、信息收集等),官方内置数百个脚本:
| 参数 | 功能描述 | 示例 |
|---|---|---|
-sC |
运行默认脚本集(等价于--script=default) |
nmap -sC 192.168.199.107(基础漏洞检测 + 服务配置查看) |
--script=<scripts> |
指定脚本 / 脚本类别(逗号分隔) | --script ssh-brute(SSH 弱密码破解)、--script vuln(所有漏洞检测脚本)、--script http-enum,http-vuln-cve2021-41773(HTTP 目录枚举 + Apache 漏洞检测) |
--script-args <n1=v1,n2=v2> |
给脚本传递参数 | nmap --script http-brute --script-args userdb=user.txt,passdb=pass.txt 192.168.199.107(指定爆破的用户名 / 密码字典) |
--script-args-file <filename> |
从文件读取脚本参数 | nmap --script http-brute --script-args-file brute-args.txt 192.168.199.107 |
--script-trace |
显示脚本发送 / 接收的所有数据(调试) | nmap --script http-enum --script-trace 192.168.199.107(查看HTTP请求/响应细节) |
--script-updatedb |
更新脚本数据库(新增脚本后执行) | nmap --script-updatedb(确保NSE识别新添加的脚本) |
--script-help <scripts> |
查看脚本帮助信息 | nmap --script-help ssh-brute(了解ssh-brute脚本的用法和参数) |
操作系统探测
通过分析目标主机的网络特征,判断其运行的操作系统类型与版本的技术。主要依托TCP/IP协议栈指纹(如TTL值、窗口大小)、默认端口开放情况、服务响应信息等,精准识别Windows、Linux等架构及具体版本,为网络管理(资产清查)、安全测试(漏洞匹配)献出核心依据,是网络运维与安全防护的基础步骤。
| 参数 | 功能描述 | 使用场景 | 示例 |
|---|---|---|---|
-O |
启用操作系统检测 | 当得了解目标主机的操作系统类型,以便进一步制定攻击策略或系统配置时运用 | nmap -O 192.168.1.100 |
--osscan-limit |
将操作系统检测限制在可能的目标上 | 扫描大量主机时,为提高效率,仅对疑似存在主机的目标进行操作系统检测 | nmap --osscan-limit 192.168.1.0/24 |
--osscan-guess |
更积极地猜测操作系统 | 当常规检测难以确定操作系统类型,需要更激进的推测时使用 | nmap --osscan-guess 192.168.1.120 |
时间与性能
用于控制扫描的时间节奏与运行效率,平衡扫描速度与隐蔽性/资源占用,适配不同网络环境与扫描需求。
| 参数 | 功能描述 | 使用场景 | 示例 |
|---|---|---|---|
-T<0-5> |
设置时间模板(数值越高速度越快) | 根据网络环境和扫描需求调整扫描速度,如快速扫描启用-T5,隐蔽扫描启用-T0 |
nmap -T4 192.168.1.0/24 |
--min-hostgroup/max-hostgroup <size> |
设置并行主机扫描组大小 | 扫描大量主机时,控制并行扫描的主机数量,避免网络拥堵 | nmap --min-hostgroup 10 --max-hostgroup 50 192.168.1.0/16 |
--min-parallelism/max-parallelism <numprobes> |
控制探测并行度 | 调整探测请求的并行数量,平衡扫描速度和资源消耗 | nmap --min-parallelism 10 --max-parallelism 50 target.com |
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time> |
指定探测往返时间 | 网络状况不佳时,调整探测响应时间阈值,防止误判 | nmap --min-rtt-timeout 500ms --max-rtt-timeout 2s 192.168.1.1 |
--max-retries <tries> |
限制端口扫描探测重传次数 | 避免因网络波动导致过多的重复探测请求 | nmap --max-retries 3 192.168.1.0/24 |
--host-timeout <time> |
设置目标主机超时时间 | 长时间无响应的主机,自动放弃扫描,提高整体效率 | nmap --host-timeout 10m 192.168.1.0/16 |
--scan-delay/--max-scan-delay <time> |
调整探测间隔时间 | 为降低扫描对目标网络的影响,增加探测间隔 | nmap --scan-delay 1s 192.168.1.10 |
--min-rate <number> |
限制每秒发送数据包的最小速率 | 确保扫描在一定速度下进行,防止速度过慢 | nmap --min-rate 100 192.168.1.0/24 |
--max-rate <number> |
限制每秒发送数据包的最大速率 | 避免扫描流量过大引起网络拥塞或被防火墙发现 | nmap --max-rate 500 192.168.1.0/16 |
防火墙、IDS绕过与欺骗
防火墙(FIREWALL)和入侵检测系统(IDS)的绕过与欺骗(EVASION AND SPOOFING)技术,旨在通过各种手段绕过防火墙的访问控制和IDS的检测机制
| 参数 | 功能描述 | 使用场景 | 示例 |
|---|---|---|---|
-f; --mtu <val> |
对数据包进行分片(可指定 MTU 值) | 绕过防火墙对完整数据包的检测规则 | nmap -f 192.168.1.100或nmap --mtu 1400 192.168.1.1 |
-D <decoy1,decoy2[,ME],...> |
采用诱饵 IP 隐藏扫描行为 | 隐藏真实扫描源 IP,防止被目标系统追踪 | nmap -D 192.168.1.10,192.168.1.20,ME 192.168.1.50 |
-S <IP_Address> |
伪装源地址 | 模拟其他 IP 地址进行扫描,实现匿名扫描 | nmap -S 10.0.0.1 192.168.1.100 |
-e <iface> |
使用指定网络接口 | 当主机有多网卡时指定特定网卡进行扫描 | nmap -e eth0 192.168.1.0/24 |
-g/--source-port <portnum> |
使用指定端口号作为源端口 | 绕过防火墙对特定源端口的过滤规则 | nmap -g 53 192.168.1.10或nmap --source-port 80 192.168.1.1 |
--proxies <url1,[url2],...> |
通过 HTTP/SOCKS4 代理中继连接 | 隐藏真实 IP 地址,绕过网络访问限制 | nmap --proxies http://proxy1.example.com,http://proxy2.example.com 192.168.1.100 |
--data <hex string> |
在发送的数据包中附加自定义十六进制负载 | 自定义扫描特征,绕过基于特征的检测 | nmap --data "01020304" 192.168.1.1 |
--data-string <string> |
在发送的数据包中附加自定义ASCII字符串 | 同样用于自定义扫描特征 | nmap --data-string "testscan" 192.168.1.10 |
--data-length <num> |
在发送的数据包中附加随机数据 | 增加数据包长度,干扰检测机制 | nmap --data-length 100 192.168.1.0/24 |
--ip-options <options> |
发送带有指定IP选项的数据包 | 进行特定的IP协议测试或绕过防护机制 | nmap --ip-options "rr" 192.168.1.1 |
--ttl <val> |
设置IP生存时间字段 | 伪装数据包的路由特征,绕过基于TTL的检测 | nmap --ttl 64 192.168.1.100 |
--spoof-mac <mac address/prefix/vendor name> |
伪装MAC地址 | 绕过基于MAC地址的访问控制或检测 | nmap --spoof-mac 00:11:22:33:44:55 192.168.1.1或nmap --spoof-mac Apple 192.168.1.10 |
--badsum |
发送带有虚假TCP/UDP/SCTP校验和的数据包 | 干扰基于校验和的检测机制 | nmap --badsum 192.168.1.0/24 |
输出控制
管理扫描结果的输出形式、保存方式与展示内容,方便用户查看、分析或后续二次处理扫描数据。
| 参数 | 功能描述 | 使用场景 | 示例 |
|---|---|---|---|
-oN/-oX/-oS/-oG <file> |
分别以普通、XML、s | <rIpt kIddi3和 Grepable 格式输出扫描结果到指定文件 |
根据后续分析需求选择合适的输出格式,如XML格式便于解析 |
-oA <basename> |
同时以三种主要格式输出结果 | 方便以多种方式查看和分析扫描结果 | nmap -oA myscan 192.168.1.0/24 |
-v |
增加详细程度(可使用-vv或更多获取更多信息) | 需要查看更详细的扫描过程和结果信息时使用 | nmap -vv 192.168.1.1 |
-d |
增加调试级别(可使用-dd或更多获取更多信息) | 排查扫描过程中的障碍,获取调试信息 | nmap -dd 192.168.1.10 |
--reason |
显现端口处于特定状态的原因 | 分析端口状态时,了解导致该状态的具体原因 | nmap --reason 192.168.1.100 |
--open |
仅显示开放(或可能开放)的端口 | 快速查看目标主机开放的端口,提高效率 | nmap --open 192.168.1.0/24 |
--packet-trace |
显现所有发送和接收的数据包 | 分析网络通信过程,排查问题 | nmap --packet-trace 192.168.1.1 |
--iflist |
打印主机接口和路由信息(用于调试) | 检查网络接口和路由配置是否正确 | nmap --iflist |
--append-output |
将结果追加到指定输出文件,而不是覆盖 | 多次扫描同一目标并保留所有结果时使用 | nmap --append-output -oN scan.log 192.168.1.10 |
--resume <filename> |
恢复中断的扫描 | 扫描过程因各种原因中断后,继续未完成的扫描 | nmap --resume incomplete_scan.nmap 192.168.1.0/24 |
--noninteractive |
禁用通过键盘进行运行时交互 | 自动化脚本执行扫描,避免人工干预 | nmap --noninteractive 192.168.1.100 |
--stylesheet <path/URL> |
指定 XSL 样式表将 XML 输出转换为 HTML | 将 XML 格式的扫描结果转换为便于查看的 HTML 页面 | nmap --stylesheet mystyle.xsl -oX scan.xml -oA myscan 192.168.1.1 |
--webxml |
从Nmap.Org引用样式表以获得更便携的 XML | 确保 XML 输出符合标准格式,便于在不同环境使用 | nmap --webxml -oX scan.xml 192.168.1.100 |
--no-stylesheet |
防止将XSL样式表与XML输出关联 | 不需要对XML输出进行样式转换时运用 | nmap --no-stylesheet -oX scan.xml 192.168.1.1 |
辅助操作
MISC是Nmap中整合非核心但实用功能的模块,涵盖扫描环境适配、权限控制、版本查询等辅助运行,用于补充核心扫描特性,适配特殊场景需求。
| 参数 | 功能描述 | 使用场景 | 示例 |
|---|---|---|---|
-6 |
启用 IPv6 扫描 | 扫描 IPv6 地址的主机 | nmap -6 2001:db8::1 |
-A |
启用操作系统检测、版本检测、脚本扫描和路由追踪 | 进行全面的主机探测,获取详细信息 | nmap -A 192.168.1.100 |
--datadir <dirname> |
指定自定义 Nmap 数据文件位置 | 当默认数据文件位置不可用时,指定新路径 | nmap --datadir /custom/nmap/data 192.168.1.1 |
--send-eth/--send-ip |
利用原始以太网帧或 IP 数据包发送 | 根据网络环境选择合适的数据包发送方式 | nmap --send-eth 192.168.1.10或nmap --send-ip 192.168.1.1 |
--privileged |
假设用户具有完全权限 | 当用户实际拥有完全权限,加快扫描速度 | nmap --privileged 192.168.1.0/24 |
--unprivileged |
假设用户缺少原始套接字权限 | 用户权限受限情况下进行扫描 | nmap --unprivileged 192.168.1.100 |
-V |
打印版本号 | 查看当前 Nmap 软件的版本信息 | nmap -V |
-h |
打印帮忙摘要页面 | 查看 Nmap 命令的利用帮助 | nmap -h |
扫描示例
bash
nmap -v -A scanme.nmap.org
nmap -v -sn 192.168.0.0/16 10.0.0.0/8
nmap -v -iR 10000 -Pn -p 80
实战
打开官网,选择对应的操作系统,如Windows则下载nmap-7.991-setup.exe文件安装,双击安装即可。
下图可看到围绕着Nmap一系列工具:Npcap、Ncat、Nping、Ndiff、Zenmap。

安装成功后,将安装目录如D:\Program\Nmap添加到环境变量,则可在任何位置,打开命令行使用nmap命令:nmap -sn 192.168.4.0/24
初步能满足,期望效果:

Npcap
专为Windows开发的一款网络抓包SDK,提供被应用程序调用的库文件和系统驱动程序。
功能:
- 可以得到原始(raw)网络数据,即未经过 TCP/IP 协议栈的数据,也就是网卡收到的数据
- 设置接收过滤器,这样收到的数据就是我们感兴趣的数据,比如某个端口的数据
- 发送原始(raw)网络数据的功能
Zenmap
Nmap官方推出、免费开源跨平台(Linux、Windows、Mac OS X、BSD等)GUI应用程序,旨在让Nmap对初学者更友好,也为经验丰富的Nmap用户提供高级功能。
常用扫描可保存为配置文件,以便于重复运行。命令创建器允许交互式创建Nmap命令行。扫描结果可保存并稍后查看。保存的扫描结果可相互比较,以查看它们之间的差异。最近扫描的结果存储在可搜索的数据库中。
实战
在Windows下安装Zenmap时,需先安装Npcap。
上面安装Nmap时,默认勾选即安装Zenmap

一看图标就知道是Python GUI程序,源码也在Nmap下
