2. Wireshark 环境准备:工欲善其事,必先利其器
说实话,我见过太多人拿着 Wireshark 抓了一大堆包,结果一看全是乱码。为什么?环境没配好。尤其是 TLS 解密,你不提前把钥匙准备好,抓到的全是加密的「天书」。这一章,咱们就把环境彻底搞定。
本章核心目标:装好 Wireshark,配好 TLS 解密环境,学会用过滤表达式快速定位数据包。搞定这三步,后面的实战才能打得开。
2.1 Wireshark 安装与基础配置
Wireshark 的安装其实没什么难度,但我有几点个人习惯想分享给你。
2.1.1 下载与安装
- 官方渠道:去
wireshark.org下载,别去第三方站点。我曾经见过有人从某下载站装了个带广告的版本,抓包时弹窗,差点误了事。 - 版本选择:我建议用最新的稳定版(比如 4.x 系列)。别追最新开发版,稳定性第一。
- 安装组件:安装时记得勾选 Npcap(Windows 下必须)。Npcap 是底层抓包驱动,不装它你连网卡都看不到。
小提示:macOS 用户可以用 brew install wireshark,但记得还要装 brew install wireshark-chmodbpf 来获取抓包权限。Linux 用户更简单,sudo apt install wireshark 搞定。
2.1.2 基础配置项
装好后,先别急着抓包。我建议你改几个配置,能省不少事:
| 配置项 | 推荐值 | 为什么改 |
|---|---|---|
| Edit → Preferences → Appearance → Layout | 选择「Packets + Packet Details + Packet Bytes」三栏布局 | 一眼看到数据包结构,不用来回切换 |
| Edit → Preferences → Capture → "Update list of packets in real time" | 勾选 | 抓包时实时看到数据流,方便判断是否抓到目标流量 |
| Edit → Preferences → Name Resolution → "Resolve MAC addresses" | 取消勾选 | 避免 Wireshark 去查 MAC 厂商,拖慢界面响应 |
| Edit → Preferences → Protocol → TLS → "(Pre)-Master-Secret log filename" | 稍后配置 | 这是 TLS 解密的关键入口,下面会细讲 |
嗯,这里要注意:Name Resolution 里的「Resolve network addresses」我一般也不勾。虽然它能显示域名,但会发 DNS 查询,抓包时反而会引入额外流量,干扰分析。
2.2 TLS 解密基础设置
你想想看,抓到的 TLS 包全是加密的,你怎么知道里面是啥?除非你有密钥。Wireshark 支持两种主流解密方式,我分别讲一下。
2.2.1 方法一:使用 (Pre)-Master-Secret 日志文件
这是最常用的方法。浏览器或应用会把会话密钥写到一个日志文件里,Wireshark 读这个文件就能解密。
配置步骤:
- 打开 Wireshark → Edit → Preferences → Protocols → TLS
- 在 "(Pre)-Master-Secret log filename" 处,指定一个文件路径,比如
C:\Users\你的用户名\sslkey.log - 保存配置
注意:这个文件路径必须和后面环境变量 SSLKEYLOGFILE 设置的一致。我曾经见过有人配了两个不同的路径,结果 Wireshark 读不到密钥,折腾了半天才发现。
2.2.2 方法二:使用 RSA 私钥解密(仅限 RSA 密钥交换)
这个方法现在用得少了,因为大部分 TLS 1.3 和现代的 TLS 1.2 都用了 ECDHE 密钥交换,RSA 私钥根本解不了。但如果你遇到老系统,可以试试:
- 在 Protocols → TLS → RSA keys list 里添加私钥文件
- 需要提供私钥密码(如果有的话)
- 只能解密使用 RSA 密钥交换的会话
说白了,这个方法局限性很大。我建议你优先用 SSLKEYLOGFILE 方式,通用性更强。
2.3 SSLKEYLOGFILE 环境变量配置
这是整个 TLS 解密的核心。环境变量 SSLKEYLOGFILE 告诉浏览器或应用:「把密钥写到我指定的文件里」。Wireshark 再从那个文件读密钥。
2.3.1 Windows 系统配置
- 右键「此电脑」→ 属性 → 高级系统设置 → 环境变量
- 在「系统变量」或「用户变量」中点击「新建」
- 变量名:
SSLKEYLOGFILE - 变量值:
C:\Users\你的用户名\sslkey.log(路径随意,但必须和 Wireshark 里配的一致) - 确定后,重启浏览器(Chrome、Edge、Firefox 都支持)
验证方法:打开浏览器访问一个 HTTPS 网站,然后去 C:\Users\你的用户名\ 下看看有没有生成 sslkey.log 文件。如果文件有内容(里面是十六进制字符串),说明配置成功。
2.3.2 macOS / Linux 系统配置
在终端里执行:
export SSLKEYLOGFILE=~/sslkey.log
但这样只在当前终端会话有效。我建议你把它加到 shell 配置文件中:
# 对于 bash 用户
echo 'export SSLKEYLOGFILE=~/sslkey.log' >> ~/.bashrc
# 对于 zsh 用户(macOS 默认)
echo 'export SSLKEYLOGFILE=~/sslkey.log' >> ~/.zshrc
# 然后重新加载
source ~/.bashrc # 或 source ~/.zshrc
然后从终端启动浏览器(比如 google-chrome 或 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome),密钥就会写入 ~/sslkey.log。
避坑指南:我曾经在 macOS 上折腾了半天,发现从 Dock 点击 Chrome 图标启动时,环境变量没生效。为什么?因为 Dock 启动的进程不继承 shell 的环境变量。必须从终端启动浏览器,或者用 launchctl setenv SSLKEYLOGFILE ~/sslkey.log 设置全局环境变量。
2.4 过滤表达式基础
抓包时数据包成千上万,你不可能一个个翻。过滤表达式就是你的「搜索神器」。我挑几个最常用的讲,够你应付 90% 的场景。
2.4.1 显示过滤器 vs 捕获过滤器
| 类型 | 作用时机 | 语法 | 典型场景 |
|---|---|---|---|
| 显示过滤器 | 抓包后,对已捕获的数据包进行过滤 | Wireshark 表达式(更丰富) | 分析时快速定位特定协议、IP、端口 |
| 捕获过滤器 | 抓包前,只捕获符合条件的数据包 | BPF(Berkeley Packet Filter)语法 | 只抓特定流量,减少文件大小 |
我个人习惯:大部分时间用显示过滤器。因为捕获过滤器一旦设错,数据就丢了,得重新抓。显示过滤器随时可以改,灵活得多。
2.4.2 最常用的显示过滤器
这些是我每天都会用到的,你记下来就行:
tls或ssl— 只看 TLS/SSL 协议的数据包tcp.port == 443— 只看 443 端口的流量ip.addr == 192.168.1.1— 只看某个 IP 的流量tls.handshake.type == 1— 只看 Client Hello 包(TLS 握手第一步)tls.handshake.type == 2— 只看 Server Hello 包tls.record.content_type == 23— 只看应用数据(加密后的实际内容)http2— 如果 TLS 上层是 HTTP/2,这个能直接过滤
组合使用:你可以用 and、or、not 组合条件。比如 tls and ip.addr == 10.0.0.5 表示「只看 10.0.0.5 的 TLS 流量」。
2.4.3 捕获过滤器示例
如果你确定只抓某个端口的流量,可以用捕获过滤器减少干扰:
# 只抓 443 端口的 TCP 流量
tcp port 443
# 只抓某个 IP 的流量
host 192.168.1.1
# 只抓某个网段的流量
net 192.168.1.0/24
嗯,这里要注意:捕获过滤器用的是 BPF 语法,不支持 tls 这种高级协议名。你只能基于 IP、端口、协议号来过滤。
2.5 本章知识体系总览
为了让你更直观地理解本章内容的结构,我画了一张图:
2.6 验证环境是否就绪
配置完了,怎么知道能不能用?我教你一个快速验证的方法:
- 启动 Wireshark,选择你的网卡开始抓包
- 在显示过滤器里输入
tls.handshake.type == 1 - 打开浏览器访问
https://www.baidu.com - 如果看到 Client Hello 包,说明抓包正常
- 再输入
tls,随便点开一个 TLS 包,在 Packet Details 面板里看 Decrypted TLS 部分 - 如果能看到明文的应用层数据(比如 HTTP 请求头),说明解密配置成功
小技巧:如果解密没生效,检查两点:一是 SSLKEYLOGFILE 路径是否和 Wireshark 里配的一致;二是浏览器是否从正确的终端启动(Windows 下一般没问题,macOS 要注意)。