十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Wireshark抓包实战:从流量分析到异常排查的完整指南

Wireshark抓包实战:从流量分析到异常排查的完整指南 入行前几年我一直觉得Wireshark是个“很酷但用不上”的工具直到有次线上接口偶发超时后端说请求到了前端说没收到响应两边吵了一下午最后用Wireshark抓包五分钟就定位到是TCP重传导致的。从那以后Wireshark抓包就成了我排查网络问题的第一选择。这篇内容围绕流量分析、协议拆解、异常流量识别三条主线展开把我这些年用Wireshark处理真实问题的思路、命令、踩坑经验都整理出来从怎么装怎么抓到怎么定位异常全套覆盖适合刚开始接触抓包的新手也适合想系统梳理Wireshark用法的开发、运维、安全测试同学。1. 抓包前的正确打开方式环境、接口与捕获过滤器在正式抓包之前有几步经常被新手跳过去导致后面怎么看都不对。比如装了Wireshark却抓不到包、抓到一堆包但全是自己的、或者抓到但数据包明显不完整。这些多数是环境问题不是工具问题。1.1 Wireshark版本选择与安装的避坑清单Wireshark目前主流版本是4.x官方下载页一般会区分Windows、macOS、Linux等平台。Windows安装时安装向导会提示安装Npcap这个是抓包依赖的底层驱动建议勾选安装同时可以把“Install Npcap in WinPcap API-compatible Mode”也勾上方便老工具兼容。很多老教程还在讲WinPcapWinPcap已经停止维护了新机器直接用Npcap就行。Linux下安装更简单Ubuntu/Debian直接执行sudo apt install wireshark。装完后需要注意普通用户抓包需要授权常见做法是把用户加入wireshark组命令是sudo usermod -aG wireshark $USER然后重新登录生效。如果不加组每次都得用sudo wireshark启动虽然能跑但文件属主很乱不推荐。macOS下用Homebrew安装brew install wireshark但首次抓包系统会要求给Wireshark授权网络权限另外新版macOS还要在系统设置里允许“本地网络”访问否则抓不到包或者只能抓到回环包。这个卡住过不少人。安装完成后我建议先做一个“回环测试”在Wireshark里选Loopback接口抓包然后ping 127.0.0.1或者访问本机启动的服务确认能抓到包再往下走。别等到真出问题时才发现工具本身没装好。1.2 抓包接口选择与混杂模式为什么你抓不到别人的包打开Wireshark主界面会看到一个接口列表每个接口对应一块网卡。在有线网卡、无线网卡、虚拟网卡VMware、VirtualBox、Hyper-V混在一起的机器上最容易选错接口。比如用WiFi上网却去抓有线以太网卡当然什么都抓不到。选接口时留意“IP地址”列通常能看到IPv4地址的接口就是当前正在上网的接口优先选它。如果要抓本机服务比如访问127.0.0.1选Loopback回环接口。这里要打开【编辑→首选项→捕获】确认勾选了“启用混杂模式”Promiscuous Mode。混杂模式的作用是让网卡把经过它的所有数据包都收进来而不只是发给自己的。有两个容易被误解的点在普通交换机环境下即使开了混杂模式也只能收到广播包和发给本机的包抓不到其他主机之间的单播流量。想抓全得靠交换机端口镜像Port Mirroring/SPAN或者用Hub。无线网卡在大多数系统上不支持完整混杂模式抓到的包通常是带802.11头的WiFi帧不经过特殊设置很难直接看到完整的IP流量。换句话说Wireshark适合定位“本机相关”的网络问题不适合当监听工具去偷窥局域网。搞清楚这个边界后续分析才不会走偏。1.3 捕获过滤器与显示过滤器两套过滤器别搞混Wireshark里有两套过滤器新手经常搞混。捕获过滤器Capture Filter是开始抓包前设置的作用是不匹配的包直接丢弃好处是节省磁盘和内存坏处是一旦抓了就没了没法回头补。显示过滤器Display Filter是抓包后对已捕获数据做筛选只影响显示不影响原始数据随时可以改。捕获过滤器用的是BPFBerkeley Packet Filter语法常见例子host 192.168.1.10只抓这个主机的流量tcp port 80只抓80端口的TCP流量net 192.168.1.0/24抓某个网段的流量not arp排除ARP包显示过滤器语法相对丰富常见例子ip.addr 192.168.1.10源或目标IP是这个tcp.port 443源或目标端口是443http显示HTTP协议包dns.qry.name contains example.comDNS查询里包含指定域名的包我的习惯是捕获过滤器尽量少用除非抓包量实在太大或者现场存储有限。因为很多异常流量分析需要你事后回溯宁可在抓包时多抓也不要在分析时发现少了关键报文。显示过滤器则随便玩分析阶段切换筛选条件并不会丢失数据。2. 流量分析实操从五花八门的数据包到清晰的问题链路抓包抓到的是“毛坯”原始数据包列表里什么都有ARP、DNS、TLS、TCP重传、广播包……直接在里面翻是低效的。流量分析的核心是“先过滤再拆包然后顺着连接看会话”。2.1 显示过滤器的高频组合用法以实际排查为例。假设现在要分析一台服务器192.168.1.100上Web服务的请求我一般先这样过滤ip.addr 192.168.1.100 and http只看这台机器相关的HTTP流量ip.addr 192.168.1.100 and tcp.port 8080只看TCP 8080端口的流量tcp.flags.syn 1 and tcp.flags.ack 0只挑TCP握手中的SYN包用来观察有没有连接建立的尝试tcp.analysis.retransmission只看TCP重传包http.response.code 400只看HTTP错误响应注意一个细节tcp.port 8080这种写法同时匹配源端口和目标端口如果想严格限定某一侧是8080用tcp.srcport 8080或tcp.dstport 8080。同理ip.addr匹配源或目标ip.src和ip.dst才是严格方向。这个在分析单向流量时非常重要。系统学习过滤器有个笨办法但很有效在显示过滤器输入框里输入一个字段名比如tcp.Wireshark会自动弹出字段提示列表用方向键上下翻能看到所有tcp相关字段。多翻几遍你对Wireshark能查什么就有数了。2.2 三种视图的正确读法包列表、包详情、包字节Wireshark主界面分为三栏最上面是包列表Packet List中间是包详情Packet Details最下面是包字节Packet Bytes。新手最容易犯的错是只看第一栏但其实第二、三栏才包含真正的协议拆解信息。包列表每一行是一个数据包关键列包括No序号、Time相对/绝对时间、Source源IP、Destination目的IP、Protocol协议、Length长度、Info概要信息。Time列默认是相对抓包开始的时间秒在【视图→时间显示格式】里可以切成“日期和时间”做时间比对时建议用后者。包详情是按协议栈展开的树形结构Frame物理帧、Ethernet II以太网帧头、Internet Protocol Version 4IP头、Transmission Control ProtocolTCP头、Hypertext Transfer ProtocolHTTP应用层……每一层都能点开看具体字段比如IP头的TTL和Flags、TCP头的Sequence Number和Flags、HTTP头的User-Agent。包字节显示的是原始十六进制数据左侧是偏移量中间是对应字节的十六进制值右侧是ASCII可打印字符。实际分析时我经常用这个区域来确认包详情里解析出来的字段和原始字节是否一致尤其在协议字段被工具解析错时。比如某些非标准端口上的私有协议Wireshark可能识别不对这时候看包字节最可靠。2.3 追踪TCP流把一堆数据包还原成一次完整会话当过滤定位到某个连接后真正阅读内容的方式是右键任意一个TCP包选择【追踪流→TCP Stream】。这个功能会把同一TCP连接四元组源IP、源端口、目的IP、目的端口的所有载荷数据按顺序拼成一个完整对话HTTP请求响应一目了然。比如在HTTP追踪流窗口里你能直接看到这样一段GET /api/user/info HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 ... Accept: application/json HTTP/1.1 200 OK Content-Type: application/json Content-Length: 256 {code:0,data:{...}}这种视图比在包列表里一个个翻高效太多。但要注意如果流量用了TLS加密追踪流里只会看到一堆乱码需要先做TLS解密如果连接是Keep-Alive长连接一个追踪流可能包含多组请求响应别只取第一段就下结论。3. 协议拆解实战看懂三次握手、HTTP、DNS、TLS才算入门流量分析最终要落到协议层面。多数场景不需要你背协议RFC但要能看懂Wireshark里常见的几种协议结构尤其是TCP、HTTP、DNS、TLS。3.1 TCP三次握手、数据传输与挥手全过程无论访问网页、调接口还是玩游戏只要走TCP连接的建立都从三次握手开始。Wireshark里三个包非常典型第一个是Client发SYNtcp.flags.syn 1且tcp.flags.ack 0第二个是Server回SYNACKsyn1且ack1第三个是Client回ACK。这之后才进入数据传输阶段。看握手时重点看两个值Sequence Number序列号和 Acknowledgment Number确认号。SYN包会消耗一个序列号因此第一次握手的Seq假设是0相对值第二次握手ACK号通常是1客户端初始Seq1表示“我期待下个字节的序列号是1”。这就是TCP可靠性机制的基础——每个字节都有编号收没收到一目了然。数据传输阶段可以用【统计→TCP流图→时间序列图Stevens】把每个包的Seq/ACK随时间画出来异常一目了然。如果看到Seq回退Sequence Number going backward或者大量重复ACK基本就是重传或乱序问题。连接结束时是四次挥手FIN、ACK、FIN、ACK。Wireshark里如果看到太多“TCP RST”复位而不是FIN说明连接被异常中断——常见于程序崩溃、超时强制关闭、防火墙RST注入等。排查时多留意RST包出现的上下文往往和业务日志对得上。3.2 HTTP请求响应的关键字段和慢请求定位HTTP在Wireshark里是明文协议HTTPS除外拆解相对简单。在包详情里选中HTTP层能看到Request Method、Host、User-Agent、Status Code、Content-Type等关键字段。实际排查中我常用两个技巧第一用【统计→HTTP→请求】按域名、URI、方法汇总所有请求能快速看清某段时间内都有哪些请求、谁量大、谁频繁失败。第二定位慢请求时先筛选http.time 1的包这个字段表示HTTP请求从发出到收到响应头的时间如果时间很长再进一步看TCP层的往返时延和重传情况区分是“服务端处理慢”还是“网络传输慢”。另外HTTP/2的包在Wireshark里的协议名显示为HTTP2请求和响应关系不像HTTP/1.1那么直观但同样可以右键“追踪HTTP/2流”查看。HTTP/3走UDPQUIC显示协议是QUIC功能入口在HTTP3菜单下。3.3 DNS查询过程看一眼就知道域名解析是否正常DNS解析异常是“网络不通”的高频原因。抓包时用显示过滤器dns即可看到所有DNS报文。关注三个点查询类型dns.qry.type常见A记录1、AAAA28、CNAME5、MX15、TXT16。请求与响应对应关系Wireshark会自动把同一查询的请求和响应用相同颜色标记你也可以看dns.id事务ID是否一致。响应状态dns.flags.rcode为0表示无错误为3表示域名不存在NXDOMAIN。如果发现每个DNS请求都要等很久才响应大概率是配置的DNS服务器慢或者上游递归查询慢。如果DNS请求根本发不出去就要查本机DNS配置和防火墙。还有一种常见的诡异问题域名解析结果轮询变更导致每次访问都打到不同节点这时可以筛选dns.a字段把所有A记录响应列出来观察IP集合是否频繁变化。3.4 TLS解密让加密流量变成明文给你看现代互联网大部分流量是TLS加密的Wireshark默认只能看到“Application Data”和一堆随机字段看不到HTTP明文。想分析HTTPS请求最常用的办法是设置SSLKEYLOGFILE环境变量导出会话密钥然后让Wireshark解密。实现步骤设置环境变量SSLKEYLOGFILE/path/to/keys.logWindows、Linux、macOS通用在启动浏览器或需要抓包的客户端程序前设置好。Wireshark里打开【编辑→首选项→Protocols→TLS】旧版本叫SSL在“(Pre)-Master-Secret log filename”栏填写刚设置的keys.log路径。重新抓包HTTPS流量就会在包详情里出现Decrypted TLS层HTTP请求响应直接可见。这个方法的原理是TLS 1.2及以下版本的会话主密钥可以从前主密钥Pre-Master Secret推导SSLKEYLOGFILE记录了客户端随机数Client Random对应的主密钥Wireshark就能用密钥解密会话内容。TLS 1.3同样支持但记录格式略有不同新版Wireshark基本都能处理。需要提醒的是环境变量必须在客户端程序启动前设置改完要重启程序Firefox和Chrome都支持但部分原生App不认这个环境变量那时候只能考虑其他代理方案。另外SSLKEYLOGFILE只适用于本机抓本机流量在路由器或交换机镜像流量上你没有密钥是解不开的。4. 异常流量识别先看统计画像再定位问题包异常流量识别的思路不是“一个包一个包看”而是先建立整体画像流量组成是什么谁在跟谁通信点对点的流量有多大哪些包被判为异常有了画像再深入打点效率高很多。4.1 三个统计面板30秒摸清流量大局【统计→协议分级】Protocol Hierarchy按协议栈统计各协议占比能一眼看出流量大头在哪。正常Web服务可能HTTP/TLS占比高如果发现ARP包占比异常高可能局域网内有扫描或环路。【统计→端点】Endpoints按MAC、IPv4、IPv6地址汇总每个端点的收发字节数和包数用来找“流量大户”。比如某台内网主机发包量远高于其他主机就要注意是否有异常外传行为某个外网IP接收了大量数据可能是下载或数据回传。【统计→对话】Conversations按通信双方维度统计能同时看到某个IP对的所有通信特别适合确认“谁和谁聊得最凶”。我通常在拿到一个陌生pcap文件后第一步就依次打开这三个面板大致理解整份流量的“主旋律”然后再根据目标和背景筛选具体的包。4.2 常见异常流量特征速查根据我自己的排查经验常见的异常流量大致有以下几类特征异常类型过滤特征可能原因TCP重传风暴tcp.analysis.retransmission大量出现链路质量差、中间设备丢包、接收端处理不过来ARP扫描arp.opcode 1且目标IP覆盖整个网段内网主机扫描、ARP欺骗攻击端口扫描tcp.flags.syn 1 and tcp.flags.ack 0大量出现且无后续握手端口扫描行为DNS隧道大量随机域名查询、高频率的TXT/ANY查询数据外传、恶意域名通信ICMP隧道ICMP Echo请求载荷出现大量ASCII或二进制内容隐蔽通信通道拿端口扫描举例正常访问某一个端口只会产生几条SYN包如果看到同一个源IP在短时间内向同一个目的IP的几百个不同端口发起SYN而且全部没有后续握手基本就是扫描。用统计→端点看目标端口分布能进一步加强判断。4.3 专家信息提示Wireshark替你把问题标出来了抓到包后留意包列表每行左侧的小图标黄色三角是“注意”或“警告”红色圆圈是“错误”。这就是Wireshark的专家信息Expert Info在【分析→专家信息】里汇总了所有异常提示。比如“New TCP connection: 192.168.1.100:8080 to ...”普通提示“A duplicate ACK was received”重复ACK可能预示丢包“This frame is a (suspicious) retransmission”可疑重传“Connection reset (RST)”连接被重置虽然专家信息不总是等于“有问题”但它是极好的引导线索。我通常先看哪些包被标红标黄再顺着这些包追上下文大多数异常案例都能从这里找到突破口。特别是分析别人的pcap文件时专家信息能帮你快速建立“哪里有疑点”的初步印象。4.4 用IO Graph画流量时间线直观定位异常峰值要回答“什么时候开始异常”这类问题IO Graph最合适。入口在【统计→IO Graph】它把流量大小Y轴随时间X轴绘制成折线图。可以添加多个过滤器同时叠加对比比如过滤器1tcp.analysis.retransmission画重传的分布过滤器2dns画DNS流量过滤器3ip.addr 某个外网IP画特定地址的流量如果看到重传曲线在某个时间点突然飙高或者DNS曲线出现密集尖峰就把时间轴缩放到该区间查看具体包。实操时我习惯把时间粒度Tick interval设为1秒或100毫秒粒度太粗会掩盖短时峰值。5. 实战中的坑与技巧来自排障一线的经验5.1 为什么Wireshark只显示520字节而不是完整数据热词里很多人搜这个问题。其实这是接口抓包长度限制造成的。典型原因有两个第一网卡驱动在接收时对超大帧做了截断捕获到的包长度远小于实际长度。如果你在捕获选项里把“限制每个包为”Capture length勾选并填了一个较小的数比如520就会出现每个包只被记录前520字节的现象。解决办法是去捕获选项里把它改为默认的“无限制”。第二如果是在交换机上做了端口镜像镜像口默认可能只复制帧的前128字节或前512字节这个不属于Wireshark设置问题需要在交换机侧调整抓包长度。判断方法很简单看包列表里Length列和Frame详情里的“Captured Length”与“Frame Length”是否一致如果Captured Length明显小于Frame Length就是截断了。5.2 抓包文件太卡教你分片抓、分片看抓了几分钟线上流量pcap文件动辄几百MB甚至几GBWireshark打开和操作都变得很卡。几个缓解策略抓包时使用捕获过滤器只留自己关心的流量减少落盘体积。比如只抓TCP 443端口tcp port 443。用dumpcap命令行工具配合轮转文件抓包dumpcap -i eth0 -b filesize:102400 -b files:5 -w /tmp/trace.pcap每个文件100MB、最多5个循环覆盖适合长期抓包。分析大文件时先打开文件用显示过滤器缩小范围再另存为筛选后的副本文件→导出特定分组后续分析只盯着小文件。5.3 常见抓包失败问题的排查顺序遇到“抓不到包”“只有自己发的包”“过滤后空白”这类问题按下面的顺序排查接口选对了吗看接口列表里的IP地址确认当前活跃网卡。是不是权限不够Windows下是否以管理员运行、Linux下是否在wireshark组。混杂模式开了吗在捕获选项中确认勾选。过滤条件写对了吗能抓到包但筛选后为空多半是显示过滤器和期望不匹配。是不是TLS加密看到大量TCP报文但没有应用层内容一般是需要解密。这五条能解决八成入门卡壳问题。还有一种情况是程序本身采用了客户端安全机制导致抓包失败比如部分App做了证书固定即使证书装好也会校验失败。这种场景已经超越Wireshark本身能解决的范畴需要结合客户端改造或系统级方案需要注意法律合规与授权边界。5.4 抓不到手机流量补充几个实战场景用Wireshark直接抓手机流量如果手机和电脑在同一局域网只能通过端口镜像或代理方式实现且现在很多App使用TLS证书固定即使配好了代理证书也会被拒绝。实践中更现实的方案是小程序的HTTPS流量使用PC端微信开发者工具的“调试”模式配合代理抓包或者用代理工具在电脑开代理端口手机/小程序代理到该端口并安装对应HTTPS证书。遇到证书校验失败时说明客户端校验了证书链需要确认证书安装完整、有效期正确。RTP/RTSP视频流Wireshark里抓RTP包后可以用【电话→RTP→RTP流分析】查看流信息再通过【电话→RTP→RTP流播放】直接播放音频或者将RTP载荷导出为H.264裸流文件再做后续处理。实际项目里安防设备的视频流抓包经常这么干。USB抓包Wireshark的接口列表里如果出现USBPcap接口说明装过USB抓包驱动属于USB协议分析领域和网络抓包是两回事需要单独的分析思路。最后分享一点我个人习惯Wireshark这种工具用得越多越觉得它像网络世界的“显微镜”但更重要的是你得知道你要找什么。抓包前先写清楚要解决的问题、要看的协议、要抓的地址范围抓包后先看统计再做细筛别一上来就漫无目的地让抓包一直跑。掌握这套思路比记住几百条过滤器写法有用得多。以后遇到网络相关的问题先别急着问人自己抓个包往往几分钟就有答案了。
返回列表