ARTICLE DETAIL

资讯详情

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

Wireshark过滤器实战:5个核心过滤器搞定80%网络排障

Wireshark过滤器实战:5个核心过滤器搞定80%网络排障 1. 为什么是过滤器而不是“抓了再说”刚接触 Wireshark 的人十有八九会犯同一个错误打开软件选好网卡点一下那个蓝色的鲨鱼鳍按钮然后眼睁睁看着屏幕上滚过成千上万行数据包密密麻麻的十六进制和协议名让人头皮发麻。抓了五分钟文件几百兆想找的那个问题却像大海捞针。这不是工具的问题是方法的问题。Wireshark 真正的杀伤力不在于“抓”而在于“筛”。抓包只是把网卡上的原始流量原封不动地搬进内存和磁盘而过滤器才是把噪声变成信号的那把筛子。我做了这么多年排障可以很负责任地说80% 的日常网络问题用 5 个过滤器就能定位到根因剩下的 20% 才需要深入分析 TCP 流、重传、窗口缩放这些细节。这篇文章面向的是刚上手 Wireshark 的运维、开发、测试以及需要排查线上问题的后端工程师。你不需要背下几百个过滤语法只需要掌握最核心的 5 类过滤器配合正确的抓包姿势就能覆盖绝大多数排障场景。我会把每个过滤器的使用逻辑、参数含义、踩坑经验都讲透让你看完就能直接上手抄作业。先说一个最容易被忽略的前提过滤器分两种别搞混了。一种是“捕获过滤器”Capture Filter在抓包之前设置决定哪些包进入内存另一种是“显示过滤器”Display Filter在抓包之后设置决定哪些包显示在屏幕上。很多人第一次用的时候在显示过滤器栏里输入了捕获过滤器的语法结果报红然后一脸懵。记住一个简单的区分方法捕获过滤器用的是 BPF 语法跟 tcpdump 一样显示过滤器用的是 Wireshark 自己的语法两者长得像但不一样。提示新手建议先用“抓全部 显示过滤器”的方式因为捕获过滤器一旦设错包没抓到就得重来。显示过滤器可以反复调整容错率高得多。2. 抓包前的三个关键准备动作2.1 选对网卡别在错误的接口上浪费时间打开 Wireshark 第一件事就是选网卡。很多人看到列表里一堆接口就随便选一个结果抓了半天一个包都没有。这里有个经验看接口后面的实时流量波形图有波动的才是当前活跃的网卡。如果你抓的是本机某个服务的流量通常选回环接口LoopbackWindows 上叫 Npcap Loopback AdapterLinux 上是 lo。如果你抓的是局域网其他设备的流量那需要做端口镜像或者用集线器普通交换机上直接抓是抓不到别人流量的这一点必须清楚。还有一个常见坑虚拟机环境。如果你在虚拟机里抓包要确认虚拟网卡是桥接模式还是 NAT 模式。桥接模式下虚拟机和物理机在同一网段抓包能看到真实流量NAT 模式下流量经过地址转换抓到的源 IP 可能是虚拟网卡的地址分析时要注意区分。2.2 设置捕获缓冲区避免大流量丢包默认情况下Wireshark 的捕获缓冲区是 2MB。在高流量场景下这个值太小会导致内核缓冲区溢出出现丢包。你可以在“捕获选项”里把缓冲区调到 64MB 甚至更大。另外如果只是临时排障建议勾选“使用多个文件”并设置文件大小上限比如每个文件 100MB这样抓久了不会把内存撑爆也方便后续分段分析。2.3 关闭无关的混杂模式混杂模式Promiscuous Mode会让网卡接收所有经过它的数据包包括不是发给本机的。在交换网络里这个模式其实抓不到别人的单播流量反而会增加噪声。除非你明确知道自己在做什么否则建议关闭。我见过有人开着混杂模式抓了一堆无关的广播包然后抱怨过滤器不好用——问题不在过滤器在源头。3. 过滤器一ip.addr —— 锁定一台主机3.1 基本用法与逻辑ip.addr是最常用的过滤器没有之一。它的作用是匹配源 IP 或目的 IP 等于指定地址的所有数据包。语法很简单ip.addr 192.168.1.100这一条就能把跟这台主机相关的所有流量筛出来不管它是发起方还是接收方。如果你只想看某个方向可以用ip.src或ip.dstip.src 192.168.1.100 ip.dst 192.168.1.100实际排障中我通常先用ip.addr把范围缩小到一台机器然后再叠加其他条件。比如用户反馈“访问某个服务很慢”我先用ip.addr 用户IP看看这台机器到底在跟谁通信有没有异常的连接。3.2 网段匹配与排除ip.addr支持 CIDR 格式可以匹配整个网段ip.addr 192.168.1.0/24这个在排查“某个网段访问异常”时特别有用。反过来如果你想排除某台主机用!ip.addr ! 192.168.1.100但要注意!在 Wireshark 里的行为可能跟直觉不同。ip.addr ! 192.168.1.100的意思是“源和目的都不等于这个地址”而不是“源或目的不等于”。如果你只想排除源地址应该写ip.src ! 192.168.1.100。3.3 实操心得先定位再细化我个人的习惯是拿到问题先问清楚“哪台机器、访问哪个服务、什么现象”。然后第一步就是用ip.addr把问题主机的流量单独拎出来。这一步能过滤掉 90% 以上的无关包。接下来再根据协议、端口、时间等条件逐步缩小。很多人一上来就想写一个复杂的组合过滤器结果语法出错或者逻辑不对反而浪费时间。先用最简单的条件把范围框住再逐步叠加这是最高效的路径。注意如果问题主机有多个 IP比如同时有线和无线记得把每个 IP 都试一遍或者用ip.addr A or ip.addr B组合。4. 过滤器二tcp.port —— 锁定一个服务4.1 端口过滤的核心逻辑锁定主机之后下一步通常是锁定服务。tcp.port匹配源端口或目的端口等于指定值的 TCP 包tcp.port 8080这一条能筛出所有跟 8080 端口相关的流量。同样有方向性的变体tcp.srcport 8080 tcp.dstport 8080这里有个细节值得说清楚服务端的端口通常是固定的客户端的端口是随机的。所以当你排查“某个服务响应慢”时用tcp.port 服务端口就够了不用关心客户端用的是哪个随机端口。但如果你想看某个客户端发起的连接用tcp.srcport 客户端端口更精确。4.2 端口范围与多端口Wireshark 支持端口范围tcp.port 8000 and tcp.port 9000也支持多端口组合tcp.port 80 or tcp.port 443 or tcp.port 8080实际工作中我经常用tcp.port配合ip.addr一起用。比如ip.addr 192.168.1.100 and tcp.port 3306这一条就能看到这台机器跟 MySQL 的所有交互。如果数据库连接池有问题或者某个查询特别慢这个过滤器能帮你快速定位到具体的 TCP 流。4.3 UDP 场景怎么办tcp.port只管 TCP。如果是 UDP 服务比如 DNS、SNMP、某些游戏协议要用udp.portudp.port 53如果你不确定是 TCP 还是 UDP可以用port这个通用写法port 53但要注意port会同时匹配 TCP 和 UDP有时候会引入额外噪声。我一般明确知道协议时就用tcp.port或udp.port不确定时才用port。4.4 实操心得端口过滤的常见误区有个坑我踩过好几次有些服务会动态协商端口。比如 FTP 的数据连接、某些 RPC 服务控制连接是一个端口数据传输是另一个随机端口。这时候光过滤控制端口是不够的需要用“追踪 TCP 流”功能让 Wireshark 自动关联相关连接。具体操作是右键某个包选择“追踪 TCP 流”Wireshark 会把整条会话的所有包都展示出来不管端口是否相同。另一个误区是把端口号和协议名搞混。比如 HTTP 默认是 80但很多服务跑在 8080、8000、3000 等端口上。不要假设“80 端口就是 HTTP”也不要用http过滤器去抓非标准端口的 HTTP 流量——http过滤器只认协议解析结果不认端口号。如果服务跑在 8080 上但没被识别为 HTTP你需要手动“解码为”HTTP或者直接用tcp.port 8080来看原始 TCP 流。5. 过滤器三http —— 看穿 Web 请求5.1 HTTP 过滤器的威力http这个过滤器会匹配所有被 Wireshark 识别为 HTTP 协议的包。它的价值在于你不需要关心端口号只要协议解析正确就能直接看到请求和响应http这一条会筛出所有 HTTP 请求和响应。但实际排障时我们通常需要更精确的条件。比如只看请求方法http.request.method GET http.request.method POST只看某个状态码http.response.code 404 http.response.code 500只看某个 URLhttp.request.uri contains api/user这些组合起来能快速定位到具体的接口问题。5.2 请求头与响应头过滤HTTP 过滤器还支持按头部字段筛选http.host api.example.com http.user_agent contains Chrome http.content_type contains json排查接口问题时我经常用http.host来区分同一台服务器上的不同虚拟主机用http.content_type来确认返回的数据格式是否符合预期。比如前端反馈“接口返回的不是 JSON”用这个过滤器一看就知道服务端到底返回了什么类型。5.3 实操心得HTTPS 怎么办这是最多人问的问题HTTPS 流量能过滤吗答案是默认不能。HTTPS 是加密的Wireshark 只能看到 TCP 层看不到 HTTP 层。要解密 HTTPS需要配置 SSLKEYLOGFILE 环境变量让浏览器把会话密钥写到一个文件里然后在 Wireshark 的 SSL 协议设置里指定这个文件。这个操作有一定门槛而且只对你自己发起的流量有效抓别人的 HTTPS 流量是解不了的。所以实际排障中如果目标是 HTTPS 服务我通常先用tcp.port 443看 TCP 层的连接建立、重传、延迟情况。如果 TCP 层没问题再考虑是否需要解密应用层。很多时候问题出在 TCP 层比如握手慢、重传多根本不需要看到 HTTP 内容。提示如果你在排查自己的 Web 应用可以在开发环境临时用 HTTP或者配置 SSLKEYLOGFILE 来解密。生产环境的 HTTPS 流量除非你有服务端私钥否则不要指望在 Wireshark 里看到明文。5.4 HTTP/2 与 HTTP/3 的注意事项现在越来越多的服务用 HTTP/2 甚至 HTTP/3。Wireshark 对 HTTP/2 的支持比较好能解析出头部和流信息但过滤器语法略有不同比如http2.headers.path。HTTP/3 基于 QUIC走 UDP过滤器要用quic相关字段。如果你发现http过滤器抓不到东西先确认一下协议版本别在错误的过滤器上死磕。6. 过滤器四tcp.analysis.flags —— 发现传输层异常6.1 这个过滤器解决什么问题前面三个过滤器解决的是“找到谁、找到哪个服务、找到哪个请求”。但很多时候问题不在应用层而在传输层。比如用户说“网页打开慢”你看了 HTTP 请求和响应都正常那问题可能出在 TCP 重传、乱序、零窗口这些地方。tcp.analysis.flags就是用来发现这些异常的。这个过滤器会匹配所有带有分析标记的 TCP 包包括重传retransmission、重复 ACKduplicate ACK、零窗口zero window、乱序out-of-order等。最简单的用法tcp.analysis.flags这一条会把所有异常包筛出来。如果结果很多说明网络质量确实有问题。6.2 细分异常类型更精确的用法是按具体异常类型过滤tcp.analysis.retransmission tcp.analysis.duplicate_ack tcp.analysis.zero_window tcp.analysis.out_of_order重传是最常见的异常。少量重传是正常的网络抖动导致但如果重传率超过 1%就会明显影响体验。重复 ACK通常意味着有包丢失接收方在催发送方重传。零窗口说明接收方缓冲区满了发送方被迫暂停这通常是接收端处理不过来。乱序说明包到达顺序跟发送顺序不一致可能是多路径路由导致的。6.3 实操心得结合 TCP 流分析单独看一个异常包意义不大必须结合整条 TCP 流来看。我的做法是先用tcp.analysis.flags找到异常包然后右键选择“追踪 TCP 流”在完整的会话上下文中判断这个异常是偶发还是持续。如果只是偶尔一两个重传可以忽略如果持续出现重传或零窗口那就是真问题。还有一个技巧用tcp.time_delta来看包之间的时间间隔。如果某个 ACK 隔了很久才回来说明网络延迟高或者对端处理慢。配合tcp.analysis一起看能快速判断是网络问题还是应用问题。注意tcp.analysis.flags依赖 Wireshark 的 TCP 分析功能如果抓包不完整比如只抓了单向流量分析结果可能不准。尽量在两端都抓包或者至少在关键路径上抓全。6.4 常见异常与可能原因对照异常类型过滤器写法可能原因重传tcp.analysis.retransmission网络丢包、链路拥塞、网卡故障重复 ACKtcp.analysis.duplicate_ack接收方收到乱序包触发快速重传零窗口tcp.analysis.zero_window接收方应用读取慢缓冲区满乱序tcp.analysis.out_of_order多路径路由、负载均衡导致快速重传tcp.analysis.fast_retransmission收到 3 个重复 ACK 后触发这张表我建议存下来排障时对照着看能省不少时间。7. 过滤器五frame.time —— 按时间窗口切片7.1 为什么需要时间过滤前面四个过滤器解决的是“谁、哪个服务、哪个请求、什么异常”。但还有一个维度经常被忽略时间。很多时候问题只在特定时间段出现比如“每天上午 10 点接口变慢”“昨晚 3 点开始丢包”。这时候你需要把抓包文件按时间窗口切片只看问题时段的数据。frame.time过滤器支持绝对时间和相对时间。绝对时间格式frame.time 2024-01-15 10:00:00 and frame.time 2024-01-15 10:05:00相对时间相对于抓包开始的时间frame.time_relative 10 and frame.time_relative 207.2 时区问题与北京时间设置Wireshark 默认显示的是 UTC 时间这对国内用户很不友好。你可以在“视图”菜单里选择“时间显示格式”改成“日期和时间”然后在“首选项”里设置时区为 Asia/Shanghai。这样抓包时间就跟你的本地时间一致了排查时不用再做心算。还有一个细节如果你抓的是长时间流量文件很大用frame.time过滤后可能只剩几百个包分析起来轻松很多。我经常用这个方法来“回放”故障时刻的流量就像看监控录像一样。7.3 实操心得结合标记与注释Wireshark 支持给包打标记Mark和加注释Comment。在抓包过程中如果发现某个时刻有异常可以随手打个标记然后事后用frame.marked 1快速定位。这个习惯能帮你节省大量翻找的时间。另外导出特定时间段的包时可以用“导出特定分组”功能只保存过滤后的结果文件小、传输快。提示如果抓包文件跨天记得确认时区设置是否正确。我见过有人因为时区差 8 小时把凌晨的故障定位到了前一天下午白白绕了一大圈。8. 五个过滤器的组合实战8.1 场景一用户反馈“接口偶尔超时”第一步用ip.addr 用户IP and tcp.port 服务端口锁定范围。第二步用http.response.code 500看有没有服务端错误。如果没有第三步用tcp.analysis.flags看有没有重传或零窗口。如果发现重传第四步用frame.time定位到具体时间点看看那个时间段网络是否有波动。这一套组合拳下来基本能定位到是网络问题、服务端问题还是客户端问题。8.2 场景二数据库连接池耗尽用ip.addr 应用服务器IP and tcp.port 3306筛出所有数据库流量。然后看 TCP 连接的建立和关闭频率。如果发现大量连接建立后长时间不关闭或者频繁重连说明连接池配置有问题。配合tcp.analysis.zero_window还能看出是不是数据库端处理太慢导致连接堆积。8.3 场景三某个 API 返回数据异常用http.request.uri contains api/xxx筛出目标接口。然后看请求和响应的完整内容。如果响应体很大可以用“追踪 TCP 流”看完整的传输过程。如果发现响应被分成了很多小包可能是 MTU 或 TCP 窗口的问题。如果响应内容本身不对那就是应用层的问题需要结合服务端日志一起看。8.4 组合过滤器的书写规范组合过滤器时注意逻辑运算符的优先级。and的优先级高于or所以ip.addr A and tcp.port 80 or tcp.port 443实际含义是(ip.addr A and tcp.port 80) or tcp.port 443而不是ip.addr A and (tcp.port 80 or tcp.port 443)。要表达后者必须加括号ip.addr A and (tcp.port 80 or tcp.port 443)这个细节很多人不注意导致过滤结果跟预期不符。我建议写组合过滤器时只要涉及or就加括号别省那几个字符。9. 常见问题与排查技巧实录9.1 过滤器报红怎么办最常见的原因是语法错误。Wireshark 的显示过滤器栏在语法错误时会变红鼠标悬停能看到具体错误信息。常见的语法问题包括用了而不是Wireshark 里比较用赋值用是捕获过滤器的写法字符串没加引号字段名拼写错误。遇到报红先看提示再对照官方文档的字段名。9.2 抓不到包怎么办先确认网卡选对了再看有没有设置捕获过滤器把包过滤掉了。如果抓的是本机回环流量确认选的是 Loopback 接口。如果是无线网卡确认是否支持监控模式。如果是虚拟机确认网络模式。还有一个容易忽略的点有些系统需要管理员权限才能抓包普通用户运行 Wireshark 可能看不到任何接口。9.3 时间显示不对前面提过默认是 UTC。改时区在“编辑 首选项 外观 时间”里设置。如果只想临时改可以在“视图 时间显示格式”里切换。另外如果抓包文件是从其他时区的机器上导出的显示时间可能跟你的本地时间不一致分析时要注意。9.4 大文件分析卡顿抓包文件超过几百兆后Wireshark 的界面会明显卡顿。解决办法有几个一是用tshark命令行工具先做初步过滤把结果导出成小文件再用 Wireshark 打开二是用捕获过滤器在抓包阶段就限制范围三是关闭“实时滚动”和“自动滚动”减少界面刷新开销。我处理大文件时通常先用tshark -r big.pcap -Y 过滤条件 -w small.pcap把目标流量提取出来再用 Wireshark 精细分析。9.5 常见问题速查表问题现象可能原因排查方法过滤器报红语法错误检查、引号、字段名抓不到任何包网卡选错/权限不足换网卡、用管理员运行抓到的包不完整缓冲区太小/丢包增大缓冲区、检查丢包统计HTTPS 看不到内容加密配置 SSLKEYLOGFILE 或看 TCP 层时间不对时区设置改为 Asia/Shanghai大文件卡顿内存不足用 tshark 预过滤10. 几个我踩过的坑和私藏技巧第一个坑在显示过滤器里用了捕获过滤器的语法。比如host 192.168.1.1是捕获过滤器语法在显示过滤器里应该写ip.addr 192.168.1.1。这两个语法体系不一样混用必报错。第二个坑忽略了 TCP 流的方向性。tcp.port 80会同时匹配客户端到服务端和服务端到客户端的包。如果你只想看请求用tcp.dstport 80只想看响应用tcp.srcport 80。这个细节在分析请求响应时间差时特别重要。第三个坑抓包时没开时间戳精度。默认时间戳精度是微秒对于高速网络可能不够。可以在捕获选项里把精度调到纳秒。不过纳秒精度会增加文件大小按需选择。私藏技巧一用contains做模糊匹配。比如http.request.uri contains login能匹配所有包含 login 的 URL比精确匹配灵活得多。matches支持正则表达式更强大但更慢大文件慎用。私藏技巧二用frame contains搜索原始字节。有时候协议没被正确解析或者你想找某个特定的字符串可以用frame contains keyword在原始数据里搜索。这个在排查自定义协议时特别好用。私藏技巧三保存常用过滤器为按钮。Wireshark 允许把常用的显示过滤器保存成快捷按钮点一下就能应用。我把tcp.analysis.flags、http.response.code 500、tcp.port 3306这几个存成了按钮排障时一键切换效率提升明显。私藏技巧四用tshark做批量分析。如果你有一堆抓包文件要处理或者想把过滤结果导出成 CSVtshark比图形界面高效得多。比如tshark -r input.pcap -Y http.response.code 500 -T fields -e frame.time -e ip.src -e http.request.uri能直接导出一个错误请求的清单方便后续统计。最后说一个心态上的体会过滤器是手段不是目的。我见过有人花大量时间研究过滤语法却忘了自己到底要解决什么问题。正确的做法是先明确问题现象和假设再用最少的过滤器去验证假设。五个过滤器够用不是因为它们万能而是因为它们覆盖了“谁、哪个服务、哪个请求、什么异常、什么时间”这五个最基本的排障维度。把这五个维度想清楚比背一百个过滤器语法都有用。
返回列表