2. 抓包工具入门:Wireshark的安装、界面布局、抓包过滤器与显示过滤器

说实话,很多学网络协议的人,都卡在了第一步——工具没选对,或者不会用。Wireshark 就是那个能让你「看见」数据包在网线上怎么跑的工具。我当年第一次用它抓到三次握手的时候,那种感觉,就像第一次用显微镜看到了细胞。

这一章,咱们就把 Wireshark 装好、界面认熟、过滤器用明白。别怕,上手很快。

2.1 安装与初识

Wireshark 的安装其实没什么坑,但有几个细节我提醒一下。

2.1.1 下载与安装要点

  • 官网下载:去 wireshark.org 下,别去第三方站点。我见过有人下到带广告的捆绑版。
  • Windows 安装:安装过程中会提示安装 Npcap,一定要勾选。没有它,Wireshark 抓不到包。
  • macOS 安装:建议用 Homebrew 装,命令就一行 brew install wireshark。记得还要装 chmodbpf 或者给权限,否则看不到网卡。
  • Linux 安装:sudo apt install wireshark 或者 yum install wireshark。装完后要把自己加到 wireshark 用户组,不然每次都要 sudo。
注意:Npcap 安装时,如果选了「WinPcap 兼容模式」,可能会和旧工具冲突。我个人习惯直接选「Npcap 最新模式」,干净。

2.1.2 启动后的第一眼

打开 Wireshark,你会看到一个网卡列表。每个网卡旁边都有实时流量的小波形图。选一个你正在上网的网卡(比如 Wi-Fi 或以太网),双击,就开始抓包了。

嗯,这时候屏幕上会疯狂刷数据。别慌,这就是正常的。

2.2 界面布局:四个核心区域

Wireshark 的界面分成四大块,我习惯叫它们「四层楼」。

Wireshark 界面四层结构 ① 工具栏 / 过滤器栏 抓包控制、显示过滤器输入框、常用按钮 ② 数据包列表窗格 编号 | 时间 | 源地址 | 目的地址 | 协议 | 长度 | 信息摘要 点击某一行,下方会显示该包的详细内容 ③ 协议树窗格 Frame → Ethernet II → IP → TCP → HTTP 每一层都可以展开,查看具体字段值 ④ 原始字节窗格 左侧十六进制,右侧 ASCII 可读字符 选中协议树中的某个字段,这里会高亮对应的字节

2.2.1 数据包列表窗格

这是你盯得最多的区域。每一行就是一个数据包。默认显示编号、时间、源地址、目的地址、协议、长度、信息摘要。

几个小技巧:

  • 点击列标题可以排序。比如按「协议」排序,就能把 HTTP、TCP、DNS 分组看。
  • 右键某一行 → 「Follow Stream」→ 「TCP Stream」,可以看整个 TCP 会话的原始数据。这个功能我几乎天天用。
  • 颜色规则:Wireshark 默认会给不同协议上色。TCP 是淡紫,HTTP 是绿,DNS 是蓝。你可以在「View → Coloring Rules」里自定义。

2.2.2 协议树窗格

选中一个包,下面就会展开它的协议树。从最外层的 Frame(帧)开始,一层层剥开:

Frame: 物理层信息(帧长度、捕获时间)
Ethernet II: 数据链路层(源 MAC、目的 MAC、类型)
Internet Protocol Version 4: 网络层(源 IP、目的 IP、TTL)
Transmission Control Protocol: 传输层(源端口、目的端口、序列号、确认号)
Hypertext Transfer Protocol: 应用层(请求行、头部、正文)

每个字段都可以展开。比如点开 TCP 层,你能看到 Sequence Number、Acknowledgment Number、Flags(SYN、ACK、FIN 等)。

我的习惯:抓包分析时,我一般先看「信息摘要」列,快速定位感兴趣的包。然后点开协议树,重点看 TCP 层的 Flags 和 Sequence Number。这样效率最高。

2.2.3 原始字节窗格

这个窗格显示的是最原始的二进制数据。左边是十六进制,右边是对应的 ASCII 字符。如果你在协议树里选中了某个字段,这里会自动高亮对应的字节。

举个例子:你选中了 TCP 层的「Source Port: 443」,原始字节窗格里就会高亮两个字节——那就是端口号 443 的十六进制表示 01 bb。

2.3 抓包过滤器:抓之前就过滤

抓包过滤器是在抓包开始前设置的。它的作用是让 Wireshark 只抓你关心的包,不抓的包直接丢弃。这样可以减少磁盘占用,也避免界面刷屏。

2.3.1 语法规则

抓包过滤器用的是 BPF(Berkeley Packet Filter)语法。核心格式是:

[协议] [方向] [类型] [值]

常用例子:

需求 过滤器表达式
只抓某个 IP 的包 host 192.168.1.1
只抓某个端口的包 port 80
只抓 HTTP 或 DNS port 80 or port 53
只抓某个网段的包 net 192.168.0.0/24
只抓 TCP 包 tcp
排除某个 IP not host 10.0.0.1
避坑指南:抓包过滤器不支持「字段内匹配」,比如你不能写 tcp.flags.syn == 1。那是显示过滤器的事。我曾经在项目里搞混过,抓了半天发现包没抓到,就是因为把显示过滤器的语法写到了抓包过滤器里。

2.3.2 在哪里设置

在 Wireshark 主界面,网卡列表上方有一个输入框,写着「Capture Filter」。点旁边的「Bookmark」按钮可以保存常用过滤器。我一般会存几个:

  • port 80 or port 443 —— 看 HTTP/HTTPS
  • host 192.168.1.100 —— 盯一台机器
  • tcp port 3306 —— 抓 MySQL 查询

2.4 显示过滤器:抓完之后再筛选

显示过滤器是在抓包完成后使用的。它不会删除包,只是隐藏不符合条件的包。这是你日常分析时最常用的工具。

2.4.1 语法规则

显示过滤器的语法更丰富,可以精确到协议字段。格式是:

[协议].[字段] [运算符] [值]

常用运算符:==、!=、>、<、contains、matches。

常用例子:

需求 过滤器表达式
只看 TCP SYN 包 tcp.flags.syn == 1 and tcp.flags.ack == 0
只看 HTTP GET 请求 http.request.method == "GET"
只看某个 IP 的通信 ip.addr == 192.168.1.1
只看某个 TCP 流 tcp.stream eq 0
只看 DNS 查询域名 dns.qry.name contains "baidu"
排除 ARP 包 !arp

2.4.2 输入框的智能提示

Wireshark 的显示过滤器输入框有自动补全。你输入 tcp.,它会列出所有可用的 TCP 字段。输入 http.,会列出 HTTP 字段。这个功能很贴心,我经常靠它回忆字段名。

小技巧:如果你不确定字段名,可以在协议树里找到那个字段,右键 → 「Apply as Filter」→ 「Selected」。Wireshark 会自动帮你生成正确的过滤器表达式。

2.4.3 过滤器表达式组合

你可以用逻辑运算符组合多个条件:

  • and(与):ip.src == 192.168.1.1 and tcp.port == 80
  • or(或):tcp.port == 80 or tcp.port == 443
  • not(非):not arp
  • 括号分组:(ip.src == 192.168.1.1 or ip.dst == 192.168.1.1) and tcp

2.5 两种过滤器的对比

对比维度 抓包过滤器 显示过滤器
使用时机 抓包开始前 抓包完成后
语法基础 BPF(Berkeley Packet Filter) Wireshark 自定义语法(更丰富)
是否影响抓取结果 是,不匹配的包直接丢弃 否,只是隐藏显示
能否使用字段级条件 不能(如 tcp.flags.syn) 能(如 tcp.flags.syn == 1)
典型场景 只抓某个 IP 或端口,减少数据量 在大量数据中精确查找特定包
我的建议:日常调试时,我一般不用抓包过滤器,而是先全量抓,然后用显示过滤器慢慢筛。因为有时候你觉得自己只关心某个端口,但实际问题的线索可能藏在其他端口的包里。全量抓,再过滤,不会遗漏。

2.6 实战:第一次抓包

咱们来动手抓一个 HTTP 请求。跟着我做:

  1. 打开 Wireshark,选择你的上网网卡,双击开始抓包。
  2. 打开浏览器,访问一个 HTTP 网站(比如 http://example.com)。
  3. 回到 Wireshark,点击红色方块停止抓包。
  4. 在显示过滤器输入框里输入 http,回车。
  5. 你会看到一堆 HTTP 包。找到第一个 GET / HTTP/1.1 的包,点开。
  6. 在协议树里展开 HTTP 层,看看请求行和头部。
  7. 再展开 TCP 层,看看源端口、序列号、确认号。

嗯,就这么简单。你已经在「看」协议了。

避坑指南:如果你抓不到 HTTP 包,很可能是因为现在大部分网站都强制 HTTPS 了。HTTPS 是加密的,Wireshark 看不到明文。所以测试时一定要用 HTTP 网站,或者用 http://httpbin.org 这种纯 HTTP 站点。