Wireshark抓包指南:过滤器、TCP重传与TLS解密实战
排查网络问题这么多年我踩过最多的坑不是找不到问题而是根本没抓到该抓的包。很多人第一次打开 Wireshark对着满屏滚动的高亮颜色一脸懵抓了十分钟发现网卡选错了、过滤器写错了、或者抓到一半软件卡死了。这篇就按我自己实际的排查流程走一遍从安装那一刻开始讲重点放在抓包之前该想清楚什么、抓完之后怎么把几万个包筛成有用的那几个以及那些教程里从来不写、但实际会把人卡住半天的细节。不管你是刚接触网络协议的新手还是被某个偶发卡顿折磨了很久、想拿抓包工具定位问题的开发者下面这些内容都能直接照着复现。1. 装对 Wireshark后面八成的折腾都出在这一步1.1 Npcap 和 WinPcap 的选择决定了你能抓到什么Windows 上安装 Wireshark 时安装程序会问你装不装 Npcap。这个东西是抓包能力的底座它负责把网卡收到的原始数据交给 Wireshark。老教程里经常出现的 WinPcap 早就不更新了在 Windows 10、Windows 11 上装老版本 WinPcap 会有一堆兼容问题比如网卡列表里看不到无线网卡、抓到一半驱动崩掉。所以现在装包时直接用安装向导自带的 Npcap 就行勾选Install Npcap那一步别跳过。Npcap 安装界面里有一个容易忽略的选项就是Support raw 802.11 traffic。如果你打算分析 Wi-Fi 的空口流量比如研究 802.1x 认证过程这个选项要勾上如果你只是抓有线网口或者本机的普通流量勾不勾影响不大。还有Restrict Npcap drivers access to Administrators only个人开发机建议不要勾否则每次开 Wireshark 都要处理权限提升很烦。装完重启一下打开 Wireshark 看接口列表能不能正常显示。如果只有一两个奇怪的接口、看不到你实际的网卡多半是 Npcap 没装好或者被安全软件拦了重装一遍 Npcap 通常能解决。1.2 第一次启动就该改掉的几个默认设置第一次打开 Wireshark别急着点那个鲨鱼鳍图标开始抓。先做几件让后面省心的事。第一把时间列的显示格式改掉。默认显示的是从抓包开始到现在的绝对秒数排查问题时不好用。进视图 - 时间显示格式改成自上一显示包的时间单位选秒。这样每一行显示的就是这个包和上一个包之间的间隔找卡顿、找超时的包特别直观。第二关闭实时滚动或者至少心里有数。抓包时列表一直在滚你想点某个包很容易点错。可以先把滚动关掉或者抓到关键包后立刻用 CtrlE 停止抓包再慢慢看。第三把捕获菜单里的选项打开看一眼。这里有个 snaplen快照长度设置默认是 262144。这个值如果被改小了你抓到的包就只有前面一小段数据后面全是截断的。很多为什么只能看到部分字节的疑问根子就在这里。第四弄懂一个概念Wireshark 抓的是经过你网卡的所有流量包括别人的广播、组播、各种协议的心跳包。所以第一件事永远是缩小范围而不是打开就开始录。你录得越久、范围越大后面筛起来越痛苦。2. 抓包之前先想清楚在哪抓、抓什么、抓多久2.1 网卡选择、混杂模式和无线网卡的差异打开 Wireshark接口列表里会有一排网卡。选哪个取决于你要看的是本机进出流量还是整个网段的流量。如果你要看本机发出去和收进来的请求选正在使用的那块网卡就行。如果是本机访问外部服务的问题有线选以太网卡无线选无线网卡。这里有个反直觉的点抓本机自己访问自己的服务比如 localhost 上的服务很多情况下抓不到因为这类流量走的是内核回环不经过物理网卡。要抓回环流量得装专门的环回适配器或者用 Npcap 自带的环回接口。混杂模式是另一个常被误解的东西。勾选它之后网卡会接收经过它的所有帧而不只是发给自己的。但要注意在现在这种交换式网络里交换机默认只把帧转发到你所在的端口所以你在自己电脑上开混杂模式也只能看到广播、组播和发给自己的包看不到别的机器的单播流量。想看整个网段的流量得在交换机上做端口镜像或者在上游设备上抓。这个认知很重要否则你会一直奇怪为什么我抓不到别人的流量。无线网卡的情况又不一样。普通无线网卡驱动默认只把连接到自己网络的数据交上来要抓空口上的管理帧、认证帧得让网卡进入监听模式。像 Intel AX210 这类网卡在特定驱动下支持监听模式配合 Wireshark 就能看到 802.11 的管理报文包括 802.1x 的 EAPOL 认证交互。不过能不能进监听模式很大程度上看驱动和系统支持不是所有无线网卡都行。2.2 捕获过滤器和显示过滤器性能差别不止一点点这是我见过最多人搞混的地方。Wireshark 里有两套过滤器作用位置完全不同。捕获过滤器Capture Filter在捕获选项里填用的是 BPF 语法它在内核层就生效不符合条件的包根本不会被记录下来。显示过滤器Display Filter在抓完之后的主界面顶部填是 Wireshark 自己的语法它只是把已经抓到的包筛着显示包其实都还在。为什么要分清因为捕获过滤器能大幅减少记录量。你在一台流量很大的机器上抓包不加捕获过滤几秒钟就是几十万个包内存飙升、软件卡顿。如果只是要看 80 端口的流量直接在捕获过滤里写tcp port 80抓到的就干净很多。但捕获过滤器的语法比较硬写错了不报错只是抓不到东西。所以我的习惯是先用宽泛的捕获过滤缩小协议范围或地址范围抓下来之后再用显示过滤器精细分析。两个阶段配合既保证性能又保证灵活。常见的捕获过滤器和显示过滤器写法对照如下目的捕获过滤器BPF显示过滤器只看某台主机host 192.168.1.100ip.addr 192.168.1.100只看某端口port 443tcp.port 443只看 UDPudpudp只看某主机某端口host 192.168.1.100 and port 8080ip.addr 192.168.1.100 tcp.port 8080排除某主机not host 192.168.1.1!(ip.addr 192.168.1.1)注意两套语法的连接符不一样BPF 用and、or、not显示过滤器用、||、!。混用会直接报红这是新手最容易卡住的第一关。3. 显示过滤器把几万个包筛到只剩你要的那几个3.1 基础语法和几个高频率表达式抓到包之后真正的活是筛选。显示过滤器输入框支持自动补全输入的时候会提示可用字段善用这个功能能少记很多语法。最常用的几个表达式我列一份直接能抄的ip.addr 192.168.1.100只看这个 IP 参与的所有包不区分方向ip.src 192.168.1.100只看这个 IP 发出的包tcp.port 8080只看 8080 端口的 TCP 流量http.request只看 HTTP 请求tcp.flags.syn 1 tcp.flags.ack 0只看 TCP 的第一次握手包tcp.analysis.retransmission只看重传的包udp ip.addr 10.0.0.5UDP 和地址两个条件组合写过滤器的一个小技巧是善用contains和matches。比如你想找某个 HTTP 请求的 body 里出现了特定字符串可以写http contains login。想按正则匹配某些内容用matches。这些在排查具体业务问题时非常有用比一个个点开看快得多。3.2 算 UDP 前后两包时间间隔改时间显示比写过滤器更直接有人问过我怎么筛出 UDP 前后两包的时间间隔。严格说Wireshark 没有一个直接过滤出间隔的字段但有个更省事的办法。先把过滤器设成udp把显示过滤后的时间列改成自上一显示包的时间前面第 1.2 节讲过怎么改。这样列表里每一行显示的就是当前包和上一个被显示的 UDP 包之间的时间差。你想看哪两个包之间的间隔直接读那一行的值就行。如果要做更精确的时序分析可以打开统计 - 流量图或者统计 - 对话把 UDP 会话按时间轴铺开包之间的间距一目了然。对于排查为什么某个实时应用有抖动这类问题时间间隔的分布比单个间隔值更有参考价值——偶尔一个大的间隔和持续的大间隔含义完全不同。要提醒的是tcp.analysis.ack_rtt这类字段只对 TCP 有意义因为它是根据握手和 ACK 的时序算出来的往返时延。UDP 是无连接的没有 ACK所以只能靠相邻包的时间戳自己做差。如果你需要严格测量两包间隔并导出可以把这个字段手工加进自定义列方便对比。3.3 只显示某网卡发送源的字节内容用导出和自定义列还有一个常见需求是只看某个以太网发送源的数据包的字节内容。这在 Wireshark 里分两步。第一步是把源端筛出来用以太网层的地址过滤比如eth.src 00:11:22:33:44:55。注意这是 MAC 地址层面的过滤和 IP 层的ip.src不是一回事。一个设备可能有多个 IP但它的 MAC 是固定的所以按 eth.src 筛能稳定定位到某块网卡发出的帧。第二步是看字节内容。点开任意一个包在下方的字节面板里能看到从以太网头开始的十六进制原始数据。如果要把内容导出来选中需要的包用文件 - 导出指定分组可以选导出成纯文本、CSV 或十六进制只要在导出的选项里勾选你需要的字段就行。默认导出格式会把关键字段列出来但要看到完整的原始字节选Packet Bytes这一项。如果你经常要看某个字段的原始字节可以在数据包详情面板里右键那个字段选作为十六进制显示或者应用为列把它直接固定到列表里。这样每一行的这个字段都会以字节形式展示比点开一个个包快得多。4. 对着一个完整会话看 TCP 到底发生了什么4.1 三次握手、重传和乱序的判读拿到一堆 TCP 包之后Wireshark 会自动做序列号分析这一点非常省心。你只要在过滤器里写tcp然后右键任意一个包选追踪 TCP 流它会把这个会话的所有包串起来并且按方向分色显示。这是排查单个连接问题最快的方式。三次握手的判读核心就三个包SYN、SYNACK、ACK。正常的时候第一个 SYN 发出后几百毫秒内就会收到 SYNACK。如果 SYN 发了没人理一直重试说明对端不可达或者被防火墙静默丢弃如果收到的是 RST说明对端端口没开或者直接拒绝。这两种情况在排查里含义完全不同不能笼统说连不上。重传就更值得看。Wireshark 会把重传的包标成红色并打上tcp.analysis.retransmission标记。偶发一两个重传很正常但如果同一个包反复重传基本可以断定中间有丢包或者链路质量差。这里有个坑有时候看到重传其实不是真重传而是抓包点位置导致的假象。比如你在发送端抓包看到包重传了但你没法确认它到底丢在哪个环节。要定位丢失位置得在链路两端同时抓对比谁没收到 ACK。乱序包tcp.analysis.out_of_order看着吓人但在现代网络里很常见不一定影响性能因为接收端会重新排序。只有大量乱序持续出现才需要考虑是不是多路径或者链路问题。4.2 借专家信息和统计两把刀快速定位异常包一多,一个个看是不现实的。Wireshark 左下角有个彩色圆点那是专家信息的入口点开它会按严重程度列出所有异常错误、警告、注意。这一步几乎是我的固定动作先看专家信息能把大部分明显的问题揪出来。再结合顶部统计菜单里的几个工具。想找哪个 IP 最活跃看会话想看协议占比看协议分级想排查慢在哪一步看服务响应时间。这几个视图不用一个个点包直接给你汇总好的排序结果效率高很多。我自己的排查顺序基本固定先看专家信息列出的错误再用会话表找到流量最大的几个对端然后针对可疑会话追踪 TCP 流最后回到具体包看应用层内容。这套顺序能把从几万个包里找问题变成按图索骥。5. HTTPS 流量怎么分析以及 TLS 解密的实际边界5.1 默认看不到明文是因为流量本来就是加密的Wireshark 抓到的 HTTPS 包传输层以上是 TLS 密文应用层内容看不到这不是软件的问题是加密设计的必然结果。你抓到的只是 TLS 记录层的外壳能看到的只有握手信息、证书、SNI 这些不加密的部分。能看到的握手信息其实已经能说明不少问题。TLS 握手里包含了客户端和服务端协商的密码套件、TLS 版本、SNI 主机名、证书链。如果出现握手失败、证书错误这些都能在握手包里直接看到。很多网站打不开的问题根因就在握手阶段还没到应用层就断了。5.2 用密钥日志文件解密自己流量的完整操作如果你在调试自己开发的服务想看 TLS 加密后的应用层内容正规做法是让客户端把会话密钥导出来Wireshark 拿这份密钥去解密。这仅限于你自己的流量、你授权的环境别拿它去处理别人的数据。具体做法以 Chrome、Firefox、Edge 这类主流浏览器为例设一个环境变量SSLKEYLOGFILE指向一个文本文件比如C:\keys\sslkeylog.txt。设完重启浏览器之后浏览器访问 HTTPS 时会把每次会话的密钥追加写到这个文件里。然后打开 Wireshark 的首选项 - 协议 - TLS把(Pre)-Master-Secret log filename指向同一个文件。配置好之后重新抓一次访问流量TLS 解出来的应用层内容就能正常显示了。要注意几点密钥日志是浏览器新会话才生成的配置之前的旧流量解不了不同浏览器的支持程度不一样有些需要特定版本另外这个文件包含会话密钥属于敏感信息用完及时删掉别随手传给别人。如果抓的是普通网页内容而只是想快速看结构Fiddler、Charles、Burp Suite、Reqable 这类中间人代理工具可能更顺手——它们通过给自己签发的证书来解密流量配置好证书后界面更面向应用层。但这类工具也有各自的门槛比如手机上装证书总显示未知、小程序抓包证书不生效等本质上是证书信任链没配对。选哪类工具取决于你的场景纯协议学习、看底层时序用 Wireshark看具体的 HTTP 请求响应内容代理工具更高效。6. 那些教程不写、但实际一定会踩的坑6.1 为什么只能显示几百字节数据的真相有人遇到抓包只能显示部分字节、后面被截断的情况这基本就是快照长度snaplen设小了。在捕获选项里如果把这个值设成了几百比如 520那每个包最多只记录这么多字节剩下的全被裁掉。解决方法很简单在捕获 - 选项里把 snaplen 设回默认的大值或者直接找个明确的snaplen输入框填 262144 或者更大。还有一种字节不够的错觉来自应用层分片比如一个大的响应被拆成多个 TCP 包每个包单独看都不长但拼起来才是完整内容。这时候用追踪 TCP 流看拼接后的完整数据就不会被单包长度误导了。6.2 长时间抓包怎么不把内存撑爆抓包最怕两种情况一是抓了几个小时软件内存爆掉二是抓了一堆无关流量回头看的时候无从下手。解决办法是开环形缓冲区。在捕获选项里有个输出标签页勾选Create a new file automatically设置成每达到一定大小或者一定时间就新建文件同时限制保留的文件数量。这样它会循环覆盖旧文件内存和磁盘都不会失控。比如设成每个文件 50MB、最多保留 10 个长期挂着也不怕。如果只是短时间盯一个问题那就别长时间抓。抓到关键复现的瞬间立刻停止截取时间窗口反而更好分析。我自己的习惯是抓之前先想清楚我要复现什么动作然后只在这个动作前后抓十几秒包少、干净、定位快。6.3 抓不到包时的排查链路抓不到包是新手最焦虑的情况。按顺序排查基本都能找到原因。先确认网卡选对了没有。多网卡机器最容易选错明明走的是无线却选了有线。可以在命令提示符里先确认当前活动的接口。再确认过滤器是不是写得太严。捕获过滤器写错会静默失效直接抓不到任何东西。把过滤器清空试一次如果立刻有包了就是过滤器的问题。然后看是不是本地回环流量。访问本机服务走的是回环普通网卡抓不到需要环回适配器。最后看权限和驱动。有些系统下 Npcap 没正确加载或者被安全软件挡住表现就是接口列表异常或者抓到的全是空的。重装 Npcap、以管理员身份运行通常能解决。如果是想抓整个局域网的流量却发现只能看到广播那这不是故障是交换网络的正常行为得靠端口镜像或者在上游抓前面 2.1 节已经说过。现象可能原因处理方式完全没有包网卡选错 / 捕获过滤写错清空过滤重抓核对活动网卡只有部分字节snaplen 设小恢复默认快照长度抓不到本地服务走了回环用环回适配器看不到其他主机流量交换网络限制配置端口镜像无线管理帧看不到未进入监听模式换支持监听模式的网卡和驱动我自己的体会是抓包这件事工具本身不难难的是抓之前把问题想清楚。你要抓哪台机器的流量、哪个协议的、大概什么时间发生、复现条件是什么把这几个问题先答一遍再去点抓包按钮效率会比盲目录一整天的流量高太多。还有一个小建议每次抓完用文件 - 保存存成一个带日期的 pcapng 文件重要的问题现场留着后面复盘、对比、找规律都用得上别抓完一关就没了。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →