概述

端口扫描是信息收集阶段的重要环节,是获取目标主机服务信息的主要方式之一。其核心基于 TCP/IP 协议栈的传输层特性。常见的主动端口扫描大体可分为 TCP 扫描UDP 扫描 两类。


UDP 端口扫描原理

与 TCP 不同,UDP 是一种无连接、无状态的协议,因此在扫描时能够得到的信息相对有限。

  • 当客户端向服务端某个 关闭的 UDP 端口发送数据时,服务端通常会返回一个 ICMP Port Unreachable 报文。
  • 由此可知:如果收到了该 ICMP 报文,可以确定端口已关闭。
  • 如果没有收到响应,则可能是端口开放,也可能是被防火墙丢弃。

👉 因此,UDP 扫描的特点是:

  • 端口关闭的结论可靠
  • 端口开放的结论不确定(可能开放,也可能被屏蔽)。

这也是为什么 UDP 扫描常常比较缓慢、准确率不高。


TCP 端口扫描原理

由于TCP 是一种面向连接、有状态的协议,并且拥有多种标志位(Flags),因此针对 TCP 的扫描方式更加多样化。以下列出几种常见方式(以 Nmap 为例):

扫描方法 原理 典型应用 Nmap 参数
全连接扫描 完整执行 TCP 三次握手 结果最稳定,但容易被记录 -sT
半开扫描(SYN Scan) 仅发送 SYN,收到 SYN/ACK 后立即发送 RST,避免完整握手 快速,隐蔽性较好,常用 -sS
FIN 扫描 仅发送 FIN 标志包,若端口关闭则返回 RST 适用于类 Unix 系统 -sF
圣诞树扫描(Xmas Scan) 同时设置 FIN、URG、PUSH 标志,关闭端口返回 RST 绕过部分防火墙 -sX
TCP Null 扫描 不设置任何标志位,关闭端口返回 RST 类似 FIN 扫描 -sN
ACK 扫描 发送 ACK 包,关闭端口返回 RST 探测防火墙过滤规则,而非端口状态 -sA
UDP 扫描 发送 UDP 包,关闭端口通常返回 ICMP Port Unreachable UDP 服务发现 -sU

TCP 报文格式(关键标志位)

下面给出 TCP 首部(Header)的结构示意,重点在 6 个控制位(Flags):

 0 1 2 3 4 5 6 7 8 9 A B C D E F
+-------------------------------+
|          Source Port          |
+-------------------------------+
|       Destination Port        |
+-------------------------------+
|        Sequence Number        |
+-------------------------------+
|     Acknowledgment Number     |
+-------+-----------+-+-+-+-+-+-+
| Data  | Reserved  |U|A|P|R|S|F|
| Offset|           |R|C|S|S|Y|I|
+-------+-----------+-+-+-+-+-+-+
|       Window Size             |
+-------------------------------+
|       Checksum                |
+-------------------------------+
|       Urgent Pointer          |
+-------------------------------+
|   Options     |   Padding     |
+-------------------------------+
|               Data            |
+-------------------------------+

标志位解释:

  • URG:紧急指针有效
  • ACK:确认号有效
  • PSH:提示立即将数据交给应用层
  • RST:重置连接
  • SYN:发起新连接
  • FIN:释放连接

空闲扫描

攻击者并不直接与目标主机通信,而是“借用”第三方僵尸机(Zombie Host)的 IPID 递增特性进行扫描。因此,目标主机的日志里不会出现攻击者的 IP,而只会记录下“僵尸机”的 IP。但是这种扫描依赖老旧的僵尸主机。

sequenceDiagram participant A as 攻击者 participant Z as 僵尸主机 participant T as 目标主机 Note over A, T: 阶段一:探测僵尸主机的初始IPID A->>Z: 发送SYN/ACK包 Z->>A: 回复RST包 (IPID = x) Note right of A: 记录初始IPID: x Note over A, T: 阶段二:伪造僵尸主机的IP向目标发送探测包 A->>T: 伪造SYN包 (源IP = Z) alt 目标端口开放 T->>Z: 发送SYN/ACK包 Z->>T: 回复RST包 (IPID 递增为 x+1) else 目标端口关闭 T->>Z: 发送RST包 Note right of Z: 收到RST,不回复,IPID不变 end Note over A, T: 阶段三:再次探测僵尸主机的IPID A->>Z: 发送SYN/ACK包 Z->>A: 回复RST包 (IPID = y) Note right of A: 分析IPID变化 alt 如果 y == x + 1 Note right of A: 目标端口可能为【过滤】状态
(或僵尸机IPID增长不规律) else 如果 y == x + 2 Note right of A: 目标端口【开放】 else 如果 y == x Note right of A: 目标端口【关闭】 end

nmap 用法

nmap -sI <zombie_host> <target_host>

示例:

nmap -sI 192.168.1.100 192.168.1.200
  • 192.168.1.100 → 僵尸机(Zombie),必须具备 IPID 可预测性
  • 192.168.1.200 → 目标主机。

防御与检测

  1. 最小化服务暴露:仅开放业务需要的端口,最简单也最有效的方式。
  2. 使用防火墙/ACL:限制来自不可信源的访问。
  3. IDS/IPS 检测:通过流量特征识别扫描行为。
  4. 蜜罐技术:诱导扫描者暴露意图。

总结

端口扫描既是进攻方的侦察利器,也是防御方必须重点防护的对象。
理解不同扫描方式的原理,能够帮助安全研究人员更好地掌握攻防思维,也有助于在实际工作中快速定位风险点。