【安全开发】Nmap端口发现技术详解(一)

目录

  • 一、端口扫描的基础知识
    • [Open 状态](#Open 状态)
    • [Closed 状态](#Closed 状态)
    • [Filtered 状态](#Filtered 状态)
    • [Unfiltered 状态](#Unfiltered 状态)
    • [Open|Filtered 状态](#Open|Filtered 状态)
    • [Closed|Filtered 状态](#Closed|Filtered 状态)
  • [二、Nmap 端口扫描方式](#二、Nmap 端口扫描方式)
    • [SYN 扫描 - TCP 半连接扫描](#SYN 扫描 - TCP 半连接扫描)
    • [Connect 扫描 - TCP 全连接扫描](#Connect 扫描 - TCP 全连接扫描)
    • [ACK 半连接扫描 - TCP 半连接扫描](#ACK 半连接扫描 - TCP 半连接扫描)
    • [TCP 窗口扫描](#TCP 窗口扫描)
    • [TCP Maimon 扫描](#TCP Maimon 扫描)
    • [TCP 空扫描](#TCP 空扫描)
    • [TCP FIN 扫描](#TCP FIN 扫描)
    • [TCP Xmas 扫描](#TCP Xmas 扫描)
    • 网络协议扫描
    • [UDP 扫描](#UDP 扫描)
    • 其他端口扫描

一、端口扫描的基础知识

Nmap 对于端口的状态给出了 6 种不同的状态描述:

Open 状态

  • 表示有程序正在监控,接收TCP连接或UDP数据包。TCP的开放状态很好判断,直接有syn + ack返回即开放(有时端口被tcp wrapper(tcpd)监听,然后做转发)。UDP的开放状态不好判断,按标准RFC792来看,如果回应了 icmp port unreachable(type3, code3),则表示UDP端口一定是关闭的。因为UDP连接是无连接的,所以一般情况下不会回应,除非发送对应服务的payload,如果有对应数据返回,则UDP端口开放,否则不开放。

Closed 状态

  • 关闭的端口仍然可以访问(可以接收并响应 Nmap 探测包),但没有任何应用程序监听该端口。它们有助于显示主机是否在某个 IP 地址上运行(主机发现或 ping 扫描),以及作为操作系统检测的一部分。
  • TCP:SYN 回应RST的包
  • UDP:回应icmp port unreachable(type3, code3)

Filtered 状态

  • Nmap 无法确定端口是否开放,因为数据包过滤阻止了其 Nmap探测包到达该端口。这种过滤可能来自专用防火墙设备、路由器规则或主机防火墙软件。有时,它们会返回 icmp port unreachable(type3, code3)。收到ICMP目的不可达的包(type3,code1,2,3,9,10,13,UDP协议type3, code3除外),表示网络流量被屏蔽/过滤(参考ICMP协议)。常见是被防火墙或网络策略(NACL)阻断或因网络质量不好导致。大量的filtered会导致 Nmap不断重试,降低扫描效率。

Unfiltered 状态

  • 端口可访问(**注意,端口可访问不代表端口是开放还是关闭,如RST),但无法确定其是开放还是关闭。只有ACK扫描才会出现这种状态,可以用windows scan, syn, fin扫描来进一步确认其状态。

Open|Filtered 状态

  • 当无法确定其是开放或是过滤状态的时候,比如开放的端口不响应(典型的就是不带payload的UDP探测)。不响应说明探测包被过滤、丢弃或引起了其它响应。如UDP、IP协议、FIN、NULL、XMAS扫描经常会引发此现象。

Closed|Filtered 状态

  • Nmap不能确定该端口是关闭的还是被过滤的。它只可能出现在IP ID Idle扫描中

【安全开发】Nmap主机探测技术详解(一) 中我们已经知道,nmap [target] 会默认执行的动作如下:

    1. 向目标IP发送一个ICMP Echo Request (type 8);
    1. 向目标IP的443端口发送一个TCP SYN请求 (seq=0);
    1. 向目标IP的80端口发送一个TCP ACK请求;
    1. 向目标IP发送一个ICMP Timestamp Request(type 13);
    1. 查找目标IP反向DNS解析的地址(图中未体现出来)
    1. 当目标IP回应了任何一个探测包,则nmap认为目标IP存活。
    1. 若主机存活
    • Nmap 会调用nmap-services里面常用的1000个常用TCP端口,判断端口存活
      • 特权用户下(root/administrator):Nmap向目标发送1000个常用端口发送SYN请求,建立 TCP 半连接
      • 普通用户下:Nmap向目标发送1000个常用端口发送SYN请求,建立 TCP 全连接

常见参数

  • 要扫描所有的 tcp 端口,使用参数 -p0-
  • 使用 -n 忽略 ip 反向解析域名,加快速度
  • 使用 -v 输出详细信息,v 越多内容越详细,-vvvv

二、Nmap 端口扫描方式

SYN 扫描 - TCP 半连接扫描

最流行的扫描方式,nmap 的默认扫描方式,1 秒中内扫描上千的端口,半连接没有完成三次握手,无法建立 TCP 连接,扫描行为不会被记录在系统日志中

  • 参数:-sS
  • 样例:nmap -sS -Pn -p22 10.95.58.17 --packet-trace -n
响应结果 端口状态
TCP SYN/ACK 响应 open
TCP RST 响应 closed
没有收到任何响应包 filtered
ICMP不可达(type3,code1,2,3,9,10,13) filtered


进行 SYN 扫描的时候,会导致服务大量的 SYN+ACK 重传包

Connect 扫描 - TCP 全连接扫描

这种方式和 SYN 扫描类似,只是完成了 TCP 的三次握手,这种扫描不需要 nmap 具有系统权限

  • 参数:-sT
  • 样例:nmap -sT -Pn -p22 10.95.58.238 --packet-trace -n

Nmap 会发送 SYN 探测包,建立完整的 TCP 三次握手,建立成功则端口开放,失败则端口关闭

ACK 半连接扫描 - TCP 半连接扫描

发送ACK,建立不完整的TCP连接,无论端口开放或关闭都会返回RST

  • 参数:-sA
  • 样例:nmap -sA -Pn -p22 10.95.58.238 --packet-trace -n
响应结果 端口状态
TCP RST 响应 unfiltered
没有收到任何响应包 filtered
ICMP不可达(type3,code1,2,3,9,10,13) filtered

测试 1:(ICMP 不可达)

测试 2:

TCP 窗口扫描

如果收到 RST 回包,其中内容Win<=0,则说明端口关闭,如果Win>0,则说明端口开放。

误报比较高。

  • 参数:-sW
  • 样例:nmap -sW -Pn -p22 10.95.58.238 --packet-trace -n
响应结果 端口状态
TCP RST响应,Win > 0 open
TCP RST响应,Win <=0 closed
没有收到任何响应包 filtered
ICMP不可达(type3,code1,2,3,9,10,13) filtered

测试 1:

测试 2:

TCP Maimon 扫描

发送 FIN/ACK 数据包

  • 返回 RST --> 端口开放
  • 无返回 --> 端口关闭
  • 参数:-sM
  • 样例:nmap -sM -Pn -p22 10.95.58.17 --packet-trace -n
响应结果 端口状态
TCP RST响应 closed
没有收到任何响应包 open|filtered
ICMP不可达(type3,code1,2,3,9,10,13) filtered

测试 1:

测试2:

TCP 空扫描

发送 TCP 数据包,所有的标志位都为空,如果对方收到回复 RST 包,说明端口关闭,没有回包,有可能是开放(open | filtered)

  • 参数:-sN
  • 样例:nmap -sN -Pn -p22 10.95.58.17 --packet-trace -n

测试 1:

测试 2:

TCP FIN 扫描

发送 FIN 数据包

  • 参数:-sF
  • 样例:nmap -sF -Pn -p22 10.95.58.238 --packet-trace -n


TCP Xmas 扫描

发送含有FIN,URG 和 PUSH 标志的数据包

  • 参数:-sX
  • 样例:nmap -sX -Pn -p22 10.95.58.238 --packet-trace -n

网络协议扫描

此时 -p 参数不再是端口号而是协议号,常见协议号映射位于 nmap-protocols 文件中,使用 -F 可以扫描文件中的所有协议【-F 其实就是根据协议扫描常见的 100 个端口】

  • 参数:-sO
  • 样例:nmap -sO -Pn -p1 10.95.58.238 --packet-trace -n
  • 使用协议号 -p1 ,1是icmp协议号,等于使用icmp协议探测

测试 1:(ICMP 协议号 1)

测试 2:(GRE 协议号 47)

测试 3:(IPIP 协议号 4)

UDP 扫描

向 UDP 端口发送探测包

  • 参数:-sU
  • 样例:nmap -sU -Pn -p53 10.249.106.40 --packet-trace -n
响应结果 端口状态
有UDP包响应 open - 理论上不会出现
ICMP 端口不可达(type3, code3) closed
没有收到任何响应包 open|filtered
ICMP不可达(type3,code1,2,9,10,13) filtered

UDP 端口开放的情况下

UDP 端口关闭的情况下

ICMP Port Unreachable,也是Traceroute使用的一个重要特性

ICMP Time-to-live -> ICMP Port Unreachable 来判断到达目标终点

其他端口扫描

  • -sI,-sY,-sZ,-b 等,忽略

注意

Nmap 的判断端口的方法和参数很多,但是不能同时使用


by 久违 2026.01.20

相关推荐
用户962377954482 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954482 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star2 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954482 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher4 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行7 天前
网络安全总结
安全·web安全
red1giant_star7 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透7 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全