ARTICLE DETAIL

资讯详情

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

Wireshark网络抓包与排错实战:从封包分析到故障定位全流程

Wireshark网络抓包与排错实战:从封包分析到故障定位全流程 你有没有遇到过这种场面线上业务突然报错后端团队盯着日志喊请求根本没到我们这边前端拿着浏览器调试工具喊明明已经发出去了两个团队谁也说服不了谁。我在这种场景下当过很多次裁判最后都是同一个工具出面一锤定音——Wireshark。它不是什么高深莫测的黑客工具而是一项用于网络封包分析的通用技能凡是网卡上经过的数据包它都能拦下来给你层层扒开看。这篇文章我不打算照着官方文档复述界面功能而是按我实际使用它的思路走一遍从安装、抓第一批包、看懂过滤语法到拿一个真实故障走完整个排查链路再把几个高频小坑一并处理掉。刚入门的同学可以照做已经用过一段时间的也可以重点看后面的排错思路和坑点部分。1. Wireshark安装好之后别急着双击版本、接口和权限才是第一道坎1.1 选对版本和底层驱动省掉后面一半的麻烦Wireshark的下载安装看似简单实际上不少人在第一步就埋了坑。官方网站提供的Windows安装包通常会捆绑安装抓包驱动Npcap这是新版Wireshark唯一支持的底层抓包驱动老教程里常见的WinPcap已经停止维护了不要再选。安装Npcap时有两个选项值得留意一是Install Npcap in WinPcap API-compatible Mode这个兼容模式默认不勾选就好除非你有老软件依赖WinPcap接口二是Support raw 802.11 traffic如果你的无线网卡支持勾上可以在Wi-Fi环境下看到更多链路层信息但普通用途不需要。macOS用户装完主程序后还涉及一个ChmodBPF包的授权问题安装器一般会提示别跳过。Linux用户用发行版自带源安装即可比如Debian/Ubuntu下的apt install wireshark安装过程中会询问是否允许非root用户抓包选Yes然后把自己加入wireshark用户组。版本选择上认准官方稳定版就好4.x系列都能满足日常需求没必要追开发版或第三方修改版。1.2 抓包接口选择的本质你打算监听哪个门口的声音打开Wireshark第一个画面是接口列表里面会出现以太网、WLAN、蓝牙等一堆接口。新手最大的误区就是随便选一个就开抓然后抓了一堆无关包。你要清楚一件事每个接口对应一个真实的网卡选错了接口等于站在错误的路口监听自然听不到想听的对话。日常使用中以太网接口抓有线网络流量WLAN接口抓本机无线网卡收发的流量Loopback接口抓本机进程之间的回环流量。这里有一个重要限制在Wi-Fi环境下多数民用网卡只能抓到本机收发的包而不是整个无线信道上所有设备的包因为无线报文本身是加密的网卡没有目标设备的密钥就解不开。想监听交换机上其他机器流量需要网络侧做端口镜像或流量镜像然后把镜像口接到你的抓包机上这不是插一根网线就能实现的事。补充一个实用场景如果你的目标服务器是Linux且没有图形界面Wireshark支持通过SSH远程抓包在捕获选项里选择远程接口填入服务器的SSH信息即可服务器端只需要有dumpcap或tcpdump。这个功能我在排查线上服务器问题时经常用避免了在业务机上装图形环境的风险。1.3 权限不足的经典表现能看到网卡但一开抓就是0个包权限问题排在所有抓不到包问题的第一位。Windows下要以管理员身份运行WiresharkmacOS首次运行需要授权网络抓包权限Linux普通用户如果没有加入wireshark组就会看到接口列表但无法开始抓包或者抓到的包为0。Npcap安装时如果选择了Restrict Npcap to administrator users only那么普通用户即使装了驱动也没权限抓。这里分享一个我的习惯不要图省事直接用root跑Wireshark图形界面程序用最高权限运行风险太大。正确做法是在Linux上把自己加入wireshark组Windows上为Wireshark快捷方式设置以管理员身份运行这样既能正常抓包又不用承担安全风险。如果加了组还不生效记得注销重新登录一次。2. 第一次抓包先把主界面看懂再动手不迟2.1 满屏乱飞的包其实只需要看懂四个面板Wireshark的主界面表面上看眼花缭乱实际核心只有几块。最上面是工具栏和过滤栏往下是包列表再往下的左半部分是包详情右半部分是包字节最底部是状态栏。包列表区每一行代表一个数据包默认按捕获时间顺序排列每列分别显示编号、时间、源地址、目的地址、协议、长度和信息摘要。包详情区是把一个包按照协议栈从物理层到应用层逐层展开的树形结构比如一个HTTP请求包你可以在里面依次看到以太网头、IP头、TCP头、HTTP头每一层都可以继续点开看字段。包字节区则显示这个包在链路层的原始十六进制数据和ASCII字符对照。初学者拿到一届抓包结果不要急着一个个点开看。正确顺序是先扫一遍包列表的Info列大致了解流量结构再挑感兴趣的几个包看详情。Info列其实已经帮你做了初步摘要比如TCP三次握手的包会显示SYNSYN-ACKACKHTTP请求会显示GET /index.html HTTP/1.1。2.2 捕获过滤器和显示过滤器两种语法千万别混用Wireshark有两种过滤器名字相近原理完全不同混用是新手报错的第一大来源。捕获过滤器是在抓包开始之前设置的它的作用是决定哪些包被记录到内存或磁盘里没被记录的包就像没发生过一样之后再也找不回来。它的语法是BPFBerkeley Packet Filter风格比如host 192.168.1.10 and port 80。显示过滤器则是在已经捕获的数据中做筛选只影响显示不影响原始数据随时修改随时生效语法是Wireshark自己的一套比如tcp.port 80、http.request.method GET。很多新手把显示过滤器语法tcp.port 80填到捕获过滤器的输入框里Wireshark直接报红字语法错误。要记住捕获过滤器里的写法是port 80或tcp port 80不是tcp.port 80显示过滤器里才用和点号字段名。那我什么时候需要用到捕获过滤器在流量极大、磁盘空间有限、或者只关心某类协议的场景下才值得用比如从核心交换机镜像口抓全量流量时磁盘几分钟就可能写满这时用捕获过滤器精准截留有效流量。日常排错中我更推荐全部抓下来然后用显示过滤器反复筛选因为抓包数据是事后排查的唯一依据宁多勿缺。2.3 第一个实验抓一次本机HTTP请求亲眼看看三层握手理论铺垫够了现在做第一个实验。我的建议是在本机起一个HTTP服务这样可以完全控制流量不受外部干扰。打开终端执行python3 -m http.server 8000然后在Wireshark接口列表中选择Loopback接口Windows上叫Npcap Loopback AdapterLinux上叫lo点击开始抓包。用浏览器访问http://127.0.0.1:8000看到目录列表后停止抓包。在过滤栏输入http剩下的包就很有代表性了你会先看到TCP三次握手的三个包——SYN、SYN-ACK、ACK然后是一个GET / HTTP/1.1请求包再往后是200 OK响应包对应的一系列分段。这一步的目的不是掌握什么炫技操作而是让你对一次HTTP请求在网络上长什么样建立直观印象。我见过不少看了好几个月抓包文件的人问他一次页面请求包含哪几类包还是说不清楚。如果这个实验做完能脱口而出TCP三次握手加HTTP请求响应你对网络协议的理解就已经超过大部分只会写增删改查的同行了。一个小技巧抓包前在左下角显示过滤器旁边把时间显示格式改成相对时间显示列的Time栏用View菜单调为Seconds Since Previous Captured Packet这样看每个包之间的时间间隔非常直观后面排错延迟时特别有用。3. 显示过滤器才是核心功底常用表达式、HTTP完整追踪与TCP时间线3.1 入门先背这几类过滤表达式但不建议死背显示过滤器是Wireshark使用频率最高的功能我先把日常排错里最常用的几类列出来建议直接抄进自己的笔记里。过滤目的过滤表达式某个IP相关的所有包ip.addr 192.168.1.10源IPip.src 192.168.1.10目的IPip.dst 192.168.1.10某个TCP端口tcp.port 443某个UDP端口udp.port 53只看DNS流量dns只看HTTP GET请求http.request.method GET按域名过滤DNS查询dns.qry.name contains example.com只看TCP重传tcp.analysis.retransmission只看TLS握手包tls.handshake.type 1组合逻辑用and、or、not和括号比如ip.addr 192.168.1.10 and tcp.port 80。这里有一个高频误区排查某台机器时用ip.addr还是ip.src/ip.dstip.addr是包含源或目的任意一方匹配适合所有跟这台机器有关的包这种场景如果想精确区分方向必须用ip.src和ip.dst。这些表达式不建议死背最好的学习方式是在包详情里点中某个字段Wireshark会自动把对应的过滤字段名显示在状态栏或者右键菜单里点作为过滤器应用就能自动生成。用多了自然就记住了。我的习惯是把最常用的几个存成过滤栏左侧的快捷按钮一点即出省得每次输入一长串。3.2 把一条HTTP请求从头看到尾Follow Stream的威力在包列表里随便选中一个HTTP包右键选择Follow → HTTP StreamWireshark会把这次HTTP连接中所有请求和响应拼接成一个完整的对话窗口。这个功能在排错时的地位怎么强调都不为过因为它让你直接看完整的业务交互过程而不是一个孤立的包。我举一个真实的技术案例。曾经有个本地联调的Web项目开发反馈登录接口调用成功但页面一直跳回登录页。我抓包后Follow HTTP Stream才发现真相登录接口的响应头里Location字段跳转到了首页路径同时Set-Cookie里有个Secure属性。问题就出在这个Secure上——在HTTP环境下带Secure属性的Cookie浏览器不会保存和回传于是每一次跳转都被服务端视为新会话永远停留在未登录状态。这种问题如果不看完整的请求响应序列靠对着代码翻半天也不一定能想到。Follow Stream窗口里还能直接看到请求头里的User-Agent、Referer、Cookie以及响应头里的Content-Type、Location等字段。这些信息对排查为什么我的请求被拒为什么重定向到了错误的地址服务端到底返回了什么状态码这类问题非常直接。掌握Follow Stream之后你排查HTTP问题的效率直接翻倍。3.3 用TCP时间线判断慢到底慢在哪一环HTTP层看不出问题时就要往下沉到TCP层。TCP排错最常看两类信息包的重传情况和包到达的时间间隔。捕获文件里如果存在网络丢包Wireshark会自动识别并标记重传包。直接过滤tcp.analysis.retransmission就能把所有重传包挑出来。我遇到过一次接口偶发超时的排障开发怀疑是应用自己慢我抓包一看目标端口上每隔几百毫秒就有一个TCP重传客户端发了数据服务器迟迟不回ACK后来换了一条网线、换了一个交换机端口问题立刻消失。这就是典型的链路层丢包应用层日志永远看不出来只有抓包能看到。时间线分析可以用Statistics菜单下的TCP Stream Graph里的Time-Sequence图它能画出TCP序号随时间的推进曲线。如果曲线出现平台期或倒退说明有重传或乱序。日常排错时我更常用的简单办法直接看包列表里的Time列计算出现时间间隔。比如客户端发出请求后过了2秒才收到第一个响应包那瓶颈就在服务端处理上如果请求包本身就花了1秒才发出去那问题在客户端网络。这个一秒钟定位责任方的能力正是Wireshark最有价值的地方。4. 实战排错一个网页打不开的完整定位链路4.1 复现问题前的抓包准备理论知识讲再多不如走一遍真实问题的排查链路。假设这样一个场景内网某业务系统域名假设为oa.internal.example时不时报无法访问此网站其他内网系统都正常开发查了服务端日志没有报错运维说网络连通性正常。这时候所有人都等着看锅在谁身上我的做法是先在客户端电脑上抓包用事实说话。打开Wireshark过滤栏先不急着写直接抓全量流量然后在客户端浏览器里反复刷新页面直到复现无法访问的报错立刻停止抓包。抓到包之后在过滤栏输入host oa.internal.example把跟目标域名相关的包全部筛出来。到这里先停一下说一下我的排查思路网页无法访问无外乎四个环节出问题——DNS解析失败、TCP连接无法建立、TLS握手失败如果是HTTPS、HTTP层返回异常。按照这个顺序逐层排除每一层用过滤表达式快速验证整个过程不应该超过十分钟。4.2 第一层先看DNS有没有把域名解析成IP过滤栏输入dns把DNS流量单独筛出来。正常情况应该能看到一次查询和一次响应响应包里还有A记录的解析结果。如果只看到查询没有响应或者响应里没有A记录那问题基本可以锁定在DNS解析这一层可能是本地DNS缓存异常、DNS服务器不可达或者域名解析配置错误。我在这个案例里看到的现象是DNS查询正常发出响应也回来了A记录对应的IP和预想一致。说明这一层没问题。顺带提一句DNS排查时有个隐藏坑浏览器和系统可能有缓存如果复现问题时没走真实DNS解析抓包会看不到DNS流量。所以复现前最好先清一下DNS缓存或者用无缓存的环境测试确保你抓到的真的是完整链路。4.3 第二层TCP三次握手到底有没有完成过滤栏换成tcp.port 443这是业务系统使用的HTTPS端口。正常流程下你能看到三个包客户端发SYN服务器回SYN-ACK客户端再回ACK。如果只有SYN而看不到SYN-ACK包还会一直重传说明SYN包被中间设备丢弃或服务器没监听这个端口如果看到SYN-ACK后马上跟着一个RST包说明服务器虽然在线但主动拒绝了连接常见原因包括服务端口未监听、防火墙策略拒绝、连接数满等。这个案例里三次握手是完整的SYN、SYN-ACK、ACK一个不缺时间间隔也正常。到这里已经能排除端口不通、防火墙拦截这类网络层问题。到这一步许多没有抓包经验的人可能就会转向那是不是应用的问题但别急HTTPS还有一个关键的中间环节没看。4.4 第三层TLS握手在哪个字段上断掉过滤栏输入tls只看TLS相关包。正常HTTPS握手的顺序是ClientHello → ServerHello → Certificate → Key Exchange → Finished。我在这个案例里看到的现象有些诡异ClientHello发出去了ServerHello也正常返回但到了Certificate之后客户端直接发送了一个Encrypted Alert然后连接断开页面上表现为无法访问。点开那个Encrypted Alert包在TLS层的Alert字段里能看到具体描述这里显示的是handshake_failure。再用Analyze菜单下的Expert Info看一下汇总Wireshark已经把这类事件标成了Error级别。到这里问题就很清晰了TLS握手在证书交换阶段失败。结合服务器配置检查最终定位是服务器只配置了叶子证书没有把中间证书一并下发导致客户端无法构建完整的证书信任链。修复方式是补全证书链把中间证书和叶子证书合并配置到Web服务器的ssl_certificate配置项里。修复后重新抓包TLS握手完整走完页面恢复正常。这个案例最典型的借鉴意义在于整个排查是逐层递进的每一层都有一句是否排除的判断依据而不是靠猜。DNS正常不代表网络正常TCP通不代表应用正常TLS握手成功才是HTTPS真正能传输业务数据的起点。5. 高频小坑与进阶操作中文乱码、VLAN标签、BLE抓包与可视化分析5.1 抓包内容里的中文为什么显示成黑点这是一个询问频率极高的问题在Follow HTTP Stream窗口里看接口返回的中文结果中文全部变成了.........。原因其实不复杂——Wireshark默认使用UTF-8字符集来解码可见文本如果你的请求或响应体里是GBK编码的中文UTF-8解码器无法识别这些字节就直接用不可打印字符替代显示。解决办法也并不神秘。最直接的做法是切换到Packet Bytes区域看原始十六进制数据在包详情里点中应用层字段下端面板就会显示对应的十六进制序列找到中文对应的字节段复制出来后用支持GBK解析的方式转换。我实际用起来是这样处理的拿一段十六进制数据用Python按GBK解码data bytes.fromhex(e6 b5 8b e8 af 95) print(data.decode(gbk))自然会得到正确的测试两个字。当然如果接口返回本身就是UTF-8编码Wireshark直接就能显示出现乱码十有八九是GBK老系统。另外一个实用提示Wireshark的Follow Stream对话窗口在新版本里也提供了字符集切换选项位置随版本略有差异找不到就老老实实用十六进制加解析工具的办法这个办法在任何版本里都稳定有效。5.2 抓包看不到VLAN标签到底是怎么回事很多做网络运维的朋友问过一个问题明明交换机上配置了VLAN但在Wireshark里看不到802.1Q VLAN头过滤vlan.id也过滤不出来。这里有两类情况要分清。第一种情况抓包位置不对。你电脑直连交换机access口时交换机在从access口转发流量之前就已经把VLAN标签剥掉了抓包自然看不到。要看VLAN标签必须把抓包设备接到trunk口或者通过镜像口镜像trunk流量。第二种情况Windows网卡驱动开启了VLAN Offload这类硬件加速功能网卡在把数据包交给Wireshark之前就剥离了VLAN标签。解决方法是到设备管理器的网卡高级属性里找到与VLAN、优先级相关的选项比如VLAN OffloadPacket Priority VLAN之类把它们设为Disabled然后重新抓包。注意改完这个设置会影响网卡性能抓完包建议恢复默认值。如果运气好你手里的抓包文件里其实有VLAN标签想筛特定VLAN的流量直接使用显示过滤器vlan.id 100或者vlan来只看所有带VLAN标签的包。用排除法判断到底是驱动问题还是抓包位置问题最快的方法就是先看抓到的包里的Ethernet头有没有0x8100类型字段没有就是这两个环节里某一步把标签弄丢了。5.3 想只抓指定蓝牙BLE的包你得先有正确的硬件有人以为电脑自带蓝牙Wireshark就能直接抓BLE这是很大的误区。普通电脑的蓝牙网卡不会把BLE空口数据包交给Wireshark要么得有专门的抓包硬件要么得走设备日志导出的间接路线。我推荐两种方案。方案一硬件方案Nordic的nRF Sniffer一个USB蓝牙dongle刷上Sniffer固件后插到电脑上会被识别成一个专用的抓包接口Wireshark接口列表里直接选择它显示过滤器输入btle就开始抓BLE流量。如果要盯着特定设备可以用btle.advertising_address xx:xx:xx:xx:xx:xx来只筛出该设备发出的广播包。方案二软件方案用Android手机开启开发者选项里的蓝牙HCI信息收集日志功能然后正常操作蓝牙设备交互结束后从手机导出抓包日志通常是btsnoop格式再用Wireshark打开分析。这个方案不需要额外硬件适合临时取证但只能看到本机作为对端参与的蓝牙通信。BLE抓包属于相对进阶的领域抓之前先搞清楚你要看的是广播事件、扫描请求还是连接事件因为不同阶段关注的内容完全不一样。这个知识点在调试物联网设备、门锁、蓝牙耳机类产品时非常实用。5.4 别再用眼神统计流量IO Graph、Flow Graph和协议层级最后讲一个让Wireshark从符合协议分析器变成可视化分析工具的部分。点开Statistics菜单你会发现里面藏着好几种统计视图日常排错里最常用的有三个。IO Graph是流量走势图横轴是时间纵轴是包数量或字节数可以针对特定IP或协议叠加多条曲线。我排查过一次员工反馈网络奇卡无比的案例在IO Graph上看到每隔几分钟就出现一个巨大的字节尖峰顺着时间点用显示过滤器一筛定位到一台机器在定时执行备份任务把带宽占满了。这种问题如果不看图靠人眼在几千个包里找规律能找到天亮。Flow Graph是连接时序图把会话按时间顺序排成一张图可以直观看到哪台设备先发起SYN、谁回SYN-ACK、谁最后发FIN断开。Protocol Hierarchy是协议统计树会按协议栈层级列出各协议的包数量和占比。我曾经在一份抓包文件里通过Protocol Hierarchy一眼发现ARP流量占比异常再往下排查才确认是某种扫描行为。这三个视图组合起来使用基本能覆盖流量规律分析、连接行为分析和协议分布分析三类场景真正用得好的人不会只盯着包列表看。收尾说说我自己的使用体会回头想想我带过的新人和踩过的坑最想留给大家的经验只有一句话抓包的目的一定是验证某个假设而不是漫无目的地把所有包看完。先确认你怀疑的是哪一层——是DNS层、TCP层还是应用层然后针对性过滤再用Follow Stream或统计图确认结论这个习惯比记住一百条过滤语句都实用。Wireshark的门槛不在工具本身而在于对协议分层和交互过程的理解但理解最有效的方式恰恰就是多抓、多看、多猜。最后再分享一个小技巧把常用的过滤表达式保存在过滤栏左侧的快捷按钮上下次只需点一下不用重新输入抓包前把Time列设置为相对时间排查延迟问题时会顺手很多。工具永远是越用越熟现在就抓一把试试吧。
返回列表