Wireshark安装与使用:抓包过滤器和网络协议分析实战指南 Wireshark的安装与使用这个题目看起来基础但我见过太多人卡在同一个地方软件装好了网卡选好了点了一下开始抓包满屏滚动的数据包扑面而来然后——就没有然后了。真正让Wireshark有价值的不是能抓包这个动作而是抓完之后你知不知道自己在看什么。我有一次排查线上服务响应慢的问题ping网关一切正常网页就是打不开折腾了几个小时最后打开Wireshark抓了一分钟流量发现TCP重传的包占了将近三成再顺着对端地址查下去问题立刻浮出水面。没有抓包数据这种看似正常实则异常的网络故障几乎没有第二种手段能定位。这篇文章我会把从安装到上手使用的完整流程走一遍不同平台的安装细节和权限坑第一次怎么抓到可用的包过滤器到底怎么用再用一个HTTP访问的例子把DNS、TCP握手、请求响应整条链路拆开给你看最后说说新手最容易踩的五个坑。适合刚接触网络分析的同学也适合平时做开发、运维但一直没系统用过抓包工具的从业者。1. 抓包前先想明白Wireshark到底能告诉你什么很多人把Wireshark当成一个高级版ping网络通了就觉得没必要用网络不通就抓包看有没有流量。这个思路其实浪费了它八成的能力。Wireshark真正擅长的是回答网络到底是通而不快还是时通时断还是连接建立不起来这类中间态问题。1.1 三个最典型的应用场景第一是网络排障。一个访问请求发出去迟迟没有响应到底是DNS解析耗费了几秒还是TCP三次握手没有完成还是TLS证书验证失败还是应用层没回包这些阶段的耗时在Wireshark里几乎是肉眼可见的只要过滤对应的协议时间线一拉就知道卡在哪一环。第二是协议学习。你背十遍TCP三次握手的SYN、ACK不如亲自抓一次包看一眼。HTTP的请求格式、DNS的查询结构、TLS握手的证书交换这些东西在教科书里是一堆抽象术语在Wireshark里就是展开的树形结构点开就能看到每个字段的实际值。第三是异常流量分析。设备上某段时间有大量外联请求很多是加密的看不出内容但你至少能从目标地址、端口分布、报文长度、连接频率这些元数据里判断它正不正常。1.2 装好软件之前先建立分层的直觉我刚接触Wireshark的时候看到数据包列表里那些十六进制内容完全懵圈感觉像在看一堆乱码。后来才意识到Wireshark的界面设计本身就对应了网络的分层逻辑。一个数据包从你电脑发出去是应用层的数据先被装进TCP/UDP的信封TCP信封又被装进IP的信封IP信封又被套上以太网帧的外层信封最后变成电信号或无线电波发出去。Wireshark收到一个包解析的时候是从外层信封一层层拆开展示给你看。所以你点开包详情从上往下永远是Frame物理帧、Ethernet链路层、Internet Protocol网络层、TCP/UDP传输层最后才是应用层协议内容。有了这个分层直觉你看包列表的时候就不会觉得它是一堆乱七八糟的字符串而是一套有固定套路的嵌套结构。后面讲过滤器的时候你也会发现几乎所有过滤条件都是按照哪个层、哪个字段、什么值的逻辑来写的。1.3 什么情况别急着用WiresharkWireshark不是万能工具用之前先花半分钟缩小问题范围。如果只是想确认网络通不通直接ping想确认某个端口是不是开放直接telnet或者nc想确认HTTP接口返回什么直接curl。抓包是最后一公里的定位手段它解决的问题是一切都好像正常但事实上不正常或者功能报错但客户端日志根本看不到底层细节。举个例子调用第三方API接口报超时代码层面你只能看到timeout但超时发生在TCP连接阶段还是发送请求阶段还是等待响应阶段代码根本不告诉你。Wireshark只要看一眼你的包和对端有没有完成三次握手答案就出来了。这才是它不可替代价值所在。2. 安装那点事平台差异、底层驱动和权限坑Wireshark的安装本身很简单真正翻车的往往是底层驱动和权限。很多人装完打开软件发现no devices found第一反应是软件坏了实际上大概率是驱动没装好或者权限不足。2.1 Windows下的安装流程Windows平台直接去官网下载安装包即可。安装过程中有一个关键步骤是勾选安装底层抓包驱动就是Wireshark依赖的那个驱动组件这个一定要装上否则打开之后一个网卡都列不出来。整个安装过程有几点需要注意用管理员身份运行安装包这样驱动才能正确写入系统服务否则后续打开Wireshark会提示权限不足。安装路径不要带中文老版本对中文路径支持不完善新版本好一些但没必要冒这个险。装完后最好重启一次电脑让驱动彻底加载。如果打开后在接口列表里一个网卡都看不到先重启再重新安装驱动组件。安装过程中如果系统安全软件弹窗提示驱动加载注意确认是否正常放行。Windows下还有一个高频问题打开Wireshark抓包时提示需要重启或者提示运行抓包需要管理员权限。Wireshark抓包时用户态程序要实现数据捕获底层确实需要调用系统驱动所以正常情况下需要以管理员身份运行。放心真正的生产环境里大家也都是这么用的。2.2 Mac系统下的安装与权限处理Mac平台安装Wireshark有两种常见途径直接下载dmg包拖进Applications或者用包管理器安装命令行版本再套图形界面。Mac上最容易出问题的是抓包权限。新版Mac系统对网络访问、内核扩展这类东西卡得很严Wireshark安装完成后首次运行系统会提示需要授权或者要求你手动加载抓包权限组件没有授权的话打开软件同样是一张空网卡列表或者提示you dont have permission to capture on that device。处理方法是安装包里有Wireshark自带的权限安装脚本运行一遍再重启Wireshark正常情况下就能看到接口了。如果还不行检查系统设置里的隐私与安全性确认抓包相关权限已经放行。另外Mac下如果同时装了命令行网络工具可能和Wireshark的抓包权限组件有版本冲突表现为某个网卡抓不到包卸载重装Wireshark通常会解决。2.3 Linux下安装普通用户抓包的正确姿势Linux上Wireshark一般直接用发行版自带的包管理器安装就行图形界面版本和命令行版本通常是两个包。安装过程中系统可能会问是否允许非超级用户抓包这一步建议选允许它会把抓包权限赋予一个专用用户组然后把Wireshark的抓包程序加上特殊权限位。这样设置完之后普通用户加入抓包组就能直接抓包不用每次都用sudo。为什么强调这个因为用sudo权限打开一个GUI程序本身就比较危险图形界面如果有漏洞等于把root权限暴露给了一个复杂程序。而且sudo方式打开Wireshark保存下来的抓包文件归属也是root后续处理文件很麻烦。如果你安装的时候没选允许非root用户抓包后面想补救也不是不行手动创建抓包组、把自己加进去、然后对抓包程序配置权限Linux下可用的方式有好几种。新手如果图省事临时用sudo打开抓一次也行但长期使用还是建议配置好普通用户抓包。2.4 安装完成的健康检查装完别急着学操作先做一个两步检查打开Wireshark看主界面的接口列表里有没有列出你机器的网卡一般能看到以太网和无线网卡能看到就说明驱动和权限都正常。在列表里选一个接口看旁边的实时流量波形图有没有起伏有波动说明这个网卡上真的有数据在跑。这两步正常你的安装环境就是健康的接下来可以正式进入第一次抓包。3. 第一次抓到包用ping做个最朴素的实验第一次抓包建议挑一个你完全能预测结果的场景不要直接去抓乱七八糟的上网流量。我推荐的做法是准备一个终端窗口先打开抓包然后在终端里ping你的网关地址抓完再停最后看ICMP请求和回复是怎么成对出现的。这个实验预期明确非常适合建立最初的体感。3.1 看懂启动界面的网卡列表打开Wireshark启动界面会列出你机器上所有可用的网络接口。每行左边有图表和波形波形代表该接口当前的实时流量大小接口名后面通常会跟着IP地址。选择困难的时候优先选你正在用来上网的那个接口有线网络选以太网无线网络选无线网卡拿不准就选有IP地址且波形在跳动的那个。有个概念值得说一下混杂模式。正常情况下网卡默认只接收发给自己的包混杂模式打开后网卡会接收链路上经过的所有包。Wireshark界面上每个接口都带一个启用混杂模式的复选框。在普通家用交换机环境下打开混杂模式也未必能看到别人电脑的流量因为交换机会把帧只转发给目标端口这点后面踩坑部分再详细讲。第一次实验不需要开混杂模式默认就行。3.2 完整的抓包五步操作操作路径如下双击选中你的网卡开始抓包此时工具栏会有一个红色鲨鱼鳍图标表示正在抓包。切换到终端窗口执行ping网关的命令比如ping 192.168.1.1让它跑个三五次然后按CtrlC停止。回到Wireshark点工具栏的红色方块停止抓包。看包列表能搜到ICMP协议的包请求和回复应该一一对应。保存文件格式默认是pcapng起个有意义的文件名方便后面练习用。这个实验里你会发现两个规律一是ICMP Echoping请求和ICMP Echo Replyping回复成对出现请求固定的目标地址是你刚填的网关二是每个包都带着时间戳和源目的地址信息量比终端输出的64 bytes from ...大得多。3.3 三栏界面里的信息怎么读抓包完成后Wireshark的主界面分成三个区域。顶部的包列表Packet List是核心入口每一行就是一个数据包。重点看这几列No.抓包顺序编号、Time抓包开始后的相对时间或者精确时间戳、Source和Destination源和目的地址、Protocol协议、Length包长度、Info该包的关键信息摘要。Info列是Wireshark帮你做的一句话总结比如TCP三次握手时会显示SYNSYN, ACKACK等标志非常友好。中间的包详情Packet Details展示你选中的那个包的完整分层解析。点开一个ICMP包能看到Ethernet层里的源MAC和目的MAC、IP层里的地址和TTL、ICMP层里的类型和序号。分层的意义在这一刻特别直观每个包都是一层套一层的嵌套结构。底部的包字节Packet Bytes是这个包在最底层的原始十六进制编码和ASCII字符。这一栏平时基本用不到但遇到二进制协议解析问题时它是查错的最底层证据。3.4 保存文件的好习惯抓包文件尽量用pcapng格式保存新版本默认就是这个格式它能保存更多元数据。如果是现场排障场景保存文件时建议同步记录一下抓包时间、涉及的主机地址、当时的网络现象这些信息隔几天再看文件的时候非常有价值不然过两周打开一个包文件可能完全不记得当时在查什么。4. 过滤器这件事一次把抓包过滤和显示过滤讲明白Wireshark的过滤器是它真正的灵魂但也是新手最混乱的地方因为同样的一个过滤功能它其实有两套完全不同的实现一套叫抓包过滤另一套叫显示过滤。我见过很多人在抓包过滤栏里输入ip.addr 192.168.1.1这种明显是显示过滤的表达式结果抓包一直不生效还以为是软件有问题。4.1 两道过滤器的分工完全不同抓包过滤发生在数据包被保存之前它直接决定哪些包会被记录进缓存。设置的位置是接口选择界面的绿色输入框或者抓包界面工具栏旁的输入框。它的特点是节省存储空间适合在网络流量很大、带宽很高的时候避免抓包文件暴涨。显示过滤发生在数据包已经被抓下来之后它只是把不符合条件的包隐藏起来不显示并没有删除。设置的位置是包列表上方那个白色输入框。它适合你已经把流量全量抓下来然后在海量包里一步步缩小范围看问题。两者用的语法还完全不一样。抓包过滤用的是BPF风格的语法跟tcpdump的写法是一致的显示过滤用的是Wireshark自己定义的一套字段表达式。新手只要记住抓包之前用的语法是host/port这类抓包之后用的语法是ip.addr/tcp.port这类就不会再搞混。4.2 抓包过滤的常用BPF语法抓包过滤的常见写法有这些需求表达式只看某台主机的流量host 192.168.1.1只看某个网段的流量net 192.168.1.0/24只看某个端口的流量port 80只看从某IP发出去的流量src host 192.168.1.1只看发往某IP的流量dst host 192.168.1.1组合条件host 192.168.1.1 and port 443排除条件port not 22BPF语法里的关键字有and、or、not组合使用就能构造出很多精细的抓包范围。比如你只想抓某个内网设备访问外网某台服务器的DNS查询可以写host 内网地址 and port 53。注意抓包过滤里没有ip.addr这种点分字段写法它只有host、net、port这些简化关键字。4.3 显示过滤的常用表达式显示过滤是抓包之后的主力工具。几个高频表达式记熟基本就能覆盖绝大多数查包场景需求表达式只看某个IP相关流量ip.addr 192.168.1.1只看源地址为某IPip.src 192.168.1.1只看目的地址为某IPip.dst 192.168.1.1只看TCP端口tcp.port 80只看HTTPhttp只看HTTP请求http.request只看DNSdns只看TCP的SYN包tcp.flags.syn 1只看重传包tcp.analysis.retransmission只看某种MAC地址的流量eth.addr 00:11:22:33:44:55显示过滤的语法核心就是协议.字段支持、!、、也可以组合and、or、not。比如http and ip.addr 192.168.1.5就是只看那台主机的HTTP流量。显示过滤框是实时生效的输入语法不对的话过滤框背景会变红语法正确会变绿。这个红绿提示特别实用我一般看到红色就知道自己字段名拼错了。4.4 右键和跟随流两个大幅提升效率的操作除了手敲表达式Wireshark有两个操作对新手上手特别有帮助。第一个是右键过滤。在包列表里随便点一个IP地址、端口号、协议名右键菜单里会有Apply as Filter作为过滤器应用选项选Selected就是只保留这个值选Not Selected就是排除这个值。在不熟悉字段名的情况下右键生成过滤器比自己记表达式快得多。第二个是Follow TCP Stream追踪TCP流。这个功能能把一次TCP连接中所有来往的数据拼接成完整视图。举个例子你抓到一个HTTP响应想看对应的完整请求和响应体直接在包上右键选择Follow再选TCP StreamWireshark会弹出一个窗口把整个过程按时间顺序排好。这个功能是分析应用层协议最有力的武器没有之一。4.5 我的实用抓包策略实际排障时我的习惯是抓包的时候少过滤显示的时候多过滤。原因很简单抓包过滤一旦开大了漏掉的数据包就永久丢了想回头再查都没机会。磁盘便宜抓包文件大了可以拆可以删但信息丢了是补不回来的。只有在抓高流量接口或者长时间抓包这种存储压力大的场景下才建议在抓包阶段就做过滤。5. 拆一个完整的HTTP访问过程DNS、TCP握手、请求与响应前面讲了一堆工具概念现在用一次真实的浏览器访问来串一下。这个案例做完你不仅会抓包还能把一次网络请求从开始到结束的完整生命周期讲清楚。5.1 搭建一个干净的抓包场景为了保证实验干扰最小做法是先打开Wireshark开始抓包然后打开浏览器的无痕窗口避免缓存和插件产生额外流量在地址栏输入一个普通的HTTP网站地址并回车等页面加载完成后关闭页面回到Wireshark停止抓包。这一步你会抓到几十甚至几百个包别慌这正是练习过滤器的时机。5.2 第一步看DNS解析在显示过滤栏输入dns包列表就只剩下DNS查询和DNS响应。你会看到两条相邻的记录一条是浏览器发出的DNS查询Info列显示的是Standard query ... A 某个域名紧接着一条是DNS响应Info列显示解析出来的IPv4地址。这个环节能看到三个知识点DNS默认走UDP的53端口包详情里能看到UDP层。查询消息里Queries区域写着完整域名响应消息的Answers区域写着解析结果。如果响应没有Answers说明解析失败页面打不开可能就是卡在这里。DNS解析耗时可以从两包的Time列差值里算出来正常来说几十毫秒到几百毫秒都算正常如果出现多次重试说明DNS服务器响应慢。5.3 第二步看TCP三次握手清除过滤器输入tcp.flags.syn 1应该能看到第一个包是SYN包源地址是你的电脑目的地址是网站服务器的IPInfo列显示SYN。再把过滤器改成tcp.flags.syn 1 or tcp.flags.syn 1 and tcp.flags.ack 1 or tcp.flags.ack 1 and tcp.flags.syn 0太复杂了。更简单的做法是直接过滤tcp.stream eq 某个数字或者用一种更直白的方式——从包列表里往下翻找到TCP协议且Info列写着SYN的包然后右键Follow该TCP流。你会看到三次握手的完整画面客户端发SYN包seq0。服务器回SYN,ACK包seq0, ack1。客户端再回ACK包seq1, ack1。握手完成后通信双方共同确认了初始序列号和窗口大小接下来才是真正的数据交换。TCP的可靠传输机制在这一步体现得清清楚楚连接建立必须经过双方的明确确认任何一步丢了连接就建立不起来。5.4 第三步看HTTP请求与响应显示过滤改成http包列表会展示这次访问的所有HTTP请求和响应。对于一个普通网页你可能看到好几条HTTP记录因为页面本身、样式表、脚本、图片各自都是一次独立的请求-响应。点开第一条GET请求的包详情能看到请求行GET / HTTP/1.1说明访问的是根路径用的协议版本是HTTP/1.1。请求头Host、User-Agent、Accept等字段都是明文可读的。HTTP层的完整结构请求头之下还有请求体如果是POST请求才会有内容。再点开对应的HTTP响应包能看到状态行HTTP/1.1 200 OK、响应头里的Content-Type和Content-Length。一个请求对应一个响应这个一对一的对应关系非常清晰。有一点容易迷惑新手浏览器发起的访问目标明明是一个网址但是TCP连接的服务器地址是DNS解析出来的IP。实际上HTTP请求头里的Host字段才是真正的域名信息。现在很多网站采用CDN和虚拟主机同一个IP上挂了很多域名服务器就是靠Host字段区分你到底想访问哪家的站点。5.5 第五步看整个时间线清掉所有过滤器把包列表的Time列切换到相对时间显示在列头右键可以设置这样每一行的Time就是相对抓包开始的时间差。按时间线走一遍你能看到一个网站的加载过程是这样的DNS解析约0.01秒左右结束。TCP三次握手在DNS响应之后紧跟着整个过程也就是几十毫秒。客户端发送HTTP GET请求。服务器返回HTTP响应然后是TCP ACK确认。浏览器解析HTML发现需要加载其他资源又发起新的DNS查询和TCP连接重复上面的过程。如果访问的是HTTPS网站你还会在TCP握手之后、HTTP请求之前看到TLS握手的包。这些包在Info列显示的是Client Hello、Server Hello等字样表示双方在协商加密参数。等TLS握手完成后面的HTTP内容就是加密的显示过滤器如果只写http就看不到了需要过滤tls来观察TLS层的握手过程。5.6 用Statistics菜单看宏观视图单个包拆完还可以看个整体统计菜单里打开Protocol Hierarchy协议分层统计能看到各种协议在抓包文件里占了多少比例、多少包数。打开Endpoints端点能看到通信双方的IP、MAC地址和流量总量。这些统计视图能帮你快速确认这次抓包里最主要的通信是什么在排查异常流量的时候特别好用可以一眼看到是不是有某些不知名IP产生了大量连接。6. 新手抓包最常踩的五个坑我替你趟过了安装部分讲过一些坑这里讲的是真正开始用Wireshark之后才会遇到的五个高频问题每一个都值得收藏。6.1 只能看到自己的包看不到别人的连接的是企业交换机或者家里普通路由器的话在网关上开混杂模式往往还是一点别人的流量都抓不到原因在于交换机会根据MAC地址表把数据帧只转发到对应端口不会广播给所有端口。如果你真的需要分析另一个设备的流量有几种办法在网关交换机上配置端口镜像把目标端口流量复制过来或者在物理链路上串接一个分光器或者干脆在目标设备上自己装Wireshark抓包。对于纯学习场景这点不用太纠结抓自己电脑上的流量已经能覆盖大多数协议分析需求了。6.2 抓到一堆加密数据好像白抓了现在大部分网站都上了HTTPS抓下来包列表全是TLS协议Info列基本都是Application Data点开详情也是一堆密文。这不是Wireshark坏了是加密流量的正常表现。这恰恰说明TLS在工作数据在传输过程中是不可读的。对这种流量能做的基础分析有看TLS握手中的证书信息、看Client Hello里携带的服务器名称SNI、看连接建立的耗时、看传输的流量大小和频率。如果你想进一步看到明文内容得在客户端程序或浏览器层面对自己的访问流量做调试密钥导出然后到Wireshark的TLS设置里加载就能把会话解密回明文。注意这个方法只适用于分析你本人有权限调试的流量不要去尝试解密别人的通信数据这与工具用途的界限有关。6.3 抓包文件暴涨磁盘空间告急抓千兆网卡不做任何过滤地抓上一小时文件大小很容易上几十GB。日常建议用多文件环形缓冲模式设置里把输出格式改成分文件指定文件大小例如50MB或者100MB再指定保留多少个文件比如20个这样Wireshark会滚动循环写文件既能持续抓包又不至于把磁盘撑满。如果抓包过程中磁盘真的满了Wireshark的行为通常是停止抓包并提示错误不会悄无声意地丢掉数据但你的整流量的连续性已经被打断了。所以长途抓包之前一定要预估好积攒速度和磁盘剩余空间。6.4 现象在现场抓到的包里却什么都没有这种抓不到异常的原因很多时候不是网络没毛病而是你的抓包工具自己丢了包。包列表下方状态栏如果出现X packages dropped的提示说明在抓包过程中有数据包因为来不及被处理被丢弃了抓到的数据已经是不完整快照。造成丢包的原因通常是接口流量超过处理能力、抓包过滤条件过于复杂、蓝牙或无线网卡处于省电模式、虚拟网卡叠加导致监听位置不对。处理方法是可以尝试缩小过滤表达式、关闭不必要的高频刷新视图或者换到一台性能更强的机器上抓包。另外不要忘了看抓包文件属性里的统计信息文件属性页会显示捕获时间、包数、平均包速率、丢包数这些数据对判断抓包质量很重要。6.5 误把Wireshark当黑客工具操作越界最后这点算是个提醒。Wireshark本身是合法的网络分析工具用在自己有权管理的设备和流量上是完全正常的运维和开发行为。但不要用它去做任何越界的事情比如在公共网络里监控别人的通信内容、尝试分析他人加密流量。这类行为既违反道德也普遍触犯相关法律法规。老老实实抓自己的流量、抓实验室里允许抓的流量、抓故障现场授权的流量才是这个工具的正确打开方式。最后分享一个我自己坚持的习惯如果你看完上面这些还是不知道从哪里练起我的建议是别去网上找什么现成的数据包练习直接抓一次自己一天的日常流量。下班前打开Wireshark抓个十分钟看看这段时间里你的电脑到底在跟哪些服务器通信、都用什么协议、最大的流量给谁了。这十分钟的数据包会让你意识到自己的设备远比想象的更活跃也是理解网络协议最好的入门素材。用Wireshark的核心其实只有三件事选对网卡、抓对时机、用对过滤器。装好软件之后别急着研究那些高级功能先用我前面写的ping实验和HTTP案例把这三个动作练熟。等你发现自己能不看教程单靠过滤器和跟随流就能把一次访问故障定位到具体阶段的时候你就已经真正上手这个工具了。