大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
网络侦察与抓包:nmap、tcpdump、Wireshark
这一课你将能做到
- 用 nmap 对自建靶机完成主机发现、端口扫描与服务版本识别
- 用 tcpdump 抓包、用 Wireshark 分析 TCP 三次握手与 HTTP 明文风险
- 从网络层视角解释为什么「端口最小开放」比应用层加固优先级更高
为什么要学
网络是攻击者的主通道,也是防御者的第一道边界。你的 Spring Boot 应用写得再安全,如果无密码的 Redis 6379 暴露公网,攻击者会直接绕过应用写 shell。日常排障时抓包能力是照妖镜:前端说发了请求、后端说没收到,一条 tcpdump 就能定案。
人话:nmap 是「挨家敲门看谁在家」,tcpdump / Wireshark 是「装在走廊的监控摄像头」。这两项能力贯穿渗透、防御、排障三条线,是安全基本功中的基本功。
先建立图像
一次 HTTP 请求在网络里的完整旅程:
客户端 服务器
│ ── SYN ─────────────────────▶│
│◀─────────────── SYN/ACK ─────│ ① 三次握手建立连接
│ ── ACK ─────────────────────▶│
│ ── GET /login?pwd=123456 ───▶│ ② 明文可见!
│◀────────── HTTP/1.1 200 ─────│ ③ 明文可见!
│ ── FIN ─────────────────────▶│ ④ 四次挥手断开
nmap 扫描的本质,就是发起(或伪造)各种握手探测,从响应特征推断端口状态与服务版本;抓包工具则把这条链路上的字节原样录下来。
跟着做
步骤 1:准备合法靶场网络
VirtualBox 新建 Host-Only 网络,导入一台 Ubuntu 靶机(假设 IP 192.168.56.101),靶机上装 Nginx 和 Redis。本课所有扫描目标只有这一台自建虚拟机,禁止指向任何公网地址。
步骤 2:主机发现
# 在攻击机(宿主机)执行
nmap -sn 192.168.56.0/24 # ping 扫描,看网段谁在线
nmap -sn 192.168.56.101 # 确认靶机可达
步骤 3:端口与服务扫描
nmap -sT 192.168.56.101 # 全连接扫描,最温和
nmap -p 22,80,6379,3306 192.168.56.101 # 针对常见端口
nmap -sV -sC 192.168.56.101 # 版本识别 + 默认脚本
nmap --script http-title 192.168.56.101 # 轻量脚本示例
观察输出:22/tcp open ssh、6379/tcp open redis。Redis 无密码对外开放就是典型风险点,下一步你会亲手证明它的危害。
步骤 4:tcpdump 抓明文 HTTP
# 靶机上执行,抓 80 端口写文件
sudo tcpdump -i any port 80 -w /tmp/http.pcap
# 另开终端模拟登录(打靶机)
curl "http://192.168.56.101/login?user=admin&pwd=123456"
# Ctrl+C 停止,用 Wireshark 打开 /tmp/http.pcap
在 Wireshark 里右键任意一个包 → Follow → TCP Stream,用户名密码完全裸奔。这就是「必须上 TLS」的第一手证据。
步骤 5:Wireshark 对比明文与加密
# 再抓一次 HTTPS(靶机 Nginx 配好自签证书)
sudo tcpdump -i any port 443 -w /tmp/tls.pcap
curl -k https://192.168.56.101/
Wireshark 显示过滤器:tcp.flags.syn==1 看三次握手;http 看明文;tls.handshake.type==1 看 ClientHello。TLS 流量里除了 IP、域名(SNI)、证书信息,内容全部是密文。
步骤 6:把结论落回 Java 平台
# 检查自己服务器监听情况
ss -tlnp | grep -E '6379|3306|8080'
# 期望:Redis / MySQL 只监听 127.0.0.1 或内网 IP
# 8080 不直接暴露公网,前面有 Nginx 反代 + TLS 终止
讲清楚要点
- 三次握手是扫描的基石:SYN 半开扫描(-sS)只发 SYN,收到 SYN/ACK 即判定 open 并回 RST 断开,隐蔽且快;全连接扫描(-sT)走完整 connect(),最准也最吵。
- 端口四种状态:open(有服务在听)、closed(无服务但可达)、filtered(防火墙丢包,无法判断)、unfiltered。防御视角,filtered 才是我们想要的状态。
- 明文协议是原罪:HTTP、FTP、Telnet 的内容在链路任意节点可读。所有带凭证的流量必须走 TLS,这是硬性要求不是建议。
- 抓包三要素:网卡(
-i any兜底)、过滤表达式(BPF:port 8080)、输出(-w存文件离线分析)。线上抓包用-C 100 -W 10滚动文件,防止磁盘打满。 - 两种过滤器语法不同:捕获过滤用 BPF(
tcpdump port 8080),显示过滤用 Wireshark 语法(tcp.port==8080),混用会得出错误结论。
你可能会懵的地方
-
为什么很多端口显示 filtered? 目标防火墙对探测包做了 DROP,nmap 既收不到 RST 也收不到响应,只能标记 filtered。这提醒你:DROP 比 REJECT 泄露的信息更少。
-
SYN 扫描为什么要 root? 构造原始套接字需要内核权限,所以 nmap 和 tcpdump 默认要 sudo 或 CAP_NET_RAW 能力。
-
HTTPS 流量还能看到什么? 默认能看到 IP、SNI 域名、证书链、握手时长与加密套件。想看内容需配 TLS keylog(
SSLKEYLOGFILE),且只允许在你自己控制的测试环境做。 -
扫描会不会把目标打挂? 激进参数(
-T5、全量脚本)可能打崩老旧设备。对生产系统只做授权窗口内的温和扫描(-T2/-T3),并提前报备。 -
Spring Boot 应用怎么配合抓包排障? 在网关层抓最外层流量看「网络真相」,应用日志用 MDC 加 traceId 看「应用真相」,两边按时间戳对齐,问题定位效率翻倍。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 扫公司公网 IP 练手 | 违法违规 | 只扫自建靶机或书面授权范围 |
| Wireshark 网卡选错 | 什么也抓不到 | 选实际联网网卡,VM 环境选 Host-Only 网卡 |
| 生产环境长时间全量抓包 | 磁盘打满、泄露敏感数据 | 限时 + 过滤 + 滚动文件,用完即删 |
| 端口 open 就当有漏洞 | 开放不等于可利用 | 结合版本、配置与认证评估 |
| 把 filtered 当绝对安全 | 可能只是探测被拦 | 对照防火墙规则清单确认 |
卡点急救
- nmap 显示 host down:Host-Only 网段配置不一致。检查两边 IP 同网段;已知靶机在线时加
-Pn跳过 ping 探测。 - tcpdump 抓不到包:网卡名不对,
ip a确认;本机回环流量要用-i lo。 - pcap 文件太大打不开:用
tshark -r big.pcap -Y "http" -w small.pcap先裁剪再分析。
面试常问
-
描述三次握手与 SYN Flood 的原理和防御。 SYN → SYN/ACK → ACK。SYN Flood 只发 SYN 不完成握手,耗尽服务端半连接队列。防御:SYN Cookie、缩短半连接超时、上游流量清洗。
-
nmap -sS 和 -sT 的区别? -sS 半开扫描:发 SYN,收到 SYN/ACK 即判定 open 并回 RST,不建完整连接,隐蔽快但需 root;-sT 走完整 connect(),无需特权但系统日志痕迹大。
-
生产环境抓包怎么合规操作? 变更窗口内操作;只抓目标端口与主机;限时限量滚动存储;不主动解密敏感流量;抓完校验后删除;全程留操作审计记录。
自测三问
- open、closed、filtered 分别意味着什么?
- 为什么 Redis 6379 暴露公网通常比 MySQL 3306 更危险?至少说两个原因。
- tcpdump 捕获过滤和 Wireshark 显示过滤的语法差别是什么?
小结一句话
nmap 画出攻击面地图,tcpdump / Wireshark 还原流量真相;防御的第一步永远是「关上不该开的门,加密必经的路」。
延伸
- Nmap 官方参考手册
- Wireshark 官方用户指南
- 下一课:Linux 系统加固——从账号、SSH 到审计的落地命令。