3、端口扫描与发现:扫描原理、工具与策略
端口扫描这件事,说白了就是给目标系统「摸家底」。你想想看,一个网络设备上开了哪些端口、跑了什么服务,这些信息如果不搞清楚,后续的优化和管理就无从下手。我个人习惯把端口扫描看作网络运维的「第一道手电筒」——照一照,才知道哪里亮着灯。
3.1 扫描原理:三种核心方式
端口扫描的原理其实不复杂。就是向目标端口发一个试探包,然后看对方怎么回应。不同的试探方式,决定了扫描的隐蔽性、速度和准确性。我挑三种最常用的来讲。
3.1.1 TCP Connect 扫描
这是最基础、最「老实」的扫描方式。它完整走一遍 TCP 三次握手:
- 客户端发 SYN → 服务端回 SYN+ACK → 客户端回 ACK,连接建立
- 如果端口关闭,服务端会回 RST
优点是什么?准确,不需要特殊权限。普通用户就能跑。缺点也很明显——太吵了。目标系统会完整记录连接日志。我在项目中遇到过,用 Connect 扫描一个生产环境的负载均衡器,结果对方安全组直接把我 IP 封了。嗯,从那以后我学乖了,生产环境慎用这种扫描。
3.1.2 SYN 扫描(半开扫描)
这个就「狡猾」多了。它只发 SYN,收到 SYN+ACK 后不发最后的 ACK,而是直接发 RST 断开。说白了,就是不把三次握手走完。
- 速度快,因为不需要建立完整连接
- 隐蔽性好,很多应用层日志不会记录半开连接
- 需要 root 权限才能构造原始 SYN 包
我建议,如果你在内网做渗透测试或者安全审计,SYN 扫描是首选。但要注意,现在很多 IDS/IPS 已经能识别这种模式了。我曾经在客户现场用 SYN 扫描,结果对方的 IPS 直接告警「疑似端口扫描」,差点引发误会。
3.1.3 UDP 扫描
UDP 扫描就有点「看天吃饭」的意思了。因为 UDP 是无连接的,端口开放时可能没任何回应,端口关闭时才会回一个 ICMP Port Unreachable。
这就导致一个问题:没回应 ≠ 端口关闭,也可能是防火墙把 ICMP 包丢了。所以 UDP 扫描的准确率,说实话,不太高。我一般用它来辅助确认,比如发现 TCP 端口全关,但怀疑有 DNS 或 SNMP 服务时,才跑一轮 UDP 扫描。
| 扫描类型 | 原理 | 速度 | 隐蔽性 | 权限要求 |
|---|---|---|---|---|
| TCP Connect | 完整三次握手 | 慢 | 低 | 无 |
| SYN 半开 | 只发 SYN,不发 ACK | 快 | 中 | root |
| UDP | 发 UDP 包,等 ICMP 回应 | 慢 | 高 | root |
3.2 常用扫描工具:Nmap 与 Masscan
工具这块,我主要用两个:Nmap 和 Masscan。它们各有各的脾气。
3.2.1 Nmap:瑞士军刀
Nmap 是我用得最多的工具,没有之一。它功能全、文档好、社区活跃。你想想看,一个工具能同时做端口扫描、服务识别、操作系统指纹、脚本扩展,这还不够吗?
常用的几个参数:
# 基础 SYN 扫描,扫描 1-10000 端口
nmap -sS -p 1-10000 192.168.1.1
# 服务版本探测
nmap -sV 192.168.1.1
# 操作系统识别
nmap -O 192.168.1.1
# 全面扫描(慎用,动静很大)
nmap -A 192.168.1.1
我个人习惯,日常巡检用 -sS -sV 组合,既能快速扫描,又能拿到服务版本信息。有一次排查一个 Redis 未授权访问漏洞,就是用 Nmap 的 redis-info 脚本直接拿到了对方的 Redis 版本和配置信息。
--exclude 参数可以排除某些 IP,避免扫描到敏感设备。我每次扫大段 IP 时都会加上。
3.2.2 Masscan:速度怪兽
Masscan 的设计哲学就一个字:快。它号称能在 5 分钟内扫描整个互联网的 443 端口。怎么做到的?它用异步传输,不维护连接状态,纯靠发包和收包。
但快是有代价的。Masscan 的误报率比 Nmap 高,而且功能单一——它只做端口扫描,不做服务识别。我一般用它做「第一轮粗筛」,发现开放端口后,再用 Nmap 做精细探测。
# 扫描整个 B 段,只扫 80 和 443 端口
masscan 10.0.0.0/16 -p80,443 --rate=10000
# 输出结果到文件
masscan 10.0.0.0/16 -p1-65535 --rate=5000 -oJ scan.json
--rate=1000 开始试,慢慢往上调。
3.3 扫描策略与频率控制
扫描不是越快越好。你想想看,如果每秒发几万个包,目标网络不瘫痪才怪。我见过有人用 Masscan 默认速率扫一个内网段,结果把交换机的 CPU 打到了 100%。
这里我总结了几条经验:
- 分阶段扫描: 先扫常见端口(22、80、443、3306 等),再扫全端口。常见端口能覆盖 80% 的服务。
- 控制速率: 内网建议 1000-5000 pps,外网建议 100-500 pps。别贪快。
- 随机化: 不要顺序扫描,容易被防火墙检测。Nmap 的
--randomize-hosts和 Masscan 默认就是随机发包。 - 时间窗口: 避开业务高峰期。我一般选凌晨 2-4 点做全端口扫描。
3.4 扫描结果分析
扫完了,拿到一堆端口列表,然后呢?这才是关键。很多人扫完就扔一边,其实结果分析才是最有价值的部分。
我一般按以下步骤处理:
- 去重与归类: 把同一台设备的多个 IP 合并,按端口号分组。
- 服务识别: 结合 Nmap 的
-sV结果,确认每个端口跑的是什么服务、什么版本。 - 异常标记: 标记出非标准端口(比如 8080 跑 SSH、3306 暴露在公网)。
- 基线对比: 和上一次扫描结果对比,看有没有新增或消失的端口。
举个例子,我曾经在一次扫描中发现一台服务器开了 6379 端口,服务是 Redis。但业务方说他们没用 Redis。后来一查,是某个开发人员为了测试临时装的,忘了关。这种「幽灵服务」就是端口扫描要抓的重点。
3.5 知识体系总览
下面这张图把本章的核心逻辑串起来了。从扫描原理到工具选择,再到策略和分析,是一条完整的链路。
端口扫描这件事,说到底就是「知己知彼」。你只有知道自己的网络里开了什么,才能决定哪些该关、哪些该加固、哪些该监控。下一轮我们聊端口状态监控,那是把扫描结果变成持续管理能力的关键一步。