【安全开发】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

相关推荐
世界尽头与你2 小时前
CVE-2025-48976_ Apache Commons FileUpload 安全漏洞
网络安全·渗透测试·apache
Pure_White_Sword2 小时前
bugku-reverse题目-peter的手机
网络安全·ctf·reverse·逆向工程
信创天地3 小时前
信创日志全流程管控:ELK国产化版本与华为日志服务实战应用
运维·安全·elk·华为·rabbitmq·dubbo
@大迁世界3 小时前
停止使用 innerHTML:3 种安全渲染 HTML 的替代方案
开发语言·前端·javascript·安全·html
缘木之鱼3 小时前
CTFshow __Web应用安全与防护 第二章
前端·安全·渗透·ctf·ctfshow
Xudde.3 小时前
在网络空间安全专业大二上学期个人经历
笔记·学习·安全
xwz小王子3 小时前
【Science Advances】“安全可触”的低电压仿生人工肌肉,让机器人更柔、更轻、更安全
安全·机器人
Guheyunyi3 小时前
智能巡检:技术融合与系统生成
大数据·人工智能·科技·安全·信息可视化