ARTICLE DETAIL

资讯详情

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

Wireshark抓包实战:从TCP三次握手到异常流量识别

Wireshark抓包实战:从TCP三次握手到异常流量识别 排查一个网络故障前端连不上后端后端说自己在正常监听两边都觉得自己没问题。最后我抓了个包30秒就定位到是TCP握手阶段没完成三次握手的第二次回包被中间设备丢了。从那以后我就养成了习惯凡是涉及网络联调、请求失败、接口超时先抓包看数据再下结论。这就是Wireshark抓包实战的价值——不靠猜靠数据说话。这篇内容围绕Wireshark在流量分析、协议拆解、异常流量识别三个方向做一次系统梳理覆盖从安装配置到过滤语法、从HTTP/TCP/TLS协议分析到CTF流量包取证再到高频疑难问题的排查思路。适合刚接触抓包的网络运维、后端开发、安全方向学生以及已经在用Wireshark但主要靠图形界面点点点的朋友。看完之后你能建立一套自己的抓包分析框架而不是停留在会启动软件、会看几行列表的层面。1. 先理清思路抓包实战到底在解决什么问题1.1 这个项目能做什么适合谁Wireshark是全球使用最广泛的开源网络协议分析器核心能力一句话总结把网卡上流经的数据包原样录下来再按照协议栈逐层拆开给你看。它解决的是网络通信中的“黑盒问题”——HTTP状态码在应用层报错时你无法确定是客户端没发出去、服务端没收到、还是中间链路出了问题而抓包可以告诉你每一层到底发生了什么。我在实际工作中发现很多人对抓包有个误解觉得只有安全工程师才需要。实际上后端做接口联调、App开发排查请求失败、运维排查网络延迟、嵌入式工程师调试设备通信、CTF选手做流量取证全都离不开它。尤其是现在HTTPS普及之后很多人抓包只能看到一堆TLS密文就以为Wireshark“没用”了其实只是还没配置解密。后面我会专门讲TLS解密。这个项目不依赖特定操作系统Windows、Linux、macOS都能跑抓包的核心机制都一样。4.x版本默认界面更清爽过滤语法自动补全也更聪明建议直接用最新版。老教程里很多基于3.x的菜单路径在4.x里略有变化但核心逻辑相通。1.2 抓包前的准备网卡、捕获过滤器、文件保存很多人打开Wireshark就点“开始捕获”然后被海量数据淹没几分钟之后机器卡到鼠标都挪不动。这不是工具不好用是没做好抓包前的准备工作。真正有效率的抓包在点下“开始”按钮之前就应该想清楚三件事。第一件事选对网卡。笔记本上通常有有线网卡、无线网卡还可能装了虚拟机的虚拟网卡、Docker的虚拟网卡。抓包必须选“流量真正经过”的那张网卡。要抓本机与服务器的通信选正在用的以太网或Wi-Fi要抓虚拟机内部流量选VMnet或类似虚拟网卡要抓本机回环流量比如客户端和服务端都在本机需要选Loopback。选错了网卡抓一晚上也看不到目标包。第二件事设置捕获过滤器。捕获过滤器在抓包前设置作用是从源头只保留符合条件的包减少噪音和磁盘占用。它用的是BPF语法常见写法比如host 192.168.1.100只抓与这个IP通信的包、tcp port 443只抓HTTPS流量。如果你只想看某一个客户端的请求用host 客户端IP and tcp port 8080这样抓下来的文件会小很多后期分析也轻松。注意捕获过滤器和显示过滤器是两码事前者在抓包前用、语法更底层后者在抓包后用、语法更丰富很多人混淆这个。第三件事配置文件保存选项。长时抓包建议用多文件轮转点击“捕获选项”在“输出”标签页勾选“使用多个文件”设置每个文件10MB或按时间切分。这样抓下来的数据自动分片不会因为单个文件过大导致打开卡死。临时抓包则不需要直接内存缓冲即可。注意抓包会记录所有流经网卡的原始数据包括密码、Token、业务数据。在他人网络环境中抓包务必先确认授权这不是技术问题是底线问题。2. 流量分析入门从抓到看懂2.1 显示过滤器常用语法与组合拳抓完包之后面对几千几万个包第一步不是挨个看而是会用显示过滤器把目标流量“筛”出来。这是Wireshark日常使用频率最高的功能甚至可以说显示过滤器的熟练程度直接决定你分析流量的效率。显示过滤器的作用是在已捕获的数据中动态筛选语法比BPF友好很多。最基础的用法是直接输入字段名比如http只显示HTTP协议包dns只显示DNS包tcp只显示TCP包。字段加条件的写法是字段名 操作符 值比如ip.addr 192.168.1.10筛选源或目标IP为该地址的包tcp.port 443筛选端口为443的包。实际工作中我常用下面几个组合场景直接复制就能用场景过滤器写法说明看某个IP的所有通信ip.addr 192.168.1.10包含源IP或目标IP看客户端与服务端之间HTTP流量ip.addr 192.168.1.10 http逻辑与用看某端口的TCP重传tcp.port 8080 tcp.analysis.retransmission重传包通常意味着丢包看DNS查询记录dns.qry.name contains example.comcontains做模糊匹配看HTTP POST请求http.request.method POST精确定位写操作看非本地地址流量!ip.addr 192.168.1.1/24排除内网噪音看TLS握手包tls.handshake.type 11代表ClientHello看两个IP之间的UDP包时间间隔udp ip.addr 目标IP配合时间列计算间隔这里有个细节特别值得记住ip.addr 192.168.1.1和ip.src 192.168.1.1的含义完全不同。前者是“源IP或目标IP是它”后者是“源IP是它”。很多人排查问题时用了ip.addr发现过滤出来一堆无关方向的包就是因为没意识到这点。同理tcp.port也包含源端口和目标端口两个方向。新手最常犯的另一个错误是写过滤条件时把协议名和字段名混着用。比如想筛选“源端口是443的TCP包”写成tcp.srcport 443是没问题的但写成tcp.port.src 443就会报错。记不住字段名的话在过滤栏右键一个感兴趣的包选择“作为过滤器应用”-“选中”Wireshark会自动生成正确的过滤语句这是最稳妥的学习方式。2.2 跟着数据包还原一次TCP三次握手TCP三次握手是理解网络通信的基础但从书上看一百遍不如在Wireshark里亲眼看一遍。我用一个最典型的场景说明客户端192.168.1.100访问服务端192.168.1.200的8080端口。抓包后显示过滤器输入ip.addr 192.168.1.100 ip.addr 192.168.1.200 tcp.port 8080。你会看到前三个包非常有规律第一个包客户端发起连接源端口是某个随机高位端口比如54321目标端口8080Flags字段显示SYN。这是客户端在说“我要建立连接”Seq序列号是一个随机初始序号比如Seq0Wireshark为方便阅读默认做了相对序号显示实际是随机数。第二个包服务端回应源端口8080目标端口54321Flags显示SYN, ACK。这个包同时做了两件事确认收到客户端的SYNACK1并同步自己的初始序列号。如果这个包客户端一直没收到就会出现“连接超时”或“卡在SYN_SENT”的现象——我在开头提到的那个故障就是卡在这一步。第三个包客户端确认Flags为ACK序列号1确认号1。到这个包为止连接建立完成双方可以开始传输数据了。在Wireshark里怎么看这几个标志位展开TCP层找到Flags字段里面会列出各个标志位是0还是1。更快捷的方式是设置一个“着色规则”把SYN包标成橙色、RST包标成红色这样一眼就能在包列表里看出连接的建立和异常断开过程。在菜单“视图”-“着色规则”里可以自定义实际项目里我很依赖这个功能尤其在大流量排查时红色RST包总是最先吸引目光的那个。理解了三次握手之后再去看“四次挥手”、重传、延迟确认这些TCP细节就会顺畅很多。TCP是一个极其讲究状态机的协议所有状态切换都能在包里找到对应的Flags组合。不要死记硬背状态名多跟着数据包走几遍连接比看书管用得多。3. 协议拆解实战HTTP、DNS与TLS解密3.1 HTTP请求响应拆解一次真实请求能看到什么HTTP协议在Wireshark里是最容易上手的拆解对象因为它是明文协议每个字段都一目了然。抓一次带登录的请求能清楚地看到请求行、请求头、请求体三个部分在包里的组织方式。打开一个HTTP请求包展开Hypertext Transfer Protocol层首先看到请求行比如GET /api/login?nametest HTTP/1.1。这一行包含了三个核心信息方法GET、URI/api/login?nametest、HTTP版本1.1。下面是请求头Host、User-Agent、Cookie、Content-Type等都在这里。最后一个空行之后是请求体如果是GET请求请求体通常为空如果是POST表单提交application/x-www-form-urlencoded的字段在请求体里能看到明文。在包列表面板上选中HTTP请求按CtrlAltShiftT菜单“分析”-“追踪TCP流”可以把这个TCP流上所有HTTP交互按照时序拼接成完整文本。这个功能排障价值极高你能在同一个视图里看到请求头、响应头、响应体全链路不用来回切换包。遇到乱码时在追踪流窗口右下角调整字符编码中文乱码大多是UTF-8和GBK的差异切换一下即可。同时要看请求和响应对应关系Wireshark提供了“HTTP请求/响应”的关联视图。在HTTP层右键选择“追踪 HTTP 流”会生成更清晰的格式化展示。实际调试中我会重点关注响应状态码分布。在菜单“统计”-“HTTP”-“请求”里可以按方法、主机、URI统计请求数快速看出哪个接口被大量调用、哪个接口返回异常状态码。比如看到某一瞬间5xx爆炸性增长就能结合IO Graph定位到具体时间窗口再缩小范围看那个时间段到底发生了什么。3.2 DNS解析过程的拆解DNS是被很多人忽略但每次上网都会触发的基础协议。只要访问域名就必然有DNS查询。抓包拆解DNS有一个特别直观的体验你能亲眼看到域名从“一串人类易读的文字”变成“机器可用的IP地址”的完整过程。在Wireshark里输入dns过滤出DNS包展开DNS层。查询包的关键字段在Queries部分example.com: type A, class IN表示客户端在问“example.com的IPv4地址是什么”。响应包的关键字段在Answers部分比如example.com: type A, class IN, addr 93.184.216.34这就是解析结果。如果查询记录不存在响应包的Answers为空状态码会变成No such name。排查“域名解析慢”问题我会重点关注DNS响应时间。Wireshark对每个DNS查询和响应之间会自动计算响应时间在包列表加入“Time”列就能看到。如果响应时间超过100ms甚至上秒优先怀疑DNS服务器本身慢或网络路径问题而不是应用层代码问题。另一个常见排查点是“DNS缓存污染”响应包里IP和你预期不一致时需要确认是不是配置了错误的DNS服务器或者是被劫持。抓包能直接看到解析到的真实IP比在浏览器里反复刷新效率高得多。DNS还有一个值得了解的扩展场景DNS隧道检测。正常DNS查询是简短的域名和IP如果你发现某个DNS请求包中qry.name异常长带有大量随机字符前缀形如a3f9k2.example.com而且频率很高这通常不是正常业务行为而是有人或恶意程序在把DNS协议当作数据传输通道。识别方法很简单过滤dns.qry.name观察域名是否包含大量不可读的随机字符串再用IO Graph看DNS流量是否有规律性的突发。这个知识点在日常企业内部网络排查中很实用。3.3 TLS 1.3解密配置SSLKEYLOGFILE与私钥导入很多人抓HTTPS流量只能看到Application Data密文然后就把Wireshark关掉了。其实早在Wireshark 4.x版本里TLS解密已经非常成熟只是需要给它提供“密钥”而这个密钥可以通过浏览器或客户端导出来。抓HTTPS、调试小程序和App请求都依赖这个技能。先说最简单的方案配置SSLKEYLOGFILE环境变量。Chrome、Firefox在编译时内置了对这个变量的支持当设置了环境变量后浏览器会把每次TLS握手中的通信主密钥Master Secret写入指定文件。Wireshark读取这个文件后就能解密该浏览器产生的所有HTTPS流量。具体操作分三步。第一步设置环境变量并指定密钥文件路径在Windows上执行set SSLKEYLOGFILED:\sslkey.log在Linux/macOS上执行export SSLKEYLOGFILE/tmp/sslkey.log。第二步从这个路径下启动浏览器用这台浏览器正常访问网页。第三步Wireshark中打开“编辑”-“首选项”-“Protocols”-“TLS”在“Pre-Master-Secret log filename”中填入刚才的路径。保存后重新开始抓包原本的一堆TLS Application Data就会变成可读的HTTP报文。在TLS 1.3中密钥协商过程变化很大最明显的是握手从两轮RTT变成了一轮RTTChangeCipherSpec包被移除密钥推导逻辑也更复杂。但好消息是只要配置了SSLKEYLOGFILEWireshark会自动处理这些细节分析者不需要手工解析密钥派生过程。如果你是做安全研究、需要深入理解TLS握手中的密码学参数可以在过滤栏输入tls.handshake.type 1看ClientHello里携带的密码套件列表再配合tls.handshake.type 2看服务端选择了哪套加密算法。如果你抓的是自己的服务端比如用Go或Nginx部署的HTTPS接口还可以直接在Wireshark里配置服务端私钥在TLS首选项中填写私钥文件路径。但要注意这种方式只对“由服务端直接私钥签名的会话”有效而且如果服务端启用了前向保密ECDHE等单纯私钥并不能解密流量此时还是要靠SSLKEYLOGFILE方案。实际项目里我基本都用第一种方式私钥方案只在无法修改客户端环境时兜底。提示配置SSLKEYLOGFILE后务必在完成调试后把环境变量删除否则密钥文件会持续记录你的所有HTTPS活动长时间留在磁盘上是一个安全隐患。4. 异常流量识别从一堆包里捞“坏包”4.1 常见异常流量长什么样抓包分析做到后面重心基本都会转移到异常识别的方向在大量正常流量中定位那些“不对劲”的包。异常流量在包特征上通常有相对固定的模式只要知道模式过滤语法就是现成的工具。第一类是高重传率。TCP重传本身是正常机制用于应对丢包但当重传比例异常升高时说明网络质量在恶化。Wireshark对重传包有专门标记过滤语法tcp.analysis.retransmission可以筛出所有重传包。在“统计”-“TCP流图”Flow Graph里能直观看到某个连接里重传的时间分布。如果重传集中在同一时间点大概率是瞬间拥塞如果持续均匀分布可能是链路本身不稳定或中间设备丢包。重传率超过统计数据基线就得深入排查了。第二类是SYN洪泛特征。正常情况下TCP连接建立会有SYN、SYN-ACK、ACK三个包交替出现。如果你在“统计”-“端点”里看到某个IP的对端连接数异常巨大或者在IO Graph里看到大量纯SYN包形成密集尖峰而对应的SYN-ACK几乎为零这不是正常的连接建立行为而可能是端口扫描或DDoS攻击。识别这种模式时我会直接过滤tcp.flags.syn 1 tcp.flags.ack 0把纯SYN包全部摘出来看源IP分布。第三类是ARP风暴。ARP是局域网内查询IP对应MAC地址的协议正常流量很小。一旦局域网内出现ARP广播风暴所有设备的网络都会变得卡顿。在Wireshark中过滤arp如果看到ARP请求包在短时间内大量重复请求同一个IP而且请求源在变化多半是IP地址冲突或ARP欺骗。帧头标识“ff:ff:ff:ff:ff:ff”的广播ARP包如果占满整个捕获窗口说明问题已经很严重。第四类是DNS异常形态。刚才讲过的DNS隧道、DNS重绑定、超长查询名都属于这类。普通业务域名通常有规律而异常DNS请求往往伴随随机子域名前缀、高频查询、极少响应等特征。识别逻辑就是先建立“正常基线”再找偏离基线的点。异常类型过滤语法关键分析点TCP重传tcp.analysis.retransmission在哪个时间点、哪些连接爆发纯SYN包风暴tcp.flags.syn 1 tcp.flags.ack 0源IP分布是否分散RST异常断开tcp.flags.reset 1大量RST意味着连接被拒绝或中途切断ARP广播风暴arp.opcode 1目标IP是否集中在同一地址DNS隧道dns.qry.name matches .*[0-9a-f]{20,}.*域名是否包含超长随机字符串ICMP异常icmp.type 8高频Ping通常意味着探测或隧道4.2 用统计功能快速定位Endpoints、IO Graph、Flow GraphWireshark不只是个“放大镜”它的统计模块本身就是一套异常定位雷达。很多人不知道“统计”菜单下的几个工具才是大流量排查的主力。排查的第一步是打开“统计”-“端点”Endpoints这里会按IPv4、IPv6、TCP、UDP几个维度列出所有通信实体每行显示发包数、收包数、流量字节数。我一般会先按“数据包”列排序排名第一的IP大概率就是流量大头。如果这个IP看起来不像业务服务器那基本可以判定它在做异常通信。再双击某一行Wireshark会自动应用过滤器把该IP的所有会话筛出来直接进入下一层分析。第二步是IO Graph。菜单“统计”-“IO Graph”可以按时间轴展示流量速率曲线图形化看出流量在哪个时间段发生了暴涨或暴跌。流量分析里有一句话叫“异常往往发生在尖峰处”一个正常的业务系统流量曲线应该是相对平滑的波浪状如果出现陡峭的针状尖峰那个时间点就是排查的切入点。IO Graph里还可以叠加多条曲线比如把tcp.analysis.retransmission叠加在总流量之上能直观看到重传是否与流量峰值同步。如果两者同步说明是流量过大导致的拥塞如果重传尖峰出现在流量低谷时就要怀疑链路质量问题了。第三步是Flow GraphTCP流图“统计”-“流量图”。这个工具把TCP连接按时间顺序画成时序图每个方向的数据包用箭头和颜色区分SYN、ACK、RST、数据段都清晰可见。分析“为什么某次请求耗时特别久”时Flow Graph是首选你可以从一个连接的第一个包开始顺着时间轴看到每一次交互的间隔。有一次排查支付接口偶发超时我就是用Flow Graph发现响应包到达后客户端侧出现了长达2.3秒的延迟才发出确认ACK这个延迟发生在客户端本机与网络无关最终定位到客户端应用层阻塞。没有Flow Graph这种问题几乎无法从书面上推断。4.3 实战案例SYN洪泛识别和ARP风暴排查用一个具体案例把上面的方法论串起来。某次内部演练中业务方反馈管理后台登录变得异常卡顿。我选择管理网卡抓包10分钟抓到约50万包。打开“统计”-“端点”发现一个IP10.20.30.40的连接数接近5万个远超其他主机。于是双击该IP过滤出这个源IP的所有流量。过滤后发现几乎每个包都是tcp.flags.syn 1 tcp.flags.ack 0的纯SYN包目标端口比较分散但都集中在3306、6379、27017等数据库端口。这意味着有人在用脚本扫描内网数据库端口这种扫描行为会消耗不少TCP半连接资源给防火墙和服务器带来压力正常业务因此卡顿。定位到源IP后我再看看对方的MAC地址和主机名通过DHCP请求和NetBIOS信息确认是测试网段的一台跳板机中了扫描病毒。处置方式很简单隔离该主机清理恶意进程业务随即恢复。整个过程从开始抓包到定位只用了一轮“端点过滤”操作如果不用Wireshark靠翻服务器日志不知道要翻多久。另一个案例是ARP风暴排查。用户反馈整个办公室网络集体变慢在接入交换机上抓包过滤arp后发现每秒有上千个ARP请求都在请求同一个IP的MAC地址而这些请求的源IP各不相同。ARP协议设计上是广播交互短时间内出现海量单目标ARP请求属于典型的IP地址冲突场景——多台设备配置了同一个IP各自尝试宣告自己的MAC地址。解决方法是到交换机上查这个IP对应的接口逐个断开确认找到冲突的终端修改IP即可。抓包在这里的价值是精确锁定了冲突的IP和参与冲突的设备数量不用再做大量假设性排查。5. 进阶扩展CTF、命令行走批与高频问题速查5.1 CTF流量分析思路从pcap到Flag流量分析是CTF比赛中一个高频且非常有区分度的题型给你一个pcap包让你从流量里找Flag。很多人拿到包一头雾水其实CTF流量题有相对固定的套路跟Wireshark的掌握程度直接相关。拿到pcap的第一步永远是“看总量”。用“统计”-“协议分级”看一眼协议分布如果HTTP占比很高基本可以确定Flag藏在某个Web请求或响应里如果TCP流很多优先用“追踪TCP流”逐个看有没有可疑文本如果都是ICMP和DNS那大概率是隐蔽信道题Flag以拆分方式藏在小包载荷里。协议分级这个功能界面简单作用却常被低估它相当于体检报告告诉你重点往哪儿看。HTTP流量是最常见的藏Flag点。直接用过滤http筛出所有HTTP交互配合“文件”-“导出对象”-“HTTP”可以把HTTP响应中传输的所有文件原样导出。导出的文件可能是图片、压缩包、脚本Flag往往就埋在某个文件里。我在实际题目中经常遇到Flag藏在图片文件的末尾用strings命令扫一下就能看到这种题考的就是“你会不会想到把HTTP对象导出来”而不是多高深的分析技巧。如果不是HTTP重点就转向TCP流。用“追踪TCP流”把每个编号的流过一遍关注搜索字符串flag、key、secret、{等关键词。在正文搜索窗口里点“查找包”搜索类型选“字符串”输入flag或ctf可以快速定位包含关键词的包。很多时候题目就是生成一次包含Flag的明文TCP通信简单直接。再进阶一点的是隐蔽信道类型。Flag可能被拆成多段隐藏在ICMP数据区域、DNS查询名的子串、甚至TCP序列号里。识别方法是先看协议分布里有哪些“不搭”的协议一个看起来像社交App的流量里却有一堆ICMP包或者DNS查询有明显的高频随机子域名这些都是线索。拆分隐藏在DNS查询名里的Flag需要手工把所有异常查询名按顺序拼接再按常见编码格式Base64或Hex解码。这种题本质考的是判断力在数据里发现“不该出现的东西”。5.2 命令行补位tshark与pyshark联动Wireshark图形界面交互体验好但文件多、重复操作多时命令行工具tshark效率碾压UI。tshark是Wireshark套件自带的命令行版本功能几乎完全对应。比如我想从一个大pcap里提取所有HTTP请求中访问的URL用tshark一条命令就能搞定tshark -r capture.pcap -Y http.request -T fields -e http.host -e http.request.uri-r指定读取文件-Y是显示过滤语法-T fields指定输出字段模式-e跟着要输出的字段名。执行后每行输出一对“域名URI”再配合sort和uniq -c就能统计高频接口。对比在Wireshark里一个一个看包效率是数量级的差距。筛选UDP前后两包时间间隔这个问题也可以用tshark解决。比如要计算某个UDP流中相邻包的时间差可以先把帧时间戳导出来再用脚本算差值tshark -r capture.pcap -Y udp ip.addr 192.168.1.10 -T fields -e frame.time_epoch -e udp.srcport -e udp.dstport udp_log.txtframe.time_epoch输出Unix时间戳精度到微秒拿到手之后用任意脚本按源目端口分组算相邻时间差就能解决“包与包之间的时间间隔是多少”的问题。Wireshark图形界面里虽然右键能看到frame.time_delta_displayed字段但量大时导出来算更方便。pyshark是tshark/Wireshark的Python封装可以在脚本里直接解析pcap文件。网上经常有人问“python2.7 pyshark 无法抓包”。遇到这个问题的直接原因是版本兼容性Python 2.7早已停止维护新版pyshark只支持Python 3.6以上旧版pyshark即使能装到Python 2.7上也会在后续依赖库升级后报一堆缺少模块的错误。解决办法就是换Python 3环境并安装与Wireshark版本匹配的pyshark。如果是实时抓包报权限错误在Linux下需要以root运行脚本在Windows下确认WinPcap/Npcap驱动正常。实际上我的习惯是优先用tshark命令行完成过滤和字段提取数据量太大或需要复杂计算时再交给Python处理pyshark更适合 pcap 离线分析和自动化测试场景。5.3 Wireshark高频问题速查帮你少走弯路在4.x版本中菜单路径与旧版有部分差异但核心功能位置稳定。下面是我在实践中遇到频率最高的一批问题和解法基本覆盖了新手到进阶的典型坑。“为什么抓包只能看到520字节显示不出完整数据”这个问题的本质是Wireshark默认按TCP分段显示或者说抓包时设置了过小的快照长度。看看窗口底部状态栏的“... captured ... bytes”提示如果是520或类似数值说明抓包时设置了“限制每个包的大小”。解决方法是重新抓包时在“捕获选项”里取消勾选“Limit each packet to N bytes”把快照长度设为默认完整帧。另外对于TCP分段的数据在“编辑”-“首选项”-“Protocols”-“TCP”里勾选“Allow subdissector to reassemble TCP streams”可以让我们看到应用层完整消息而不是一个段一个段的裸TCP数据。这个“重组”选项默认是开启的如果你发现HTTP载荷被拆得七零八落第一件事查它就是正确的。“为什么抓到的App请求都是TLS密文看不到内容”这个前面已经讲过你需要配置SSLKEYLOGFILE并且确保App或调试环境支持导出密钥。另外很多App启用了证书固定即使配了密钥文件也可能解不开。对于自研App开发期一般可以关闭证书固定或用调试包抓取对于第三方App还有一套基于越狱或虚拟化的方案但这超出了这篇的讨论范围。这里我更推荐在PC上用一个支持配置代理的框架比如Charles、Fiddler配合Wireshark做TLS明文的联合排障。“抓不到小程序或Flutter App的包怎么办”首先是确认流量是否真的走了你监听的网卡。小程序运行在微信进程内多数流量走系统代理或Wi-Fi如果你的监听设备是PC需要把手机或PC放在同一局域网并且设置代理指向PC的IP。其次是证书信任所有HTTPS调试的通用前提是让目标客户端信任你的根证书这步不做即使代理设置正确也只能看到密文。Flutter应用默认使用BoringSSL理论上遵循系统代理实际中有时不走系统代理需要在客户端侧配置横向代理或者使用透明网关抓包。抓包失败的第一反应永远是“流量到底有没有经过我”而不是“Wireshark坏了”。“抓包文件太大打开卡死怎么办”应对方式是分片抓包和抓包后过滤。分片在第一节讲过“捕获选项”-“输出”里设置多文件轮转。还有一种情况是单个会话特别大比如一个视频流可以用捕获过滤器先把大流量源排除。真的拿到的包很大时先用tshark -r big.pcap -Y 过滤条件 -w small.pcap把需要的流量单独导出成小文件再打开这样操作流畅很多。“RTP流怎么转成视频”RTP经常承载VoIP或网络摄像机视频流。在Wireshark中打开包含RTP的pcap菜单“统计”-“RTP”-“流分析”选择对应的RTP流后点“播放”可以监听音频对于视频流Wireshark本身不做转码需要先把RTP载荷导出为H.264裸流再用ffmpeg封装。常见做法在包含RTP的包上右键选择“导出分组字节流”或使用tshark -r xxx.pcap -Y rtp -T fields -e rtp.payload rtp.txt拿到载荷再写脚本把十六进制载荷拼装成H264文件。这个过程有点绕但如果你的工作涉及视频监控或VoIP排障这个技巧能帮你把“看不见摸不着”的RTP流变成可以直接播放的文件。“想要过滤某个VLAN的流量怎么做”如果交换机给端口打了VLAN Tag抓到的包会包含802.1Q头部。过滤语法是vlan.id 100先看协议分级里有没有出现802.1Q再按Tag为VLAN ID过滤即可。这个场景在办公网出口、数据中心接入层很常见不加VLAN过滤的话不同VLAN的包混在一起分析效率极低。“查看以太网发送源的数据包字节内容怎么做”在包列表点开任意帧展开Ethernet II层里面Source、Destination、Type三个字段就是完整帧头。要查看载荷的原始二进制右键选择“复制”-“...为十六进制转储”或者直接在下方的Packet Bytes面板里查看十六进制与ASCII对照。这是最基础的“逐字节查看”方式在分析自定义协议时是必要技能。上面这些看似零散的问题其实反映了一个共同的分析习惯先确认抓包环境是否正确再确认过滤语法是否覆盖目标最后才去看具体内容。大部分“抓不到”“看不到”“解析不对”的问题根因都出在前两步。最后再分享一个小技巧我给自己的Wireshark配了一套固定的列布局——No.序号、Time相对时间、Source、Destination、Protocol、Length、Info外加自建的“Delta”列用来显示与上一包的间隔。这套布局用了很多年分析效率提升明显。时间列默认显示每秒时间戳我习惯改成“自上一包显示时间”的增量模式这样在审视大量同类请求时哪个包延迟异常一眼就能看出来。在实际操作中我最大的体会是Wireshark的能力上限很大程度上取决于你对协议本身的理解深度。工具只是把数据摊开给你看能不能看出问题取决于你是不是知道“正常应该是什么样”。多抓自己服务的正常流量建立清晰的基线印象等异常出现时你自然会在包里认出它。
返回列表