HTTP/3 流量为什么抓不到?QUIC 抓包与解密的三种处理方式讲清楚

0 阅读13分钟

一、真实场景:抓包工具突然"失灵"了

如果你做过抓包分析,大概率遇到过这样的情况:手机或电脑上配好了代理,Wireshark 或某个抓包工具也开着,结果打开某个 App 或访问某个网站,请求列表里却空空如也——不是抓包工具坏了,也不是证书没装对,而是这条连接压根就没走 HTTP/1.1 或 HTTP/2,它走的是 HTTP/3,底层协议是 QUIC。

这几年,从主流浏览器到大厂 App,越来越多的服务端把 HTTP/3 作为默认协商协议之一。对使用者来说体验是"更快了";但对抓包分析的人来说,很多习惯了的老工具突然在这里"断档"——要么完全看不到流量,要么只能看到一堆加密的 UDP 包,翻遍工具菜单也找不到"解密 QUIC"这个选项。

这篇文章想把这件事讲透:HTTP/3/QUIC 到底为什么难抓、难解密,代理抓包和网卡抓包两条路各自能做到什么程度,以及实际操作时该怎么选。

二、HTTP/3 和 QUIC 到底是什么,为什么传统抓包工具搞不定它

2.1 HTTP/3 与之前的 HTTP/2 有什么本质区别

HTTP/1.1、HTTP/2 都建立在 TCP 之上,TLS 加密是"套"在 TCP 连接外面的一层。传统的 MITM(中间人)抓包工具——不管是代理型的还是网卡型的——本质上都是围绕"TCP + TLS"这套组合设计的:先劫持 TCP 三次握手,再在 TLS 握手阶段以自己签发的证书冒充目标服务器,从而拿到明文。

HTTP/3 则完全不同,它跑在 QUIC 协议之上,而 QUIC 是基于 UDP 的。这个底层变化带来几个直接后果:

  • 没有 TCP 握手可劫持:QUIC 自己在 UDP 之上实现了连接建立、可靠传输、拥塞控制,跟 TCP 完全是两套机制,传统"拦截 TCP 连接"的中间人手法在这里用不上。
  • 加密握手方式不同:QUIC 把 TLS 1.3 揉进了自己的传输层握手里,加密粒度做到了更小的数据单元(frame/packet 级别),不是简单地在 TCP 流外面"包"一层 TLS,导致老的中间人证书替换套路很难直接照搬。
  • 支持连接迁移:QUIC 连接是用连接 ID 标识的,不强绑定 IP:Port 四元组,客户端换网络(比如 Wi-Fi 切 4G)连接可以不断——这个特性对普通用户是好事,但对抓包工具的"跟踪一条连接"逻辑是额外的复杂度。

正因如此,很多传统抓包工具在 HTTP/3 面前基本"绕不过去":要么干脆识别不出这是应用流量,要么只能看着一堆加密 UDP 包干瞪眼。

2.2 那是不是就没法抓 HTTP/3 了

不是没法抓,而是需要专门针对 QUIC 设计处理逻辑,并且往往需要在"抓不抓得到"和"改不改变协议"之间做取舍。行业里常见的应对思路大致两类:一类是想办法让客户端"退回"到抓包工具擅长的协议;另一类是老老实实实现 QUIC 层面的中间人解密。具体怎么选,往往还要分"代理抓包"和"网卡抓包"两种场景来看,下面分别展开。

三、代理抓包场景:HTTP/3 处理的三档方式

代理抓包是最常见的抓包方式——设置系统或 App 的网络代理,把流量导到抓包工具本地起的代理服务上。以抓包鹰(Trace Eagle)为例,它在"接入设置"里把 HTTP/3 的处理拆成了三档,分别对应不同的取舍:

3.1 禁止(降级抓取)

这一档的思路是:既然 HTTP/3 难抓,那就想办法让客户端和服务端之间的协商结果落回 HTTP/2。具体做法是在协议协商阶段做手脚,让目标 App 感知不到 HTTP/3 可用,从而按标准的协议协商规则退回到 HTTP/2 或更早的版本,这样流量就重新落回了抓包工具擅长处理的轨道,可以像平时抓 HTTPS 一样正常抓取和解密。

需要说明的是,少数 App 对协议降级比较敏感(比如做了严格的协议一致性校验,或者干脆不支持 H2 兜底),这种情况下降级抓取可能不生效,需要换其他两档试试。

适用场景:想用最熟悉的方式(看 HTTP/2 请求列表)分析流量,且目标 App 对降级不敏感。

3.2 忽视(保真透传)

这一档不做任何解密尝试,原样转发 QUIC 数据包。好处是完全不干扰目标程序的正常数据请求——App 该怎么用 HTTP/3 就怎么用,你只是让这部分流量"路过"代理而已,不去动它的协议协商结果,也不做证书替换。

代价也很明显:既然不解密,你在抓包工具里看到的只是"这里有一条 QUIC 连接在跑",看不到应用层的具体请求内容。

适用场景:你只关心连通性、流量走向、有没有异常连接,或者目标 App 对协议变化极度敏感(降级/解密都可能导致业务异常),这时候"不打扰"反而是最稳妥的选择。

3.3 解密(真 H3 MITM)

这一档是真正在 QUIC/HTTP-3 协议层面做中间人:不降级、不透传,而是直接对 QUIC 连接做解密,像平时抓 HTTPS 明文一样看到 HTTP/3 请求的完整内容。这是三档里能拿到信息最完整的一档,但技术上对代理的要求也最高——传统代理服务本身走的还是"劫持 TCP + 替换证书"这条老路,处理不了 UDP 上的 QUIC 握手,所以真正的 H3 解密需要在无感代理模式下才能使用;普通/传统代理模式只支持"禁止(降级)"和"忽视(透传)"这两档。

适用场景:需要完整分析 HTTP/3 接口内容(比如逆向 App 接口、排查线上问题、安全审计),且已经在使用无感代理模式抓包。

三档的核心取舍可以简单归纳成一句话:降级换兼容性,透传换稳定性,解密换完整性,具体用哪一档,取决于你更在意"看得全"还是"不打扰"。

四、网卡抓包场景:QUIC 怎么处理

除了代理抓包,另一种常见方式是网卡层抓包(直接在网络接口上捕获数据包,类似 Wireshark 的思路,但叠加了解密能力)。这种场景下,HTTP/3/QUIC 同样是老大难问题——QUIC 在网卡层历来就难抓、难解,很多工具做到网卡这一层直接就没有 QUIC 相关能力了。

在网卡抓包场景下,通常有两条路可以选:

4.1 平滑回退

让目标 App 的 HTTP/3 连接平滑回退到普通连接(比如退回到基于 TCP 的 HTTPS),这样一来数据流就重新变得可抓、可解密。这里有两个值得关注的细节:

  • 回退是会话级的、可逆的:停止抓包会话后会自动恢复,不会遗留任何影响 App 之后正常使用的痕迹。
  • 回退不是"破坏",是"引导":目的只是让流量落回可分析的协议轨道,抓包结束后一切照旧。

4.2 直接解密 QUIC/HTTP-3

如果拿到了对应的密钥材料,也可以不做回退,直接在网卡层解开 QUIC/HTTP-3 报文看明文。这意味着即便面对一个已经全面 HTTP/3 化、看起来"武装到牙齿"的 App,也不至于对着一堆抓不动、看不懂的 QUIC 数据包毫无办法。

网卡抓包这两条路并不互斥,实际使用时可以根据目标 App 的行为(是否对协议变化敏感、是否方便拿到密钥)灵活选择。

五、手把手操作:在抓包鹰里切换 HTTP/3 处理方式

以代理抓包场景为例,操作步骤大致如下(具体界面文案以实际版本为准):

  1. 打开抓包鹰,进入"接入设置"页面。
  2. 找到 HTTP/3(QUIC)相关的处理选项,会看到三个档位:禁止、忽视、解密。
  3. 如果只是想让流量按 HTTP/2 抓取、走最熟悉的分析流程,选择"禁止(降级抓取)"。
  4. 如果目标 App 对协议变化敏感,或者你只关心连通性、不需要看明文内容,选择"忽视(保真透传)"。
  5. 如果需要完整看到 HTTP/3 请求明文,先确认当前抓包接入方式是无感代理模式(而非传统代理模式),再选择"解密"档位。
  6. 保存设置后重新发起抓包会话,针对目标 App 的连接验证效果——观察请求列表里对应连接是否按预期展示为 HTTP/2 明文、静默透传的 QUIC 连接,或是解密后的 HTTP/3 请求。

如果走的是网卡抓包场景,思路类似:先确认目标 App 是否已经在用 HTTP/3,如果抓不到,检查是否需要启用"平滑回退",或者确认是否已具备解密所需的密钥材料以走"直接解密"路径。

六、常见问题 FAQ

Q1:降级抓取会不会影响 App 的正常使用? 降级的本意是让协议协商结果落到 HTTP/2,多数场景下 App 的业务逻辑不会因为底层协议从 HTTP/3 变成 HTTP/2 而受影响,因为这一层对上层业务通常是透明的。但极少数对协议做了严格校验或强依赖 HTTP/3 特性(如 0-RTT)的 App,可能会出现异常,这也是为什么保留了"忽视透传"这一档作为退路。

Q2:为什么"解密"这一档必须用无感代理模式,普通代理不行吗? 传统代理服务的中间人机制是围绕"劫持 TCP 连接 + 替换 TLS 证书"设计的,而 QUIC 跑在 UDP 之上、握手方式也不同,传统代理架构处理不了这套东西。无感代理模式在设计上具备处理 QUIC 层握手和解密的能力,所以真正的 H3 明文解密只能在这个模式下开启。

Q3:网卡抓包里"平滑回退"停止后,App 会一直停留在被回退的状态吗? 不会。回退是跟抓包会话绑定的,抓包会话停止后会自动恢复,不影响 App 之后的正常联网和使用。

Q4:如果一个 App 完全不支持降级也不方便拿到密钥,是不是就彻底看不到内容了? 这种情况下,"忽视(保真透传)"或者网卡抓包场景的直接观察仍然能确认连接的存在、流向、频率等元信息,只是看不到应用层明文。如果确实需要明文,通常还是要具备密钥获取条件或者确认目标 App 能接受降级/解密处理。

Q5:三档处理方式需要针对每个 App 单独配置吗? 一般是在接入设置里做全局或按需的策略选择,具体到某个 App 是否受影响,取决于该 App 自身对协议变化的敏感程度,实际使用时建议针对目标 App 逐一验证效果。

Q6:HTTP/3 抓包和普通 HTTPS 抓包在证书安装上有区别吗? 证书信任这一步是通用的(无论抓的是 HTTP/1.1、HTTP/2 还是解密后的 HTTP/3,中间人都需要客户端信任对应的根证书),区别主要在于协议层面怎么处理 QUIC 握手,这部分是抓包工具内部实现的事,不需要用户额外操作。

七、和其他工具比一比:各自的取舍

客观地说,HTTP/3/QUIC 抓包在整个抓包工具生态里都是相对新、相对难啃的领域,不同工具的应对思路也不太一样:

  • Wireshark:作为协议分析的老牌工具,Wireshark 本身能够解析 QUIC 的协议结构(帧、包号等),但如果想看到应用层的明文内容,通常依赖浏览器或客户端导出的 TLS 密钥日志(比如通过 SSLKEYLOGFILE 环境变量),再导入 Wireshark 做联动解密。这套流程对浏览器场景相对成熟,但对 App、命令行工具等非浏览器场景,密钥日志的获取和联动配置往往比较繁琐,门槛较高。

  • Charles、Fiddler 等传统 MITM 代理工具:这类工具的核心机制是围绕 TCP+TLS 的中间人解密设计的,历史上对 HTTP/3/QUIC 的支持相对较弱,很多版本的处理方式是被动等待客户端因为某种原因回退到 HTTP/2,如果客户端坚持用 HTTP/3,往往就抓不到。

  • 分档处理的思路:像抓包鹰这类工具把 HTTP/3 处理做成"降级 / 透传 / 解密"三档可选,本质上是把"要不要动协议""要不要看明文"这个取舍权交给使用者,而不是只有"要么抓不到,要么强行搞坏协议"这一种结局。网卡抓包场景下"平滑回退可自动恢复"+"支持直接解密"的组合,也是针对 QUIC 这个老大难问题给出的两条并行路径。

不同工具的设计取向本质上服务于不同的使用习惯:习惯用 Wireshark 做协议级分析、且能接受配置密钥日志的用户,Wireshark 依然是称手的工具;日常做 App 接口分析、更看重开箱即用和明文可读性的场景,分档处理的代理/网卡方案能省掉不少联动配置的麻烦。

八、小结

HTTP/3/QUIC 之所以难抓,根源在于它抛弃了 TCP,把加密握手也做了不一样的设计,这让依赖"劫持 TCP + 替换证书"的传统中间人手法失灵。面对这个问题,代理抓包场景下比较实用的思路是给使用者提供"降级抓取 / 保真透传 / 真机解密"三档选择,网卡抓包场景下则可以在"平滑回退"和"直接解密"之间灵活切换——核心逻辑都是在"看得全"和"不打扰"之间按需取舍,而不是遇到 HTTP/3 就直接放弃。

如果你也被 HTTP/3 流量卡住过,不妨去了解一下抓包鹰(Trace Eagle)——一款免费、跨平台的抓包工具,主打"抓得到,解得开,看得懂",在代理抓包和网卡抓包两种场景下都提供了针对 QUIC 的专门处理方式,可以作为遇到 HTTP/3 断档问题时的一个可选方案。