Wireshark 教程与抓包实战
目录
- 一、显示过滤器:IP/MAC/端口/协议/组合(速查)
- 二、捕获过滤器 vs 显示过滤器:本质差异与语法对照
- 三、追踪流(Follow Stream):重组复杂交互的利器
- 四、抓包典型案例解析
- 4.1 TCP 连接异常关闭:重传与 RST
- 4.2 DHCP 四步交互(DORA)
- 4.3 OSI/TCP-IP 分层与抓包字段对应
- 4.4 HTTP 304 缓存验证交互
- 4.5 ARP 请求包完整解析
- 4.6 TCP 三次握手 + 四次挥手(状态机对应)
- 4.7 TLS(RSA)握手流程与抓包对应(含"是不是说反了"的澄清)
- 4.8 HTTP 请求/响应报文详解(GET、POST)
- 五、实战过滤规则清单(可直接复制)
- 六、排障建议与常见问题
- 七、术语速记与小抄
一、显示过滤器:IP/MAC/端口/协议/组合(速查)
- 按 IP 地址过滤
- 源 IP:
ip.src == 192.168.0.17 - 目标 IP:
ip.dst == 223.5.5.5 - 源或目标 IP:
ip.addr == 192.168.0.17
- 按 MAC 地址过滤(二层)
- 源 MAC:
eth.src == 00-E0-70-D0-6A-AE - 目标 MAC:
eth.dst == 00-E0-70-D0-6A-AE - 源或目标 MAC:
eth.addr == 00-E0-70-D0-6A-AE
- 按端口号过滤(四层)
- TCP:源端口
tcp.srcport == 80、目标端口tcp.dstport == 443、任一端口tcp.port == 21 - UDP:
udp.port == 53(DNS)
- 按协议类型过滤(多层)
http、tls、icmp、arp、dns、tcp、udp
- 规则组合
- 与:
ip.src==192.168.0.17 && tcp.dstport==80 - 或:
ip.src==192.168.0.17 || eth.src==00-E0-70-D0-6A-AE - 非:
!http(排除 HTTP 流量)
场景提示:
- 针对"客户端 4694 → 服务器 80"的流量:
tcp.port==4694(双向)tcp.srcport==4694(仅客户端→服务器)tcp.dstport==4694(仅服务器→客户端)
二、捕获过滤器 vs 显示过滤器:本质差异与语法对照
- 核心差异
- 显示过滤器:事后筛选,作用于"已捕获的数据"。可反复调整,不改变原始 pcap。
- 捕获过滤器:抓包前设置,限制"捕获范围"。不满足条件的数据包不会被捕获,体量小但不可逆。
- 语法对比
- 显示过滤器(Wireshark 专用,功能更丰富)
ip.addr == 192.168.31.145http && tcp.port == 80!arp
- 捕获过滤器(libpcap 语法,更底层高效)
host 192.168.31.145tcp port 80src 192.168.31.145 and dst port 80
- 选择建议
- 不确定目标流量:优先显示过滤器(保留全量,复盘灵活)
- 流量巨大/性能敏感:优先捕获过滤器(减小 pcap 体量)
- 目标明确(仅抓某 IP/端口/协议):捕获过滤器更高效
三、追踪流(Follow Stream):重组复杂交互的利器
作用:提取同一连接/会话的所有数据包,按时序重组为完整字节流,避免"逐包阅读"的碎片化低效。
类型与快捷键:
- TCP 流:基于四元组(源/目 IP 与端口),快捷键
Ctrl+Alt+Shift+T - HTTP 流:基于会话标识(Cookie/Session),快捷键
Ctrl+Alt+Shift+H
适用场景:
- TCP 连接异常(握手失败、重传、乱序、丢包)
- 明文协议还原(HTTP 请求/响应完整内容)
- 大量抓包中快速聚焦一条会话
参考配图: <image-4.png> / <image-5.png>
示例:客户端 192.168.0.25:53851 ↔ 服务器 121.40.138.231:80,可通过"追踪 TCP 流"重组三次握手、HTTP 请求与响应的完整对话。
四、抓包典型案例解析
4.1 TCP 连接异常关闭:重传与 RST
现象:
- 抓包标记大量
[TCP Retransmission]的FIN, ACK:客户端多次重传关闭请求 - 随后出现
RST, ACK:客户端强制重置连接
成因与定位:
- 网络丢包/延迟:服务端未及时确认 FIN,触发客户端超时重传
- 服务端异常:HTTP 服务异常/重启导致未按流程应答
- 结论:未完成"四次挥手",以
RST强制断开,属于"异常关闭"
建议:
- 检查链路丢包、MTU/分片、服务器日志
- 抓同时间窗口的服务端抓包对读
4.2 DHCP 四步交互(DORA)
四步流程(IPv4):
- Discover:源 IP=0.0.0.0 → 目标 IP=255.255.255.255(广播,发现服务器)
- Offer:服务器提出租约(包含候选 IP、掩码、网关、DNS 等)
- Request:客户端广播确认选择的 Offer(让其他服务器收回未选的 Offer)
- ACK:服务器确认,客户端生效配置
关键细节:
- 源 IP 0.0.0.0:客户端初始无地址,需广播
- 广播与单播:Discover/Request 常广播;Offer/ACK 常单播(指向拟分配/最终分配的地址)
- Transaction ID:关联一次完整交互(不同 Discover 可有不同 ID)
扩展:
- 续租:T1 ≈ 50% 单播续租;T2 ≈ 87.5% 广播重绑定
- Relay 中继(Option 82):跨网段时由三层设备转发
4.3 OSI/TCP-IP 分层与抓包字段对应
分层映射(抓包字段示例):
- 物理层 Frame:
Frame Length、Arrival Time - 数据链路层 Ethernet II:
Src/Dst MAC、Type: IPv4 - 网络层 IPv4:
Version、TTL、Protocol、Src/Dst IP - 传输层 TCP:
Src/Dst Port、Seq/Ack、Flags - 应用层 HTTP:请求行/响应行、头部、负载
价值:
- 快速定位问题层次(如仅为二层广播/ARP,还是三层路由/四层重传)
- 结合
Protocols in frame: eth:ethertype:ip:tcp:http:data直观理解封装链路
4.4 HTTP 304 缓存验证交互
过滤语句:ip.addr == 52.58.199.22 && http && tcp.port == 80
交互过程:
- 客户端
GET / HTTP/1.1 - 服务器
HTTP/1.1 304 Not Modified - 说明:服务器判断客户端缓存仍有效(If-Modified-Since / If-None-Match 验证),无需回传实体
价值:减少带宽,提升加载速度,是浏览器/代理缓存体系的关键一环
4.5 ARP 请求包完整解析
字段要点:
- 目标 MAC:
ff:ff:ff:ff:ff:ff(广播) - 硬件类型:以太网(1)
- 协议类型:IPv4(0x0800)
- 硬件/协议长度:6/4(MAC=6 字节,IPv4=4 字节)
- 操作码:request(1)
- Sender MAC/IP:源设备 MAC/IP
- Target MAC:
00:00:00:00:00:00(未知) - Target IP:待解析的目标 IP
场景:
- 本地 ARP 缓存未命中时,发送广播请求获取同网段目标的 MAC
- 回应为单播,双方缓存 IP→MAC 映射,后续免广播
4.6 TCP 三次握手 + 四次挥手(状态机对应)
三次握手:
- SYN(客户端)
- SYN+ACK(服务器)
- ACK(客户端) → 建立连接 ESTABLISHED
数据传输:Seq/Ack 可靠、有序传递
四次挥手(优雅断开):
- 客户端:FIN+ACK → FIN_WAIT_1
- 服务器:ACK → FIN_WAIT_2(客户端)/CLOSE_WAIT(服务器)
- 服务器:FIN+ACK → LAST_ACK(服务器)
- 客户端:ACK → TIME_WAIT(客户端等待 2MSL)
异常关闭:
- 长时间未确认 → 重传
- 应用/连接异常 →
RST强制重置
4.7 TLS(RSA)握手流程与抓包对应(含"是不是说反了"的澄清)
理论流程(传统 RSA 套件示意):
- Client Hello:客户端随机数、支持套件、SNI
- Server Hello(+Certificate):服务器随机数、证书、选定套件
- Client Key Exchange:客户端用服务器公钥加密"预主密钥"
- 双方基于(客户端随机数、服务器随机数、预主密钥)生成"会话密钥"
- Change Cipher Spec + Finished:切换加密,进入加密通信
- 说明:DoT/DoH/DoQ 为现代加密 DNS;Cloudflare Keyless SSL 为部署形态差异
抓包对应(示例场景:客户端 192.168.31.145,服务器 3.125.197.172:443,TLS 1.2):
- Client Hello(含 SNI=nginx.org)
- Server Hello, Certificate(服务器发送证书与套件)
- Server Key Exchange, Server Hello Done
- Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
- New Session Ticket, Change Cipher Spec, Encrypted Handshake Message
"是不是说反了?"澄清:
- TLS 必然由客户端先发
Client Hello,服务器回Server Hello,抓包中源/目的方向与此一致,没有"说反"。
4.8 HTTP 请求/响应报文详解(GET、POST)
- HTTP GET(以
curl http://nginx.org/LICENSE为例)
- 请求行:
GET /LICENSE HTTP/1.1 - 头部:
Host: nginx.org、User-Agent: curl/8.15.0、Accept: */* - 抓包关联:
[Response in frame: N]可跳转定位对应响应包 - GET 特性:幂等、常被缓存、通常无请求体(参数走 URL Query)
- HTTP POST/响应对应(示例:
/scan接口)
- 请求:客户端 → 服务器(Seq/Ack 标注为握手后首段,Len 为请求体大小)
- 响应:
HTTP/1.1 200 OK,含若干数据块(例如 56B) - 业务推断:扫描/监控/批量采集类接口(根据路径与重复交互特征)
- 封装链路:
data → http → tcp → ip → eth,Wireshark 中可见Protocols in frame: eth:ethertype:ip:tcp:http:data
- IP/TCP 关键字段(GET 示例)
- IPv4:Version=4、IHL=20B、Flags=DF(不分片)、Fragment Offset=0、TTL=128(Windows 常见)、Protocol=6(TCP)
- TCP:Source Port=临时端口、Dest Port=80、
Seq=1, Ack=1, Len=573(首个数据段)
五、实战过滤规则清单(可直接复制)
- 仅看某服务器 HTTP 流量:
ip.addr == x.x.x.x && http && tcp.port == 80 - 仅看 DNS 解析:
dns || udp.port == 53 - 排除 ARP 广播:
!arp - 同时看 DHCP 与 ARP:
dhcp or arp - 仅看某设备 DHCP:
dhcp and eth.addr == 00-E0-70-D0-6A-AE - 过滤客户端某临时端口流量:
tcp.port == 4694 - 精准定位 HTTPS:
tls and tcp.dstport == 443 - 追踪 TCP 流后配合筛选端点:在"追踪流"窗口确认四元组,再用
ip.src/dst与tcp.srcport/dstport组合筛选
捕获过滤器常用(抓包前设置):
host 192.168.31.145tcp port 80src host 192.168.31.145 and dst port 80
六、排障建议与常见问题
- "全是 ARP/广播,业务包很少?"
- 可能抓在错误接口/镜像口;或过滤条件不当。先用
tcp || udp || icmp初筛。
- 可能抓在错误接口/镜像口;或过滤条件不当。先用
- "TCP 重传/乱序很多?"
- 检查链路质量(丢包、MTU、双工不匹配、队列拥塞)、服务器负载与应用超时。
- "UDP 分析困难,很多 open|filtered 场景?"
- 结合协议脚本/特定负载(DNS/NTP/DHCP 等),使用
-sV/特定脚本(如在服务端侧或配合 Nmap/NSE)。
- 结合协议脚本/特定负载(DNS/NTP/DHCP 等),使用
- "HTTPS 看不到明文?"
- 使用服务器 SSLKEYLOGFILE 或代理方式复现;或抓 TLS 握手阶段验证证书/套件/版本是否异常。
七、术语速记与小抄
- 层级映射:
eth → ip → tcp/udp → http/dns/... - 常见协议过滤:
http、tls、dns、arp、icmp - 端口过滤:
tcp.port==80、udp.port==53 - 组合逻辑:
and/&&、or/||、not/! - 追踪流快捷键:TCP=
Ctrl+Alt+Shift+T,HTTP=Ctrl+Alt+Shift+H - DF(Don't Fragment):禁止分片;MTU 不足将触发 ICMP 不可达
- TTL:每经一跳减 1,Windows 常见 128,Linux 常见 64
- DHCP DORA:Discover → Offer → Request → ACK(Transaction ID 贯穿一次事务)