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 读这个文件就能解密。

配置步骤:

  1. 打开 Wireshark → Edit → Preferences → Protocols → TLS
  2. 在 "(Pre)-Master-Secret log filename" 处,指定一个文件路径,比如 C:\Users\你的用户名\sslkey.log
  3. 保存配置

注意:这个文件路径必须和后面环境变量 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 系统配置

  1. 右键「此电脑」→ 属性 → 高级系统设置 → 环境变量
  2. 在「系统变量」或「用户变量」中点击「新建」
  3. 变量名:SSLKEYLOGFILE
  4. 变量值:C:\Users\你的用户名\sslkey.log(路径随意,但必须和 Wireshark 里配的一致)
  5. 确定后,重启浏览器(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 本章知识体系总览

为了让你更直观地理解本章内容的结构,我画了一张图:

Wireshark 环境准备知识体系 Wireshark 环境准备知识体系 安装与基础配置 TLS 解密设置 过滤表达式基础 下载安装 Npcap 驱动 偏好设置 SSLKEYLOGFILE RSA 私钥 环境变量配置 显示过滤器 捕获过滤器 组合表达式 核心原则:先配环境,再抓包;先过滤,再分析 SSLKEYLOGFILE 是 TLS 解密的「钥匙」,过滤表达式是「放大镜」

2.6 验证环境是否就绪

配置完了,怎么知道能不能用?我教你一个快速验证的方法:

  1. 启动 Wireshark,选择你的网卡开始抓包
  2. 在显示过滤器里输入 tls.handshake.type == 1
  3. 打开浏览器访问 https://www.baidu.com
  4. 如果看到 Client Hello 包,说明抓包正常
  5. 再输入 tls,随便点开一个 TLS 包,在 Packet Details 面板里看 Decrypted TLS 部分
  6. 如果能看到明文的应用层数据(比如 HTTP 请求头),说明解密配置成功

小技巧:如果解密没生效,检查两点:一是 SSLKEYLOGFILE 路径是否和 Wireshark 里配的一致;二是浏览器是否从正确的终端启动(Windows 下一般没问题,macOS 要注意)。