第二章 抓包工具入门:Wireshark安装与界面介绍、基本抓包操作、过滤规则快速上手
2.1 为什么是Wireshark?
市面上抓包工具不少,tcpdump、tshark、Fiddler、Charles……但Wireshark依然是协议分析领域的“瑞士军刀”。
我个人选择它的理由很简单:图形化界面直观、协议解析支持超过3000种、社区活跃、跨平台。
你想想看,一个工具能让你同时看到原始字节流、解析后的协议字段、甚至还能跟着tcp流重组的应用层数据——这还不够香吗?
2.2 安装:别让这第一步卡住你
安装本身没什么技术含量,但有三个坑我得先说清楚,免得你像我当年那样来回折腾。
Windows 安装要点
- 从官方下载.exe,右键以管理员身份运行
- Npcap勾选“Support raw 802.11 traffic”(如果你要抓Wi-Fi监控模式)
- 安装完成后重启一次,否则网卡驱动可能没加载好
macOS 安装要点
- 推荐Homebrew:
brew install --cask wireshark - 安装后会在/Library/Application Support/Wireshark/下生成ChmodBPF启动项
- 如果发现没有抓包权限,手动运行:
sudo chmod 644 /dev/bpf*
Linux 安装要点
- apt(Debian/Ubuntu):
sudo apt install wireshark - 安装过程中会问“是否允许非root用户抓包”,选Yes
- 如果选了No,加用户组:
sudo usermod -a -G wireshark $USER,再重新登录
嗯,这里要注意:曾经有个同事在Ubuntu上搞了半小时都抓不到包,最后发现是忘了重新登录——加组后必须logout再login。
2.3 界面介绍:别被那么多面板吓到
第一次打开Wireshark,满屏的数据,普通人可能直接懵了。别急,核心就四个区域。
| 区域名称 | 位置 | 作用 | 快捷键 |
|---|---|---|---|
| 过滤器工具栏 | 最上方 | 输入显示过滤表达式,实时筛选包 | Ctrl+↑/↓ |
| 包列表窗格 | 中间上部 | 罗列每个抓到的包,显示序号、时间、源/目的地址、协议、长度、信息 | Tab切换焦点 |
| 包详情窗格 | 中间下部 | 展示选中包的协议树,可展开/折叠 | 右键→“Follow Stream” |
| 包字节窗格 | 最下方 | 原始16进制+ASCII对照,方便逐字节分析 | Ctrl+Shift+B |
我个人的习惯:刚打开Wireshark时,先把包列表的“Time”列改为“Seconds since previous captured packet”,这样看延迟更直观。
2.4 基本抓包操作:三分钟上手
操作真的是傻瓜式,但有几个细节值得记一下。
- 选择抓包接口:主界面点击“捕获”→“选项”,勾选你要监听的网卡(Wi-Fi、以太网、Loopback等)。
- 开始抓包:点击蓝色鲨鱼鳍图标,或者按Ctrl+E。
- 停止抓包:红色方块图标,或者再次按Ctrl+E。
- 保存文件:Ctrl+S,格式默认.pcapng,也可选.pcap(兼容旧版)。
- 重新打开:Ctrl+O,支持.pcapng/.pcap/.cap等。
host 192.168.1.100再开抓。
2.5 过滤规则快速上手:不学会这个你什么都干不了
抓包只是第一步,从几万甚至几十万个包里找到你想要的那一条——这才是核心能力。Wireshark有两种过滤:捕获过滤(抓之前)和显示过滤(抓之后)。
2.5.1 捕获过滤(Capture Filter)
在捕获选项窗口里设置,使用BPF(Berkeley Packet Filter)语法,语法比显示过滤更严格,但效率更高。
举个例子:
host 10.0.0.1 and tcp port 80
这句的意思是:只抓源或目的IP为10.0.0.1且TCP端口为80的数据包。BPF不支持协议层过滤(比如http),只能基于链路层/网络层/传输层字段。
常用的捕获过滤表达式我列个表:
| 需求 | BPF表达式 |
|---|---|
| 只抓某个IP | host 192.168.1.1 |
| 抓某个网段 | net 192.168.0.0/16 |
| 只抓UDP | udp |
| 抓特定TCP端口 | tcp port 443 |
| 排除某个MAC | not ether host 00:11:22:33:44:55 |
| 只抓非本机环回流量 | not broadcast and not multicast |
2.5.2 显示过滤(Display Filter)
这才是Wireshark的杀手锏。抓包完成后,在过滤器工具栏输入表达式,按Enter立刻生效。语法比BPF丰富得多,能直接过滤应用层字段。
基础格式:协议.字段 操作符 值
http.request.method == "GET"
tcp.port == 443
ip.src == 10.0.0.1
dns.qry.name contains "baidu"
常用显示过滤速查:
| 需求 | 显示过滤表达式 |
|---|---|
| 只看HTTP GET请求 | http.request.method == "GET" |
| 只看TCP三次握手 | tcp.flags.syn == 1 |
| 只看重传包 | tcp.analysis.retransmission |
| 只看从某个IP发出的DNS查询 | dns.qry.name && ip.src == 10.0.0.1 |
| 只看特定TLS版本 | tls.handshake.version == 0x0304 |
| 过滤包含特定字符串的包(不区分协议) | frame contains "password" |
| 使用逻辑或 | http or tls |
| 排除某些端口 | !tcp.port == 22 |
我记得有一次调试一个WebSocket连接异常,Wireshark里几万个包根本看不完。后来我只用了websocket加ip.addr == 192.168.1.50,几秒钟就锁定了问题:一个FIN包被中间防火墙拦截了。
2.6 本章知识体系总览
下面的流程图帮你把脑子里刚装进去的知识串起来:
说白了,拿到Wireshark干三件事:安装好(别忘装底层驱动)→ 选对网卡开抓 → 用过滤器快速定位到目标包。后面所有协议分析都建立在这三步之上。
2.7 本章避坑清单
- Windows上抓不到Wi-Fi包?八成是没开混杂模式或者Npcap版本不对。
- macOS上显示“You don’t have permission”?运行一下
sudo /Library/Application\ Support/Wireshark/ChmodBPF/ChmodBPF。 - 捕获过滤写
port 80发现抓到的不全是HTTP?因为端口80也可能是别的协议,需要配合tcp port 80缩小范围。 - 显示过滤大小写敏感吗?字段名和比较值都是大小写敏感的,比如
http.request.method == "GET"不能写成get。