简介
欢迎来到 TCP 和 UDP 端口扫描实验。端口扫描是网络管理员和安全专业人员用于发现计算机网络中活跃服务的一项基础技术。通过向目标发送特定的网络数据包并分析响应,我们可以确定哪些端口是开放的、关闭的,或者被防火墙过滤的。
端口开放并不直接等同于「存在漏洞」,但它意味着「可达的服务边界」。这就是为什么端口扫描在侦察阶段至关重要。它能识别出系统向网络暴露了哪些入口。
在本实验中,你将使用网络发现领域的行业标准工具 Nmap (Network Mapper) 来探索网络端口扫描的底层机制。你将学习如何执行三种不同类型的扫描:可靠的 TCP 连接扫描、隐蔽的 TCP SYN 扫描以及无连接的 UDP 端口扫描。通过动手实践,你将理解不同网络协议如何响应扫描探测。
执行 TCP 连接扫描 (-sT)
在这一步中,我们将从执行 TCP 连接扫描开始。你当前位于默认工作目录 ~/project。
TCP 连接扫描是最直接的端口扫描类型。它依赖于操作系统内置的网络功能与目标端口建立完整连接。这意味着它会完成整个 TCP 三次握手:发送一个 SYN 数据包,接收来自目标的 SYN-ACK 数据包,最后发送一个 ACK 数据包以建立连接。
由于它使用了标准的网络栈,这种扫描在概念上简单且可靠。它也提醒我们,扫描本质上就是对协议设计行为的一种受控交互。
由于它完成了连接过程,这种扫描非常可靠。然而,它也显得非常「嘈杂」。因为建立了完整连接,目标系统的应用程序日志几乎肯定会记录下这次连接尝试,这使得管理员很容易检测到扫描行为。
让我们使用 Nmap 对本地机器 (localhost) 的 8080 端口执行 TCP 连接扫描,该端口当前运行着一个后台 Web 服务。-sT 参数告诉 Nmap 使用 TCP 连接方式,-p 参数用于指定端口号。
在终端中执行以下命令:
nmap -sT -p 8080 localhost
运行命令后,你应该会看到类似以下的输出:
Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-07 15:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 0.02 seconds
输出清楚地显示 8080 端口处于 open(开放)状态,并使用 TCP 协议。该服务被识别为 http-proxy(根据 Nmap 版本不同,显示名称可能略有差异),这与我们在后台运行的 Python HTTP 服务器相符。
执行隐蔽的 SYN 扫描 (-sS)
在这一步中,我们将探索一种更高级且常用的技术:TCP SYN 扫描,也称为「半开放」扫描。
与 TCP 连接扫描不同,SYN 扫描不会完成三次握手。它发送一个 SYN 数据包(请求连接)并等待响应。如果目标端口开放,它会响应一个 SYN-ACK 数据包。此时,Nmap 不会发送 ACK 来完成连接,而是立即发送一个 RST(重置)数据包,在连接完全建立之前将其断开。
这就是为什么 SYN 扫描通常被称为「半开放」扫描的原因。它仍然依赖于目标的 TCP 行为,但最大限度地减少了连接完成的程度。
这种方法被认为是「隐蔽的」,因为许多应用程序只记录完全建立的连接。通过提前断开连接,SYN 扫描通常可以绕过应用程序级别的日志记录。然而,由于它需要构造原始网络数据包而不是使用标准的操作系统函数,因此该扫描需要 root (sudo) 权限。
让我们对本地机器上的同一个 8080 端口执行 SYN 扫描。我们将使用 -sS 参数来指定 SYN 扫描方式。
在终端中执行以下命令:
sudo nmap -sS -p 8080 localhost
你将看到与上一步类似的输出:
Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-07 15:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000042s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
请注意,结果是完全一样的——端口仍然被识别为 open。区别完全在于幕后网络数据包的交换方式。由于其速度快且隐蔽,当你使用 sudo 权限运行 Nmap 时,SYN 扫描是默认的扫描类型。
执行 UDP 端口扫描 (-sU)
在最后一步中,我们将把重点从 TCP 转向 UDP (User Datagram Protocol,用户数据报协议)。
UDP 是一种无连接协议。与 TCP 不同,在发送数据之前没有建立连接的握手过程。当你向一个端口发送 UDP 数据包时,如果端口开放,目标通常不会发回确认信息。只有当端口关闭时,它才会响应一个「ICMP 端口不可达」错误。
这种不对称性使得 UDP 扫描的结果更难解读。沉默可能意味着成功、被过滤,或者什么都没有。因此,分析人员需要比解读 TCP 结果更谨慎地解读 UDP 结果。
这使得 UDP 扫描变得极其困难且缓慢。如果 Nmap 发送了一个 UDP 数据包但没有收到响应,它无法完全确定端口是开放且静默地接收数据,还是防火墙丢弃了数据包。因此,Nmap 通常将这些端口报告为 open|filtered(开放或过滤)。
让我们对一个已知当前没有运行服务的任意端口(例如 5353)执行 UDP 扫描。这将演示当端口明确关闭时操作系统是如何响应的。与 SYN 扫描一样,UDP 扫描需要 root 权限来构造原始数据包。
在终端中执行以下命令:
sudo nmap -sU -p 5353 localhost
扫描可能比 TCP 扫描花费的时间稍长。完成后,你应该会看到类似以下的输出:
Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-07 15:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000038s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
5353/udp closed zeroconf
Nmap done: 1 IP address (1 host up) scanned in 1.09 seconds
注意状态被报告为 closed(关闭)。当 Nmap 向关闭的端口发送 UDP 数据包时,目标操作系统通常会响应一个「ICMP 端口不可达」错误消息。由于 Nmap 收到了这个明确的错误,它可以确信地将端口标记为 closed。如果该端口上运行着服务但只是没有响应(这在 UDP 应用中很常见),Nmap 将不会收到此 ICMP 错误,并很可能会将端口状态模糊地报告为 open|filtered。这种对 ICMP 错误消息的依赖是 UDP 端口扫描的一个显著特征。
总结
恭喜!你已经成功完成了 TCP 和 UDP 端口扫描实验。
在本实验中,你学习了如何使用 Nmap 执行不同类型的网络扫描。你从可靠但嘈杂的 TCP 连接扫描 (-sT) 开始,它会完成完整的三次握手。接着,你尝试了隐蔽的 TCP SYN 扫描 (-sS),它通过保持连接半开放状态来识别开放端口,从而规避基础日志记录。最后,你探索了无连接 UDP 扫描 (-sU) 的复杂性,理解了为什么 UDP 端口通常显示为 open|filtered。
这些基础扫描技术是理解网络拓扑结构以及保护系统免受未经授权访问的核心技能。



