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。
2.1.2 启动后的第一眼
打开 Wireshark,你会看到一个网卡列表。每个网卡旁边都有实时流量的小波形图。选一个你正在上网的网卡(比如 Wi-Fi 或以太网),双击,就开始抓包了。
嗯,这时候屏幕上会疯狂刷数据。别慌,这就是正常的。
2.2 界面布局:四个核心区域
Wireshark 的界面分成四大块,我习惯叫它们「四层楼」。
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 等)。
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/HTTPShost 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 字段。这个功能很贴心,我经常靠它回忆字段名。
2.4.3 过滤器表达式组合
你可以用逻辑运算符组合多个条件:
and(与):ip.src == 192.168.1.1 and tcp.port == 80or(或):tcp.port == 80 or tcp.port == 443not(非):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 请求。跟着我做:
- 打开 Wireshark,选择你的上网网卡,双击开始抓包。
- 打开浏览器,访问一个 HTTP 网站(比如
http://example.com)。 - 回到 Wireshark,点击红色方块停止抓包。
- 在显示过滤器输入框里输入
http,回车。 - 你会看到一堆 HTTP 包。找到第一个
GET / HTTP/1.1的包,点开。 - 在协议树里展开 HTTP 层,看看请求行和头部。
- 再展开 TCP 层,看看源端口、序列号、确认号。
嗯,就这么简单。你已经在「看」协议了。
http://httpbin.org 这种纯 HTTP 站点。