ARTICLE DETAIL

资讯详情

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

Wireshark抓包实战指南:从原理到TLS解密与RTP还原

Wireshark抓包实战指南:从原理到TLS解密与RTP还原 排查网络问题的时候最怕听到一句话“我这边网络没问题。”可一旦打开Wireshark抓到那几行密密麻麻的数据包之前所有的猜测和扯皮基本都能停下来——该看数据的看数据该看报文的看报文。作为一款开源的老牌网络抓包工具Wireshark几乎就是网络世界里的“示波器”不管你是做运维、搞开发还是刚入门学网络协议第一堂课基本都绕不开它。这篇文章我尽量讲点实在的。从下载安装、界面认识开始到怎么抓包、怎么写过滤条件再穿插几个大家问得特别多的场景为什么只见520字节长时间抓包怎么操作HTTPS能不能解密RTP流怎么还原成视频适合零基础的同学照着操作也适合有点经验的人查漏补缺。1. 抓包原理Wireshark到底在抓什么1.1 网卡、混杂模式与数据帧很多人第一次用Wireshark点开之后看到一堆波浪线就开始怀疑人生。其实你只需要先弄明白一个问题抓包到底抓的是什么可以这样理解网卡收发数据就像小区门口的安保每天看着所有人进进出出他平时只关心自己负责的那几户。但如果你给他配一台“记录仪”让他把经过的每个人都拍下来这就相当于让网卡进入混杂模式Promiscuous Mode。Wireshark干的事情就是这记录仪——它把自己的网卡驱动设置成混杂模式然后把经过这个网卡的所有数据帧都复制一份经过协议解析之后呈现到界面上。这里有个很重要的点Wireshark是不会“拦截”或“修改”数据包的。它只是旁路观察者数据包该怎么走还怎么走协议栈该处理照样处理。抓包对业务的影响通常只在网卡负载很高、吞吐量很大的时候才明显平时做故障排查完全不用担心“抓包会不会把网络抓坏”。底层实现上Windows下Wireshark依赖Npcap早期是WinPcapLinux和macOS依赖libpcap。安装Wireshark时如果漏装了Npcap基本就等于拿到了一个空壳后面我会专门讲这个坑。1.2 为什么是Wireshark常见抓包工具怎么选我经常被问“Fiddler、tcpdump、Wireshark到底用哪个”如果你只是调试Web接口Fiddler确实方便能直接看HTTP请求响应但它主要覆盖HTTP/HTTPS这一层对TCP/UDP、DNS、ARP这些底层协议基本无能为力。tcpdump则强在命令行、适合在服务器上跑但你要浏览大量数据包时纯文本界面看得人脑壳疼。Wireshark最大的优势是通用性。它内置了上千种协议的解析器从以太网帧头到IP、TCP、UDP再到HTTP、DNS、TLS等应用层协议几乎全覆盖。而且它提供了非常直观的图形界面数据包列表、协议树、原始字节三块面板联动鼠标点一下就能定位到某个字段对应的二进制字节。这在实际排查问题的时候效率是碾压级的高。所以我个人的建议是服务器上用tcpdump把包抓下来存成pcap文件然后丢到本地Wireshark里做分析平时在PC、笔记本上做协议学习或抓包排查直接用Wireshark就行没必要舍近求远。2. 下载安装与打不开问题一次装好Wireshark2.1 官网下载和安装选项Wireshark的下载很简单认准官网www.wireshark.org的Download页面就行别去第三方下载站拿捆绑包。Windows安装时有一个步骤非常关键它会询问是否安装Npcap。一定要勾选。Npcap是Windows下抓包的核心驱动少了它Wireshark连网卡列表都看不到。如果你之前装过旧版本建议直接勾选“Install Npcap 1.x”让它顺手把驱动一起装上。Linux下安装更简单Debian/Ubuntu系用sudo apt install -y wiresharkCentOS/RHEL系用sudo yum install -y wireshark装完之后普通用户直接打开可能会提示没有权限因为抓包需要访问系统的原始套接字。Debian系安装过程中会问是否允许非超级用户抓包允许就行老版本不支持的手动把用户加进wireshark组再重新登录sudo usermod -aG wireshark $(whoami)macOS用户推荐用Homebrewbrew install --cask wireshark它会自动处理ChmodBPF权限问题省得自己折腾。2.2 安装后打不开常见原因排掉我见过很多人在这一步卡住Wireshark装好了点启动没反应或者提示找不到接口。这里列几个高频原因照着检查基本能解决。第一Npcap没装上或者版本过旧。解决办法是去Npcap官网重新安装最新版然后重启电脑。第二权限不够。Windows下右键Wireshark选择“以管理员身份运行”Linux下确认当前用户是否在wireshark组里。第三安全软件拦截了抓包驱动的加载。某些杀毒软件会把Npcap当成“可疑驱动”拦掉导致Wireshark打开后看不到网卡这种情况需要把Wireshark路径加白名单或者临时退出安全软件再试。这里有个很实用的检查方法在Windows下打开命令提示符执行sc query npcap如果显示RUNNING说明Npcap服务是正常的如果显示STOPPED或找不到服务那问题大概率就出在驱动上。2.3 第一次启动先认识首页成功打开Wireshark后你会看到主界面正中间的欢迎页它会把本机所有可用的网络接口列出来。常见的接口有“以太网”“WLAN”“蓝牙网络连接”等每个接口右边还有实时波动图表示当前流量大小。如果列表是空的很大概率就是Npcap驱动没装好。我先多说一句正式抓包前先把接口选对。你连着Wi-Fi就别选“以太网”插着网线就别选“WLAN”选错接口就像在小区南门等北门进出的人啥也等不到。3. 第一次抓包实战认识主界面三大面板3.1 完整抓一次包的步骤我建议第一次实操的目标就定为抓到一次访问HTTP网站的数据包。注意是HTTP不是HTTPS——HTTPS是加密的新手第一次看容易懵等后面学会解密再看。具体步骤很简单双击选中你当前在用的网卡接口比如WLANWireshark会立刻开始捕获。打开浏览器访问一个HTTP开头的网站。回到Wireshark点击工具栏上的红色方块“停止捕获”。在顶部显示过滤器输入框里输入http回车让列表里只显示HTTP数据包。随便点开一个绿色的HTTP包在协议树里展开HTTP层就能看到请求行、请求头这些内容。抓包这个过程本身没什么技术含量真正的技术含量在于怎么看包。这就得说到Wireshark主界面的三大面板了。3.2 数据包列表、协议树和字节区怎么配合Wireshark的主界面从上到下分成三个区域这是它可视化最核心的设计。第一块是数据包列表Packet List每一行就是一个数据包列字段包括编号、时间、源地址、目的地址、协议、长度、摘要信息。默认的时间列是“0.000000”很多人会问这些数字是什么其实就是抓包开始后的秒数。如果你想让两包之间的间隔更直观这里是可以改的后面讲筛选UDP时间间隔时我会详细说。第二块是协议详情Packet Details显示选中包的协议树。你可以把它理解成一层一层剥洋葱最上面是Frame帧接着是Ethernet II以太网帧头再往里是IP层、TCP/UDP层最里面才是应用层数据。每点开一层对应的字段都会高亮。第三块是数据包字节Packet Bytes显示数据包的原始十六进制和ASCII码。这块区域最厉害的地方在于和协议树的联动你在协议树里点到哪个字段字节区会自动高亮出对应的字节范围。比如你点一下Ethernet II里的“Source”源MAC地址字节区前6个字节就会被高亮正好是MAC地址的长度。实际排查问题的时候我基本都会从列表选中可疑的包然后看协议树的几层关键信息再到字节区验证原始数据。遇到HTTP、TCP这些上层协议还有一个特别省力的技巧在数据包上右键选择“Follow” - “TCP Stream”Wireshark会把整个TCP会话的原始数据拼接出来一眼就能看完整请求和响应。3.3 为什么只显示520字节怎么看到更多数据这是新手问得特别多的问题“我一个包明明有2090字节为什么Wireshark里只显示520字节的数据”遇到这种问题第一反应应该是去看协议树里有没有这样一句提示[Packet size limited during capture: 520 bytes]只要看到这句话就说明这个包在抓包阶段就被截断了只保留了前520字节后面的载荷直接丢掉了。Wireshark并不是显示不下而是压根没有抓到后续数据。为什么会被截断因为抓包时可以设置一个“快照长度”Snaplen也叫捕获长度。有些网卡驱动在缺省配置下只会保留每个数据包的前几十或几百字节用来判断数据包头部信息这在高流量场景下能省不少内存和磁盘。但遇到巨型帧Jumbo Frame载荷超过1500字节的以太网帧常见于NAS、数据中心场景如果快照长度设成了520那一个2090字节的包自然只能看到前520字节。解决办法也很简单。在抓包之前打开菜单栏的“Capture” - “Options...”找到“Limit each packet to N bytes”这个选项把它前面的勾去掉或者把值调大比如填65535甚至262144。这样抓包时就会保留完整的以太网帧。需要提醒一点如果是已经抓完的pcap文件里面被截断的包是没有办法“恢复”的丢了就是丢了只能重新抓包。另外如果你只是觉得列表“Length”列显示520字节是异常那就不一定了——小包长度本来就短HTTP请求里三五百字节的很常见关键还是看有没有上面那句截断提示。4. 过滤与定位技巧Wireshark怎么筛出目标数据包4.1 抓包过滤器和显示过滤器别搞混Wireshark里有两套过滤系统名字很像但用途完全不同很多新手在这上面翻车。抓包过滤器Capture Filter是在开始抓包之前设置的写在“Capture Options”里用的是BPF语法比如host 192.168.1.100 and port 80。它的作用是“扔”不匹配的包根本不会被记录优点是省磁盘、省内存缺点是如果过滤条件写错了数据就没抓全事后再怎么分析都白搭。显示过滤器Display Filter是已经抓到包之后在顶部那个绿色或者红色输入框里写的用的是Wireshark自己的语法比如ip.addr 192.168.1.100、tcp.port 80、http。它的作用是“藏”只是临时隐藏不符合条件的数据包原始数据还在条件改一下马上能换一批。我给新手的建议很简单默认情况下别乱用抓包过滤器全量抓下来然后用显示过滤器慢慢筛。宁可在抓包阶段多占一点空间也比漏包之后再后悔强。4.2 常用过滤表达式速查显示过滤器的语法其实不难核心就是“字段名 操作符 值”。常用操作符包括等于、!不等于、大于、小于、与、||或、!非。括号可以改变优先级和编程语言里的逻辑表达式很相似。我把自己平时用得最多的几个整理一下需求过滤表达式只看某个IP的流量ip.addr 192.168.1.100只看某个IP发出的流量ip.src 192.168.1.100只看某个IP收到的流量ip.dst 192.168.1.100只看某端口的TCP流量tcp.port 443只看HTTP明文流量http只看DNS查询dns只看TCP重传包tcp.analysis.retransmission只看某一协议的包rtp、sip、arp等组合条件http ip.addr 192.168.1.1用习惯了以后你会发现自己根本离不开显示过滤器。我建议第一次用就把常用表达式存下来显示过滤器输入框左边有个保存按钮可以给表达式起名字下次直接在“过滤条件”下拉菜单里选省得每次手敲。4.3 筛选UDP前后两包的时间间隔有一个比较常见但文档讲得少的场景想筛出UDP协议里前后两个包的时间间隔。比如你在排查一个音视频服务怀疑某两个UDP包之间隔得太久导致卡顿想定位到底是哪一帧出了问题。方法不复杂关键是用好Wireshark的时间显示格式和frame.time_delta这个字段。先讲直观的方法打开菜单“View” - “Time Display Format”选择“Seconds Since Previous Displayed Packet”。改完之后数据包列表里“Time”这一列就不再显示抓包开始后的绝对秒数而是“当前包和上一个显示的包之间隔了多少秒”。这样你翻列表的时候间隔大的包会特别明显。再讲筛数据的方法如果你只想看间隔超过某个阈值的包可以用显示过滤器直接筛。frame.time_delta表示“这个包与前一帧捕获时间的时间差”注意是帧与帧的间隔不是UDP专用。比如想筛出间隔超过1秒的包frame.time_delta 1想筛出间隔超过100毫秒的frame.time_delta 0.1还有一个骚操作是“设置时间参考”。选中一个你认为是起点的包右键 - “Set Time Reference”这个包的时间会变成0.000000后面的包显示相对它的时间偏移。这种做法的好处是不改变显示格式适合在口语中确认“从这个包开始过了多少毫秒发生了下一个事件”。如果你需要的是统计维度而不是逐包检查那就可以直接用“Statistics” - “IO Graph”把UDP流量的包速率画成图看有没有明显的断崖式下跌或者周期性卡顿。几招组合起来定位UDP包间隔问题就很顺了。5. 进阶实战长抓包、TLS解密与RTP转视频5.1 长时间抓包怎么操作多文件与环形缓冲区有时你需要在服务器或者电脑上挂机抓包比如抓一晚上第二天再分析。如果直接用Wireshark默认方式抓抓个大几个小时文件可能膨胀到几个GBWireshark打开和翻页都会卡到怀疑人生内存直接被吃满。正确做法是在捕获选项里开启“多文件”模式。操作路径是“Capture” - “Options...”勾选“Use multiple files”。这里有三个关键参数每个文件的大小或时间比如设置“每20MB切一个新文件”或者“每10分钟切一个新文件”。环形缓冲区设置“保留最近N个文件”。比如磁盘不够大你可以保留最近50个文件旧的自动删除保证磁盘不会被写满。文件名前缀给文件起一个易识别的名字比如overnight_capture_Wireshark会自动在后面加序号和时间戳。这样抓到第二天Wireshark不会一直在一个巨型文件里挣扎而是生成一批有边界的小文件每个随手双击就能打开。万一中间某段数据损坏影响也只是那一个文件不至于整个抓包记录都报废。如果是在服务器上做长抓包更推荐用命令行工具Wireshark安装目录下的dumpcap或者tshark都行不占图形界面资源。比如Windows下执行dumpcap -i 2 -w D:\caps\server_cap.pcapng -b duration:600 -b files:50参数-i 2表示抓第2个网卡接口-w指定输出文件-b duration:600表示每10分钟切文件-b files:50表示最多保留50个文件。Linux下同理把路径换成Linux目录就行。这样即使你关了Wireshark图形界面抓包进程也一直在后台跑适合需要抓整夜流量的场景。5.2 HTTPS/TLS解密拿到“钥匙”再看明文HTTP是明文抓包直接就能看到但HTTPS流量是加密的默认状态下你只能看到TLS协议层里面的HTTP请求响应全是密文。所以经常有朋友问“我都抓到TLS包了为什么看不到里面的请求内容”原因很简单你缺一把“钥匙”。要解密TLS流量首先需要拿到这个会话的密钥。最常见的做法是用浏览器的SSLKEYLOGFILE环境变量让浏览器把TLS握手过程产生的密钥主日志写入文件。注意必须先设置环境变量再启动浏览器。如果浏览器已经开了再设置变量是不生效的我在这上面踩过不少次坑。Windows下设置环境变量的路径是右键“此电脑” - “属性” - “高级系统设置” - “环境变量” - 新建系统变量变量名写SSLKEYLOGFILE变量值指向一个文件比如D:\keys\tls.log。macOS/Linux下直接在shell里执行export SSLKEYLOGFILE/tmp/tls.log设置完成后从终端里启动浏览器。然后用Wireshark抓包抓到HTTPS流量后进入“Edit” - “Preferences” - “Protocols” - “TLS”在“(Pre)-Master-Secret log filename”栏填上刚才那个密钥文件路径确定。你会发现原本的TLS包下面Wireshark已经能解析出HTTP层的内容了过滤http就能看到明文的请求头、响应体。整个过程听起来很神奇但背后的逻辑其实很简单Wireshark拿到会话密钥后相当于手里有了TLS会话的“解密钥匙”自然能把密文还原成明文的HTTP对话。这里我要强调一句密钥日志文件等同于明文内容本身千万别共享给不相关的人也不要把密钥日志放在公共网盘上。5.3 RTP流转成视频/音频还原音视频流VoIP通话、视频会议、网络摄像头大量使用RTP协议推送音视频数据。Wireshark经常被拿来抓这类流量然后很多人问怎么样才能把抓到的RTP流还原成能看的视频或者能听的音频先说音频这个最简单。抓到包之后打开菜单“Telephony” - “VoIP Calls”你会看到所有SIP呼叫记录双击其中一个呼叫Wireshark会把通话双方的所有RTP流拉出来点击右下角“Play”按钮可以直接播放这段通话的音频。如果找不到Play按钮也可以进“Telephony” - “RTP” - “RTP Streams”选中需要的流再点“Analyze”在分析窗口里点“Play”。再说视频。先通过“Telephony” - “RTP” - “RTP Streams”选中目标流然后导出RTP的载荷数据。Wireshark菜单里有“Export” - “Save Payload...”之类的选项保存出来的是一个类似.h264的裸流文件。拿到这个裸流之后再用ffmpeg做一下封装ffmpeg -i payload.h264 -c copy output.mp4之所以要用ffmpeg是因为RTP抓包出来的是一个个分片的数据包需要按顺序拼接成完整的编码帧再封装进MP4容器。如果你的RTP流里同时有H.264视频和音频RTP流操作逻辑是一样的分别导出后用ffmpeg合并即可。有一点要提醒如果你的视频编码是私有格式或者RTP打包方式不符合标准Wireshark导出的裸流ffmpeg可能不认。这种情况下Wireshark很难帮你还原你得先看协议树里RTP载荷对应的编码信息确认格式再说。另外如果你拿到一个Wireshark认不出来的协议别慌。选中任意数据包右键 - “Decode As”你可以手动指定某端口按RTP、HTTP或者其他协议来解析。这是个万能工具特别是面对一些自定义协议的时候先把端口和协议对上后面的分析才能继续。6. 常见问题排除卡住、打不开、看字节、抓蓝牙6.1 Wireshark打不开、找不到网卡怎么办打不开和找不到网卡本质上多半是底层驱动的问题。Windows下最典型的就是Npcap没装好或者被安全软件干扰。前面提到的sc query npcap检查命令非常有用。如果Npcap服务正常Wireshark依旧找不到网卡建议重新安装网卡驱动。尤其是WLAN网卡有些厂商的驱动在混杂模式下支持很差导致Wireshark列表里看到了接口但双击抓包没反应。这种情况我碰到过好几次换一个网卡驱动版本或者换一块USB网卡做抓包问题基本就消失了。6.2 Wireshark一直卡住、内存暴涨怎么解决“Wireshark为什么一直卡住”也是一个高频热搜问题。大多数情况都是因为抓包条件太宽把整个网段的所有流量全抓了下来再加上长时间不停止内存被包列表拖垮。解决办法有几个方向抓包前在“Capture Options”里加上抓包过滤器把范围收窄到目标IP和端口减少无用流量入库。在“Capture Options”里开启多文件限制每个文件的大小避免单个进程占用过多内存。关闭名称解析。菜单“View” - “Name Resolution”里把“Resolve MAC addresses”“Resolve network layer names”“Resolve transport layer names”三个都取消勾选。名称解析会在抓包过程中做反向DNS查询大量流量时非常卡。如果只是分析离线pcap文件不建议开着实时抓包窗口直接“File” - “Open”打开文件Wireshark只做解析不做写入流畅度会明显提升。我还习惯在长时间抓包时关掉实时刷新。抓包界面上那个“Packet List”的实时更新是很消耗资源的如果你是后台抓包、事后分析的模式完全可以用Wireshark菜单里的“Capture” - “Options”设置停止条件比如“N个包后自动停止”让它在后台采集完自动停再统一打开分析。6.3 查看以太网发送源数据包的字节内容有人问“Wireshark怎么查看以太网发送源的数据包字节数据”其实这个“发送源”分两层。如果你想看源MAC地址对应的原始字节就在协议树里点击Ethernet II层的“Source”字节区会高亮对应那6个字节如果你想把整个包的所有字节导出来可以右键数据包选择“Copy” - “...as Hex Stream”就能得到完整的十六进制字符串。这个技巧在做二进制协议对接时特别好用。比如对方给你一份报文格式文档里面有各种字段偏移你在Wireshark里选中一个数据包对照协议树的字段和字节区的十六进制一眼就能看出字段从哪里开始、占多少字节偏差出在哪。比单纯拿Wireshark列表里的“Info”猜内容靠谱得多。6.4 补充技巧抓蓝牙数据、抓本机回环流量蓝牙抓包也是一个被问到的问题。Wireshark本身支持Bluetooth HCI协议但前提是抓包接口得对。Windows下可以装USBPcap驱动然后在捕获接口列表里选择蓝牙设备对应的USB接口通过USB层抓取HCI数据Linux下则需要在能访问蓝牙HCI接口的条件下打开对应接口抓包。这属于进阶玩法平时调试BLE设备时才用得上普通入门阶段可以不深究。还有一个容易困惑的点抓本机回环流量。你用浏览器访问127.0.0.1的本地服务在普通网卡接口上往往是抓不到的。Windows下安装Npcap后接口列表会多出一个“Npcap Loopback Adapter”专门用来抓回环流量Linux下直接在lo接口上抓就行。最后分享一条我自己的体会用了这么多年Wireshark最大的感触是它不是一个“出问题才打开”的工具而是一个应该随时能用的基本功。数据包本身不会说谎你对协议理解得越深就越能在一堆看似乱七八糟的报文里抓住那根关键线索。希望这篇入门教程能帮你把第一步走顺少踩几个我当年踩过的坑。
返回列表