nmap —— 端口、服务与主机存活探测

运维工具手册 02-进程与网络诊断 4.7 KB 原文

nmap —— 端口、服务与主机存活探测

分类:02 进程与网络诊断 适用:Linux / macOS / Windows 一句话:网络侧的"体检仪"。资产梳理、验证防火墙、确认服务暴露面都靠它。

⚠️ 合规前提:只对自有资产、已获书面授权的目标扫描。未经授权扫描他人网络在多数地区属违法行为,且会触发对方安全告警。生产环境扫描前通知安全团队。

1. 它解决什么问题

  • 这台机器到底开了哪些端口?跑的是什么服务、什么版本?
  • 防火墙规则改完,外部真的访问不到了吗?
  • 网段里还有哪些主机活着?
  • 某个 CVE 影响的组件,内网有多少台在用。

2. 安装

apt install -y nmap
dnf install -y nmap
apk add nmap nmap-scripts

3. 四种扫描方式

方式 命令 原理 适用
TCP SYN -sS 半开扫描,不回 RST 默认(需 root),快且隐蔽
TCP connect -sT 完整三次握手 无 root 时,易被日志记录
UDP -sU 发 UDP 包看 ICMP 端口不可达 DNS/SNMP/NTP 等
主机发现 -sn 只判断存活,不扫端口 网段清点

4. 最常用的十条

nmap -sn 10.0.0.0/24                     # 存活主机
nmap -sS -Pn -p 22,80,443 10.0.0.5       # 指定端口
nmap -sS -Pn -p- 10.0.0.5                # 全端口 1-65535(慢)
nmap -sS -Pn --top-ports 1000 10.0.0.5   # 最常见的 1000 个端口
nmap -sV -Pn -p 80,443 10.0.0.5          # 服务与版本识别
nmap -O -Pn 10.0.0.5                     # 操作系统猜测
nmap -A -Pn -T4 10.0.0.5                 # 激进:版本+OS+脚本+traceroute
nmap -sU -Pn --top-ports 50 10.0.0.5     # UDP 常用端口
nmap -sS -Pn -p 443 --script ssl-cert 10.0.0.5      # 取证书
nmap -sS -Pn -p 1-1000 -oX scan.xml 10.0.0.0/24     # 输出 XML

5. 参数详解

端口选择

-p 22,80,443          # 指定
-p 1-1024             # 范围
-p-                   # 全部端口
-p U:53,T:80          # 分别指定 UDP/TCP
--top-ports 100       # 按频率取前 N
--exclude-ports 22    # 排除
-F                    # 快速模式(100 个常用端口)

时序与性能

参数 含义 建议
-T0 ~ -T5 时序模板 -T4 内网常用;-T5 易丢包误判
--min-rate 1000 每秒最少发包 大网段提速
--max-retries 1 最大重试 降低等待
--host-timeout 30s 单主机超时 防卡死
--min-parallelism 并行探测数 谨慎使用

输出

-oN scan.txt        # 普通文本
-oX scan.xml        # XML(可被工具消费)
-oG scan.gnmap      # grep 友好
-oA report          # 同时生成三种
--open              # 只显示 open 的端口
--reason            # 显示判定依据(收到什么包)
-v / -vv            # 详细

主机发现

-Pn          # 跳过 ping,直接扫端口(目标禁 ICMP 时必加)
-PS80        # TCP SYN ping 指定端口
-PA80        # TCP ACK ping
-PE          # ICMP echo
-n           # 不做 DNS 反解
-R           # 强制反解
--dns-servers 8.8.8.8
-iL targets.txt   # 从文件读目标
--exclude 10.0.0.1,10.0.0.2

6. 输出怎么读

PORT     STATE    SERVICE     VERSION
22/tcp   open     ssh         OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
80/tcp   open     http        nginx 1.24.0
3306/tcp filtered mysql
8080/tcp closed   http-proxy
状态 含义 说明
open 端口开放且有服务 真实暴露面
closed 端口可达但无服务 主机活着,回 RST
filtered 被防火墙/安全组丢弃 无响应,最常见于云环境
unfiltered 可达但无法判断开闭 多见于 ACK 扫描
open|filtered 无法区分 UDP 扫描常见

VERSION 列只在使用 -sV 时出现,是暴露面评估的关键信息——版本号暴露本身就是风险。

7. 实战场景

7.1 验证安全组/防火墙是否真的生效

# 在外部机器扫(不要在本机扫自己)
nmap -sS -Pn -p 22,3306,6379,9200 <公网IP>

期望结果:只应出现业务端口,数据库/缓存/搜索引擎端口应为 filtered。

7.2 内网资产端口清点

nmap -sS -Pn -n -p 22,80,443,3389,6379,3306,8080 --open 10.0.0.0/24 -oG - \
  | awk '/Ports:/ {print $2, $0}' | sed 's/Ports: //'

或用 XML + 脚本汇总:

nmap -sS -Pn -n -p 22,3306,6379 --open 10.0.0.0/24 -oX /tmp/scan.xml
# 用 grep 快速提取
grep -oP '(?<=addr=")[^"]+|(?<=portid=")[^"]+' /tmp/scan.xml | paste - -

7.3 确认服务版本(暴露面评估)

nmap -sV -Pn -p 80,443,8080 --version-intensity 5 10.0.0.5

拿到版本后对照 CVE,决定升级优先级。

7.4 用 NSE 脚本做轻量检查

nmap --script-help "http-*" | head -40          # 看有哪些脚本
nmap -p 443 --script ssl-cert,ssl-enum-ciphers 10.0.0.5
nmap -p 80 --script http-headers,http-title 10.0.0.5
nmap -p 445 --script smb-vuln-ms17-010 10.0.0.0/24    # 内网漏洞排查
nmap -p 22 --script ssh-auth-methods 10.0.0.5

NSE 脚本可能触发对方 IDS,生产扫描需报备。

7.5 UDP 服务排查

nmap -sU -Pn --top-ports 20 10.0.0.5

UDP 扫描慢且不准(无响应不等于关闭),只作为线索。

8. 常见坑

  1. 不加 -Pn 会漏掉主机:目标禁 ICMP 时被判定为 down,后续端口扫描直接跳过。
  2. -sS 需要 root:普通用户会自动降级为 -sT,速度慢且留日志。
  3. filtered 不等于关闭:可能是安全组 drop,也可能是中间设备。用 --reason 看依据。
  4. -T5 数据不可信:太快会丢包,把 open 误判为 filtered。
  5. 全端口扫描很慢:公网目标 -p- 可能几十分钟,先用 --top-ports 1000 缩小范围。
  6. 云环境有流量清洗/VPC 防火墙:结果可能与实际业务表现不一致,需从多个位置验证。
  7. -O 识别不准:依赖指纹库,虚拟机和定制内核经常误判。
  8. 扫描会被记录:目标有 IDS/IPS 会告警,云厂商也可能判定为攻击行为。
  9. IPv6 需 -6:默认只扫 IPv4。
  10. 容器内扫本机:看到的是容器网络命名空间,不是宿主机端口。

9. 速查表

nmap -sn 10.0.0.0/24                      # 存活主机
nmap -sS -Pn -p 22,80,443 <ip>            # 常用端口
nmap -sS -Pn --top-ports 1000 <ip>        # 千端口
nmap -sS -Pn -p- <ip> -T4                 # 全端口
nmap -sV -Pn -p 80,443 <ip>               # 版本
nmap -A -T4 <ip>                          # 综合
nmap -sU -Pn --top-ports 50 <ip>          # UDP
nmap -p 443 --script ssl-cert <ip>        # 证书
nmap -oX out.xml --open <cidr>            # XML 输出
nmap -iL targets.txt --exclude 10.0.0.1   # 批量

# 状态:open 开放 / closed 无服务 / filtered 被拦 / open|filtered 不确定
nmap —— 端口、服务与主机存活探测 - 知识库 - 起航社区