← 网络基础学习第 52 / 55 章进阶45 分钟

模块八 · 抓包与排错

抓包入门

前面学习了协议与模型,抓包帮助观察某个位置实际看到了什么。捕获位置、权限和驱动会影响可见范围,本章比较三条路径及其限制。

本章要解决的问题:前面学习了协议与模型,抓包帮助观察某个位置实际看到了什么。捕获位置、权限和驱动会影响可见范围,本章比较三条路径及其限制。

本章的证据来源:历史实测记录(一个从系统状态重建报文头的工具、pktmon 的权限检查)。工具用法出自 Microsoft 文档(pktmon)。

先从一个例子理解概念

看到“连接失败”只是结果,抓包能帮助查看相关报文经过捕获点的过程。先分清应用日志、网络捕获和解密。

在哪里观察:捕获点与抓包

抓包是在选定接口或系统位置记录报文。这个位置叫捕获点;选错接口可能看不到目标流量,系统卸载也可能改变捕获到的形态。

命令打印什么:应用日志

curl等客户端知道自己发送、接收的HTTP内容,它的诊断输出属于应用层观察。网络捕获是另一种证据,二者不能互相替代。

只看相关内容:捕获过滤与显示过滤

捕获过滤决定哪些流量被记录;显示过滤决定已有记录里显示哪些条目。Wireshark的dns等显示表达式不能直接当所有工具的捕获语法。

记录保存在哪:ETL与pcapng

这些是记录文件格式名。Windows的pktmon可保存ETL日志,并转换为Wireshark等可读取的pcapng;格式转换不是解密HTTPS。

下面再用这些概念看原理、命令和结果。规范与官方资料列在本章末尾,类比只帮助理解,不代替协议规则。

为什么抓包是最有说服力的手段

前面所有模块的结论都来自命令的输出(ping、netstat、Get-NetNeighbor……)。这些足够说明问题,但有一个共同的局限:它们是操作系统加工过的结果。

抓包不一样 —— 它拿到的是网线上真实流动的字节:

对比命令输出抓包
内容操作系统整理过的信息原始字节
粒度状态、统计每一个包、每一个字段
能看到结果过程(比如三次握手的三个包各自长什么样)
能看出"连接建立了""SYN 发了但没收到 SYN+ACK,重传了 3 次"

所以抓包是排错和学习的终极手段。 但它有门槛。

抓包的门槛:为什么需要特权

抓包本质上是"偷看别人的数据"。 从操作系统的角度看:

  • 网卡收到的帧,本该只交给对应的协议栈处理
  • 抓包工具要截住所有帧(包括不是发给自己的)
  • 这需要一个内核驱动或者特权接口

所以:

工具需要什么
Wireshark / tcpdumpWindows安装Npcap驱动;Unix类系统通常使用libpcap接口(库不等于Npcap驱动)(安装时需要管理员)
pktmon(Windows 自带)管理员权限
自己写原始套接字管理员权限
历史实测记录确认了这个限制:powershell
pktmon filter list
→ pktmon : 无法与 PktMon 驱动程序通信。拒绝访问。

pktmon 是 Windows 10/11 自带的抓包工具,不需要安装任何东西 —— 但它要管理员权限,在普通权限下会直接报"拒绝访问"。

路线一:应用层观察(不需要权限)

curl本身是HTTP客户端和TLS连接端点,可以读取解密后的HTTP。curl -v通常显示请求/响应头、连接和握手信息;响应正文按正常输出设置显示或保存,而不是因为HTTPS就看不到。

示例powershell
curl.exe -v https://example.com -o response.html
curl.exe --trace-ascii trace.txt https://example.com -o response.html

--trace/--trace-ascii输出传输诊断,不是TLS会话密钥导出,查看自己客户端的HTTP内容不需要服务器配合。trace可能包含请求内容和凭据,分享时应去除这些值。

应用诊断看不到所有TCP重传、真实分段或其他程序流量;被动Wireshark抓包解密才需要兼容的会话密钥材料与对应抓包。curl 官方手册:verbose、trace、trace-ascii

路线二:从系统状态重建报文头(不需要权限)

路由表、邻居表与TCP连接表能帮助解释某条路径可能采用的地址和下一跳,但它们不是同一次发送的全部报文字节,查询时间也可能不同。

原工具在连接路由是TUN而无MAC时,回退取物理网关的MAC,又输出固定TTL=128、协议号6等字段。这混合了TUN路径与物理路径,不能作为同一个真实包的头部。

路径可以说明什么不能混用什么
程序进入TUNIP目的和虚拟下一跳TUN没有以太网MAC头,不能补物理网关MAC伪装真实帧
代理新建外连对应新连接的源地址、物理出口和邻居MAC需要按新连接与实际出口重新确认,不继承原连接全部字段

状态拼图适合解释寻址;如果画头部示意,必须标出“示例/推测”。TCP内部维护序号等状态,只是常规连接查询未提供全部字段,不能说操作系统不保存序号。RFC 9293 §3.3.1

路线三:真正抓包(需要管理员)

Windows 自带:pktmon

pktmon 是 Windows 10 1809 之后自带的抓包工具,不用装任何东西。但必须用管理员权限运行。

基本用法:powershell
# ① 只看特定流量(先加过滤器,否则会抓到一大堆无关的包)
pktmon filter remove
pktmon filter add -i 192.168.31.1 -t TCP

# ② 开始抓,结果写到文件
pktmon start --capture --pkt-size 0 -f C:\temp\capture.etl

# ③ 做你要测试的操作(比如访问一个网站)

# ④ 停止
pktmon stop

# ⑤ 把 etl 转成可读文本
pktmon etl2txt C:\temp\capture.etl -o C:\temp\capture.txt

# ⑥ 也可以转成 pcapng,用 Wireshark 打开看
pktmon etl2pcap C:\temp\capture.etl -o C:\temp\capture.pcapng

几个关键参数:

参数作用
-i / -t / -p按 IP / 传输层协议 / 端口过滤
--pkt-size 0抓完整的包(默认可能只抓头部)
-f <文件>输出到 etl 文件

更常用:Wireshark

pktmon 适合脚本化和快速排查,但日常学习还是 Wireshark 方便 —— 它有图形界面、能逐层展开每个包的字段、能跟随 TCP 流(把一次会话的所有包拼起来看)。

安装 Wireshark 时会一并装 Npcap 驱动(那个安装步骤需要管理员权限)。

Wireshark 里最该先学的不是界面,而是过滤器:

# 只看到某个 IP 的流量
ip.addr == 192.168.31.215

# 只看 443 端口的 TCP
tcp.port == 443

# 只看 DNS 查询
dns

# 只看 TCP 的 SYN 包(观察连接建立)
tcp.flags.syn == 1

# 组合条件
ip.addr == 1.1.1.1 && tcp.port == 443

抓包能看到的那些"命令看不到的事"

抓到的现象可作为哪类线索仍需确认什么
SYN发出但没有SYN+ACK建连路径或对端未成功回应去程丢失、回程丢失、过滤、服务/队列等;不能单定防火墙
收到RST某处拒绝/复位连接端点或中间设备来源,不能仅凭IP断言端口没开
重复发送相同字节范围TCP恢复或误判重传丢包、乱序、ACK丢失与捕获位置
接收窗口小/零接收端当前通告限制缓冲、读取速度和窗口探测,不直接证明硬件故障
同连接RST与数据TTL不同值得调查的特征差异路径、初始TTL、Anycast/中间处理;单靠TTL不能证明伪造

本机抓包还可能受分段/接收合并与校验卸载影响,看到的包不必逐字节等同于物理线上帧。过滤器dns或tcp.port在Wireshark中是显示过滤器;捕获过滤器使用不同语法。Wireshark 过滤器说明、Wireshark 卸载说明

实测限制:本章没有真实的抓包数据

诚实说明:本教程没有包含任何真实抓包的结果。原因是:

  • pktmon 需要管理员权限,实测确认在本机当前权限下报"拒绝访问"
  • Wireshark / Npcap 需要安装驱动(同样需要提权)
  • 本教程的约定是不编造数据

所以本章的内容是:

部分性质
路线一(curl -v)、路线二(重建报文头)历史实测记录
pktmon 的权限限制历史实测记录
pktmon 与 Wireshark 的用法标准/文档
"抓包能看到什么"那张表标准(常见故障模式)

你自己抓一次,就能补上这一块。 按上面 pktmon 的命令跑一遍(用管理员权限的 PowerShell),或者在 Wireshark 里抓一次访问网页的过程,然后对照《运输层》模块讲的握手挥手去认那些包 —— 那是这套教程最好的收尾练习。

常见误解

误解一:"抓包必须装 Wireshark"

不需要。 Windows 10/11 自带 pktmon,不用安装任何东西(只要管理员权限)。Linux是否预装tcpdump取决于发行版与镜像;安装和捕获权限需要分别检查。

误解二:"抓包能解密 HTTPS"

不能(正常情况下)。TLS 的设计目标就是让中间人看不懂内容 —— 包括抓包工具。能看到的只有:你连了哪个 IP 和端口、传了多少字节、什么时候传的、TLS 握手用了什么算法。 (例外:旧式不具备前向保密的RSA密钥交换在满足条件时可用服务器私钥;现代(EC)DHE/TLS1.3通常需要会话密钥材料,例如客户端支持的SSLKEYLOGFILE 让浏览器导出会话密钥,Wireshark 才能解密 —— 这需要你能控制其中一端。)

误解三:"抓包数据越全越好"

恰恰相反。 不过滤地抓包会得到海量数据,反而看不出问题。正确的做法是先用假设缩小范围("我怀疑是 DNS 问题"→ 只抓 DNS),再针对性地抓。

误解四:"重建报文头和抓包是一回事"

不是。 重建是"根据操作系统状态推断头部应该是什么",抓包是"网线上真实跑的字节"。前者看不到校验和、序号、标志位、时间戳,也无法证明包真的发出去了。

本章小结

结论性质
捕获点看到的包会受卸载、接口及过滤影响,不必等于线上完整帧工具边界
curl是TLS端点,能观察本连接的HTTP明文官方工具行为
状态表可用于路径示意,不能混合TUN和物理地址重建单包证据证据修订
pktmon与Npcap捕获涉及权限,安装、运行及Unix授权机制需区别部署条件
RST的TTL异常是线索,不能单独证明伪造诊断限制
此章没有提供真实网络抓包文件资料范围

自测题

7 题 · 先自己答,再展开对照

  1. 为什么抓包需要管理员权限?
    捕获常通过特权接口或内核驱动,Windows的pktmon通常需管理员。驱动安装权限、运行权限和Unix能力授权要分别看配置;不是所有抓包用户都必须是root,也不是libpcap本身就是内核驱动。
  2. 你用 curl -v 看到了一次完整的 HTTP 对话。这算抓包吗?它看不到什么?
    这是应用层诊断,不是网络捕获。curl能看到自己TLS连接解密后的HTTP,verbose通常显示头部,正文按输出选项处理;它看不到全部TCP行为或其他程序流量。
  3. "从系统状态重建报文头"这条路线能看到什么、不能看到什么?
    能列连接、路由与邻居线索,不能保证拼图就是同一次发送;应分开TUN与物理出口。协议栈内部有TCP序号状态,只是普通查询未公开。
  4. 重建结果里,目的 IP 是 3.1.29.57,但目的 MAC 是网关的地址。为什么?
    在普通无隧道/NAT影响的物理IPv4以太网路径上,帧目的MAC可为下一跳网关。但原示例混用了TUN与物理网关,不能据此声称是同一个真实包。
  5. 你想排查"DNS 解析慢"的问题。应该用什么过滤条件?
    Wireshark的dns是显示过滤器,只显示被识别的传统DNS;捕获过滤器语法不同,DoH/DoT等加密查询需结合实际传输协议分析。
  6. 抓包能解密 HTTPS 吗?为什么?什么情况下可以?
    正常情况下不能。 TLS 的设计目标就是让中间人(包括抓包工具)看不懂内容 —— 加密是在客户端和服务器之间端到端完成的,抓包工具只是个旁观者,手里没有密钥。
    能看到的只有:你连了哪个 IP 和端口、传了多少字节、什么时间传的、TLS 握手协商了什么算法和版本。
    例外情况:如果你能控制其中一端 —— 比如你有服务器的私钥(仅适用于不使用前向保密的旧套件),或者设置了 SSLKEYLOGFILE 让浏览器把会话密钥导出到文件,然后在 Wireshark 里配置使用这个文件,就能解密。
  7. 中间设备插入的伪造 RST 包,抓包时怎么识别出来?
    TTL差异只是线索,路径变化、不同初始TTL和中间设备也可能解释。需多点抓包、时序、序号及端点日志,不可仅凭TTL认定伪造。

参考资料与适用范围

修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。

正文源自 m8-01-抓包入门.md · 共 12 节 · 7 道自测题