4. 端口状态与扫描原理

在Nmap的扫描结果中,端口状态并不是“通”或“不通”这么简单。Nmap将端口划分为六种状态:open、closed、filtered、unfiltered、open|filtered和closed|filtered。理解这些状态背后的判定逻辑,是读懂扫描报告、判断防火墙策略、区分“服务不存在”与“探测被拦截”的关键。本节围绕TCP三次握手与RST行为,说明四种主要状态的判定原理。

一、TCP三次握手与端口状态的对应关系

TCP连接的建立依赖三次握手:客户端发送SYN,服务端若端口开放则回应SYN/ACK,客户端再发送ACK完成连接。Nmap的TCP SYN扫描(-sS)正是利用这一机制:它只发送SYN,根据对方回应决定端口状态,而不完成握手,因此速度快、隐蔽性较好。

当目标端口开放时,目标主机返回SYN/ACK。Nmap收到后判定为open,并立即发送RST中断连接,避免建立完整会话。当目标端口关闭时,目标主机返回RST/ACK,Nmap据此判定为closed。这两种情况都说明数据包成功到达了目标主机,区别只在于目标端口是否有服务监听。

当目标端口被过滤时,Nmap收不到任何回应,或者收到ICMP不可达错误(如类型3代码13“通信被管理过滤”)。这通常意味着路径上有防火墙、路由器ACL或主机防火墙丢弃了探测包。此时Nmap只能判定为filtered,无法确定端口究竟是开放还是关闭。当目标端口为未过滤时,Nmap收到RST但无法判断端口是否开放——这种情况常见于ACK扫描(-sA),用于探测防火墙规则集而非端口本身。

TCP探测包与端口状态判定逻辑 Nmap 扫描器 发送 SYN 探测包 目标主机 端口 / 防火墙 中间设备 防火墙 / ACL 场景 A:端口开放 SYN → ← SYN/ACK 判定:open 场景 B:端口关闭 SYN → ← RST/ACK 判定:closed 场景 C:端口被过滤 SYN → 丢弃 / 无响应 判定:filtered 场景 D:未过滤(ACK 扫描) ACK → ← RST(无状态信息) 判定:unfiltered

二、RST行为分析:区分关闭与过滤的关键

RST(Reset)是TCP协议中用于异常终止连接的标志位。在端口扫描中,RST的出现与否、以及RST的类型,直接决定了状态判定:

  • RST/ACK:目标端口关闭时,内核协议栈主动回应。说明探测包到达了目标主机,且没有被防火墙拦截。
  • 无响应:探测包被丢弃,或目标主机不可达。Nmap在重传若干次后仍无回应,判定为filtered。
  • ICMP不可达:类型3代码1/2/3/9/10/13等,说明路径上有设备明确拒绝转发。Nmap将其归入filtered。
  • RST(无ACK):在ACK扫描中,无论端口开放还是关闭,只要未被过滤,目标都会返回RST。因此ACK扫描只能判断“是否被过滤”,不能判断端口是否开放。

需要特别注意的是,open|filtered状态出现在UDP扫描、FIN扫描、Xmas扫描等场景中。当Nmap发送探测包后既没有收到响应,也没有收到RST时,无法区分端口是开放(服务不回应)还是被过滤(防火墙丢弃),因此给出这种模糊判定。而closed|filtered则出现在IP ID空闲扫描等特殊场景中,表示端口既可能关闭也可能被过滤。

三、扫描类型与状态判定的对应关系

不同扫描类型利用的协议行为不同,因此能判定的状态也不同。下表整理了常见扫描方式与可判定状态的对应关系(示例参数,用于说明原理):

扫描类型 命令参数 发送包 可判定状态 典型用途
TCP SYN 扫描 -sS SYN open / closed / filtered 快速端口发现,需root权限
TCP Connect 扫描 -sT 完整三次握手 open / closed / filtered 无root权限时使用,易被日志记录
ACK 扫描 -sA ACK unfiltered / filtered 探测防火墙规则集
FIN / Xmas / Null -sF / -sX / -sN FIN / FIN+PSH+URG / 无标志 open|filtered / closed / filtered 绕过部分无状态防火墙
UDP 扫描 -sU UDP 数据报 open|filtered / closed / filtered 发现DNS、SNMP等UDP服务

四、实操观察:用Nmap验证状态判定

以下示例演示如何通过Nmap观察不同状态。假设目标为192.168.1.100,本机具备root权限:

# 1. TCP SYN扫描,观察开放与关闭端口
nmap -sS -p 22,80,443,3389 192.168.1.100

# 2. ACK扫描,判断防火墙是否过滤
nmap -sA -p 22,80,443 192.168.1.100

# 3. 增加详细输出,观察RST与超时行为
nmap -sS -p 80 --reason 192.168.1.100

在--reason输出中,Nmap会明确标注每个端口的判定依据,例如syn-ack表示收到SYN/ACK(open),reset表示收到RST(closed),no-response表示无响应(filtered)。这是排查“端口到底是被防火墙拦了还是服务没开”的最直接证据。

提示:如果扫描结果显示大量端口为filtered,而目标主机本身可达(如ICMP ping通),通常说明路径上有状态防火墙或主机防火墙在丢弃探测包。此时可尝试使用-Pn跳过主机发现、-f分片、--source-port指定源端口等技巧,观察状态是否变化,从而推断过滤规则。
注意:open|filtered和closed|filtered不是“不确定”的借口,而是Nmap在信息不足时的诚实标注。工程评估中应结合多种扫描类型交叉验证,避免将open|filtered直接当作open写入报告。

五、状态判定的工程意义

在网络安全评估中,端口状态直接对应不同的风险结论:open表示存在可访问服务,需进一步做版本探测与漏洞扫描;closed表示主机在线但该端口无服务,通常风险较低;filtered表示存在访问控制,可能是安全加固的体现,也可能是需要绕过的障碍;unfiltered表示数据包可达但无法判断服务状态,常用于推断防火墙是“默认拒绝”还是“默认允许”。

理解三次握手与RST行为,不仅能帮助正确解读Nmap报告,还能在遇到“扫描结果与预期不符”时快速定位原因:是服务没启动、是防火墙拦截、还是扫描类型选错了。这是从“会用Nmap”走向“读懂Nmap”的关键一步。