第1章 Wireshark基础:抓包原理、界面布局与过滤器
说实话,很多刚入行的朋友一打开Wireshark就懵了——满屏的协议、花花绿绿的包、一堆看不懂的选项。我当年也是这样。但别急,这一章咱们先把地基打牢。
Wireshark说白了就是一个网络嗅探器。它把网卡上流过的数据包原封不动地复制一份,然后拆开给你看。嗯,这里要注意:它只是“看”,不会修改任何数据包。这一点和某些攻击工具完全不同。
1.1 抓包原理:数据包是怎么被“截获”的?
Wireshark依赖底层库(Windows上是Npcap/WinPcap,Linux/macOS上是libpcap)来捕获原始数据包。这些库直接和网卡驱动打交道,把网卡设置为“混杂模式”。
什么是混杂模式?普通模式下,网卡只接收发给自己的包。混杂模式就不一样了——经过网卡的所有包,不管是不是发给你的,统统收进来。我在一次数据中心排障时,就是靠这个模式抓到了隔壁交换机误转发的广播风暴。
抓包流程大致如下:
- 网卡接收物理信号,还原成以太网帧
- Npcap/libpcap从驱动层复制帧数据
- Wireshark接收原始帧,按协议栈逐层解析
- 解析结果展示在用户界面,同时可保存为pcapng文件
核心要点:Wireshark只做“复制+解析”,不发送任何数据。所以用它排查网络问题,不会对现网造成任何影响。
下面这张图能帮你快速理解抓包的完整链路:
1.2 界面布局:别被满屏信息吓到
Wireshark的界面其实就五大块。我习惯把它们叫做“五区一线”。你花5分钟熟悉一下,后面操作就顺手了。
| 区域名称 | 位置 | 作用 |
|---|---|---|
| 菜单栏/工具栏 | 最顶部 | 文件操作、捕获控制、统计工具、帮助等 |
| 显示过滤器栏 | 工具栏下方 | 输入过滤表达式,只显示你关心的包 |
| 数据包列表 | 中间上半部分 | 显示所有捕获到的包,每行一个 |
| 数据包详情 | 中间下半部分 | 选中某个包后,按协议层级展开显示 |
| 数据包字节 | 最底部 | 原始十六进制+ASCII码显示 |
我的小技巧:双击“数据包详情”区域的分隔线,可以快速展开或收起详情区。排查重传时,我经常把详情区拉大,方便看TCP序列号。
1.3 首选项配置:用之前先调好这几个地方
Wireshark默认配置能用,但有些设置不改会踩坑。我曾经在客户现场抓了半小时,回去发现包没保存——就是因为没配自动保存。下面这几个配置,我建议你上手就改。
- 自动保存捕获文件:Edit → Preferences → Capture → 勾选“Use multiple files”,设置文件大小(比如20MB)和文件数量。防止抓大流量时内存爆掉。
- 时间显示格式:View → Time Display Format → 选“Seconds Since Beginning of Capture”。排查延迟时,这个格式最直观。
- 禁用名称解析:Capture → Options → 取消勾选“Enable MAC name resolution”、“Enable network name resolution”、“Enable transport name resolution”。解析会拖慢速度,还容易暴露内部域名。
- 调整列显示:右键点击列表列头 → Column Preferences → 添加“Delta time”(前后包时间差)和“TCP Stream index”。这两个列对定位重传非常有用。
注意:生产环境抓包时,务必先禁用名称解析。否则Wireshark会发DNS查询,万一DNS服务器挂了,抓包界面会卡死。别问我怎么知道的……
1.4 捕获过滤器 vs 显示过滤器:到底该用哪个?
这个问题我几乎每次培训都会被问到。说白了,两者最大的区别就是“时机”。
捕获过滤器在抓包时就生效——符合条件的包才抓进来,不符合的直接丢掉。它用的是BPF(Berkeley Packet Filter)语法,效率极高,但表达能力有限。
显示过滤器在抓完包之后生效——所有包都已经在内存里了,你通过表达式筛选出想看的。它用的是Wireshark自己的语法,功能强大,但处理的是已经抓到的数据。
我举个例子你就明白了:
| 对比项 | 捕获过滤器 | 显示过滤器 |
|---|---|---|
| 生效时机 | 抓包过程中 | 抓包完成后 |
| 语法 | BPF(简洁但有限) | Wireshark专用(丰富灵活) |
| 性能 | 高(内核层过滤) | 中等(用户层过滤) |
| 典型场景 | 只抓某台主机的流量 | 从全量数据中分析特定协议 |
| 示例 | host 192.168.1.1 |
ip.addr == 192.168.1.1 |
实际工作中,我通常这样搭配:
- 用捕获过滤器缩小范围——比如只抓某个IP或某个端口,减少无用数据量
- 用显示过滤器深入分析——比如从抓到的数据里找出所有TCP重传包
实战建议:如果你不确定要抓什么,就别用捕获过滤器。全量抓下来,再用显示过滤器慢慢筛。硬盘便宜,但漏掉的包找不回来。
1.5 过滤器语法速查:常用的几个表达式
这里我整理了一份常用过滤器对照表。你把它存下来,后面几章会反复用到。
| 需求 | 捕获过滤器(BPF) | 显示过滤器 |
|---|---|---|
| 抓特定IP | host 10.0.0.5 |
ip.addr == 10.0.0.5 |
| 抓特定端口 | port 443 |
tcp.port == 443 |
| 抓HTTP流量 | tcp port 80 |
http |
| 抓DNS查询 | udp port 53 |
dns |
| 只看重传包 | 不支持 | tcp.analysis.retransmission |
| 只看TCP握手 | 不支持 | tcp.flags.syn == 1 |
快速输入技巧:在显示过滤器栏输入时,Wireshark会自动弹出提示。按Tab键补全,按Enter应用。我基本不手打完整表达式,都是靠自动补全。