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),用于探测防火墙规则集而非端口本身。
二、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)。这是排查“端口到底是被防火墙拦了还是服务没开”的最直接证据。
-Pn跳过主机发现、-f分片、--source-port指定源端口等技巧,观察状态是否变化,从而推断过滤规则。
五、状态判定的工程意义
在网络安全评估中,端口状态直接对应不同的风险结论:open表示存在可访问服务,需进一步做版本探测与漏洞扫描;closed表示主机在线但该端口无服务,通常风险较低;filtered表示存在访问控制,可能是安全加固的体现,也可能是需要绕过的障碍;unfiltered表示数据包可达但无法判断服务状态,常用于推断防火墙是“默认拒绝”还是“默认允许”。
理解三次握手与RST行为,不仅能帮助正确解读Nmap报告,还能在遇到“扫描结果与预期不符”时快速定位原因:是服务没启动、是防火墙拦截、还是扫描类型选错了。这是从“会用Nmap”走向“读懂Nmap”的关键一步。