
做网络排障或者调试接口的时候最容易遇到的情况就是包抓了一大堆关键流量却淹没在海量广播、TCP重传和乱七八糟的连接里。Wireshark 抓包过滤命令就是把“大海捞针”变成“按图索骥”的第一步。作为实用篇的第二篇这篇文章专门讲 Wireshark 抓包过程中最常用的一批过滤命令从抓包过滤器和显示过滤器怎么选到具体表达式怎么写再到几个能直接上手的排查案例一次讲透。适合刚把 Wireshark 装好、准备开始第一次正经排障的新手也适合已经会抓包、但在过滤输入框里总被语法折磨的同事。放心我讲这些内容时不会念文档而是把平时真正会用到的场景和踩过的坑一起说给你听。1. 先搞懂两个过滤器抓包过滤器与显示过滤器很多人一上来就卡在“过滤命令”这四个字上其实 Wireshark 里有两套完全不同的过滤方式一个是抓包过滤器一个是显示过滤器。它们的名字听着像作用时机、语法规则和使用场景完全是两码事。1.1 抓包过滤器在源头砍掉不想要的包抓包过滤器英文叫 Capture Filter是在数据包进入 Wireshark 之前就已经生效的过滤器。它工作在底层驱动层由 Npcap/WinPcap 或 libpcap 在抓包时就完成过滤符合条件的数据包才会被送入 Wireshark 界面。在 Wireshark 主界面点击启动页面或菜单里的“捕获选项”都能找到“捕获过滤器”输入框也可以直接在“捕获”菜单下选择“捕获过滤器”批量管理预设项。它的语法基于伯克利包过滤语法也就是常说的 BPFBerkeley Packet Filter。写起来很精简比如host 192.168.1.10就表示只抓与 192.168.1.10 通信的流量port 80表示只抓源端口或目的端口为 80 的包tcp port 443表示把协议、端口一起限定为 TCP 443。这类过滤器最大的优势是效率高、开销小因为过滤动作发生在上层分析之前大量没用的包压根不会进入 Wireshark 的内存抓包文件体积也会小很多。不过代价也很明显抓包过滤器只能基于 IP、端口、协议类型这类底层字段做判断没法识别 HTTP 请求里 URI 是什么、DNS 查了哪个域名更不能根据“某个字段包含某个字符串”来过滤。而且过滤条件一旦在抓包阶段收得太紧丢掉的数据包就真的丢了后面想恢复也恢复不了。所以我在实际工作中只有当流量非常大、磁盘空间紧张、或者明确只需要某一个端口的数据时才会用抓包过滤器来限制采集范围。1.2 显示过滤器在已经抓到的包里做检索显示过滤器英文叫 Display Filter作用时机则完全反了过来。它作用于已经抓取到的数据包集合也就是你眼前的这个抓包文件它不会删除包里任何原始内容只是帮你“隐藏”不符合条件的包让你在界面上只看到关心的那部分数据。因为所有包其实都还在所以你随时可以切换或清除过滤器重新看回完整的流量记录。显示过滤器的语法和 BPF 完全不一样它是 Wireshark 自己设计的一套更丰富的过滤语言能够深入到协议字段层面。举几个最常用的例子在显示过滤器输入框里输入http立即只剩 HTTP 相关流量输入tcp.port 443可以看到所有 TCP 源端口或目的端口为 443 的包输入ip.src 192.168.1.10 dns表示只看源 IP 为 192.168.1.10 的 DNS 包。它还能过滤到协议内部的细节字段比如http.request.method GET可以直接筛选出 GET 请求tcp.flags.syn 1可以筛出 TCP 握手阶段的 SYN 包这些能力是抓包过滤器完全给不了的。显示过滤器有一个很人性的提示机制输入框里文字变红说明语法写错了变绿说明语法正确可以点右侧的蓝色小箭头或直接按回车生效。但要注意绿色只代表语法没毛病不代表一定能筛出数据。比如tcp.portt 80这种拼写错误的字段名如果不是标准字段Wireshark 会给红色但如果你写了一个语法正确、实际却不存在于当前抓包文件中的条件它也会是绿色只是结果显示为空。1.3 为什么很多新手把两者混为一谈我以前带过几个新人最常见的操作就是把显示过滤器语法写进抓包过滤器里结果提示语法错误或者反过来在显示过滤器里写host 192.168.1.1结果什么都不显示。原因就在于两套语法天然不同不能互通。这里我直接用表格对照一下看起来最直观对比项抓包过滤器Capture Filter显示过滤器Display Filter作用时机抓包开始前数据进入 Wireshark 之前抓包完成后或抓包过程中作用于已捕获的数据底层语法BPFlibpcap 语法Wireshark 自研显示过滤器语法典型写法host 192.168.1.1、tcp port 80ip.addr 192.168.1.1、tcp.port 80过滤能力只能基于头部字段IP、端口、协议、MAC等可过滤任意协议字段甚至应用层内容数据影响未匹配的数据不会被捕获属于物理丢弃只是隐藏显示原始数据依然存在典型用途流量大、磁盘有限时控制抓包范围日常分析、定位问题时的首选工具记住一句话日常做分析优先用显示过滤器只有你想让 Wireshark 少抓点包时才考虑抓包过滤器。2. 显示过滤器才是日常主力常用表达式与组合技巧显示过滤器是 Wireshark 里使用频率最高的功能。你不需要把所有协议字段背下来只要掌握几个基础用法和组合方式就能应对绝大部分排障场景。2.1 按协议过滤一句话筛出指定流量最简单的过滤方式就是直接输入协议名。输入http过滤出所有 HTTP 流量输入dns过滤出 DNS 流量输入tcp、udp、icmp、arp也是一样的逻辑。Wireshark 会把这个协议名翻译成“当前抓包中包含该协议的所有包”这看起来很简单但实际上非常实用。协议过滤还可以继续细分。比如 HTTP 流量里我只想看到请求可以写http.request只想看响应可以写http.response。看 TCP 三次握手时写tcp.flags.syn 1能筛出所有 SYN 包如果还想区分握手里的第一个 SYN 和带确认的 SYN-ACK可以组合其他条件比如tcp.flags.syn 1 tcp.flags.ack 0表示纯 SYN握手第一次tcp.flags.syn 1 tcp.flags.ack 1表示 SYN-ACK握手第二次。DNS 也可以区分请求和响应dns.flags.response 0表示 DNS 请求dns.flags.response 1表示 DNS 响应。2.2 按地址和端口过滤抓取指定主机和服务的通信地址过滤是排查问题时最常用的场景。假设我现在怀疑服务器 192.168.1.20 上的 8080 端口服务有问题最简单的方式是输入ip.addr 192.168.1.20 tcp.port 8080。这里的ip.addr比较特别它表示源 IP 或目的 IP 只要是这个地址就匹配方便但有时候会误伤。如果我想确认“从这台机器发出的流量”用ip.src 192.168.1.20想确认“发往这台机器的流量”则用ip.dst 192.168.1.20。端口同理tcp.port 8080匹配源端口或目的端口tcp.srcport和tcp.dstport则区分方向。UDP 流量对应的字段是udp.port、udp.srcport、udp.dstport。过滤网段也是常见需求写法依然很直接ip.addr 192.168.1.0/24就能把整个网段的流量都筛出来。比如公司内网是 10.10.0.0/16我想看这台机器到底有没有和内网设备通信直接写ip.src 10.10.0.0/16就能把源地址来自内网的包全部选中。2.3 按内容特征过滤深入到应用层字段这才是显示过滤器真正让抓包过滤器望尘莫及的地方。你可以直接抓取请求行中的内容比如http.request.uri contains login会把所有 URI 里含有 login 的 HTTP 请求筛出来http.host www.example.com可以单独筛选某个域名的流量http.response.code 404则只看响应码为 404 的那些包。这些过滤条件在调试接口、排查异常请求时非常管用。如果记不住字段名可以利用 Wireshark 显示过滤器输入框左侧的“表达式”按钮打开字段浏览器搜索关键词找到想要的字段。我还常用一个偷懒的过滤方式frame contains password不用关心上层协议是什么只要数据包原始字节里包含这个字符串就会被筛出来。frame contains后面可以直接跟 IP 地址、域名、用户名等字符串甚至还能跟十六进制数据比如frame contains 01:02:03用于搜索某种固定特征的报文。注意contains对字符串大小写是敏感的如果确定不了大小写可以改用matches配合正则表达式比如http.host matches (?i)example表示不区分大小写地查找 example。2.4 常用组合逻辑and、or、not 的正确打开方式单个过滤条件通常解决不了复杂问题更多时候你需要组合多个条件。Wireshark 显示过滤器支持三种逻辑运算符and与、or或、not非也支持对应的符号写法、||、!。我平时习惯写单词确实更好读。括号也可以正常使用用于明确优先级比如tcp.port 80 (ip.src 192.168.1.10 || ip.src 192.168.1.11)表示只看 IP 为 10 或 11 这两台机器访问 80 端口的流量。这里有好几个常见的组合场景看某个 IP 发的 DNS 请求写dns.flags.response 0 ip.src 192.168.1.100看所有非本机的外联流量可以写ip.src 192.168.1.100 ip.dst ! 192.168.1.0/24看“不是 80 和 443 端口的 TCP 连接”可以写tcp !(tcp.port 80 || tcp.port 443)。另外显示过滤器还支持in操作符比如tcp.port in {80, 443, 8080}比连续写多个or干净得多。2.5 追踪单条会话流tcp.stream 与 Follow TCP Stream网络排障时经常需要把一条 TCP 连接从头到尾的所有包都提取出来看。Wireshark 给每条 TCP 连接自动分配了一个编号叫 stream index。你可以在任意一个 TCP 包上右键选择“追踪流 - TCP 流”Wireshark 就会自动弹出整个流的内容并且默认在显示过滤器里填上tcp.stream eq 12这样的条件把所有属于编号 12 这条流的包都筛出来。这个功能我几乎每次排查都会用特别是分析某个接口的完整请求、响应交互过程时比在茫茫包里一个个翻要高效太多。tcp.stream也可以用于 UDP“追踪流”菜单里也支持 UDP 流对应显示过滤器是udp.stream eq 0但日常用的最多还是 TCP。掌握了这个之后配合第 1.2 节里讲的“显示过滤器只是隐藏数据”这个认知你就能随意在“这条流”和“全局视图”之间来回切换整个排查思路会顺畅很多。3. 抓包过滤器BPF语法精讲控制采集范围虽然前面讲日常优先用显示过滤器但抓包过滤器在特定场景下依然是利器。尤其当你面对的是高流量环境比如核心交换机镜像口、云主机公网网卡若不限制抓包范围文件很容易在几分钟内膨胀到几个GB磁盘和性能都吃不消。这时候就得靠 BPF 语法来做源头裁剪。3.1 BPF 基础语法与关键字BPF 语法由三个核心部分组成类型限定词、方向限定词和协议限定词。它们排列起来就像英文句子读起来比较自然。比如src host 192.168.1.10意思是“源地址是 192.168.1.10”其中src是方向限定词host是类型限定词。类型限定词主要包含三类host表示主机、net表示网段、port表示端口另外还有portrange表示端口范围。方向限定词包含src、dst以及src or dst、src and dst默认是src or dst。协议限定词则包括tcp、udp、icmp、arp、ip、ip6等。下面列一组我实际用得比较多的 BPF 写法host 192.168.1.10 src host 192.168.1.10 dst host 192.168.1.10 net 192.168.1.0/24 port 80 tcp port 443 udp port 53 portrange 8000-9000 icmp arp ether host 00:11:22:33:44:55第一行表示与主机 192.168.1.10 的任何通信第二行只看这台主机作为源的流量第三行只看它作为目的的流量第四行抓整个 192.168.1.0/24 网段的包第五行抓 80 端口第六行同时限定协议为 TCP、端口为 443第七行是 UDP 53通常代表 DNS 流量第八行抓 8000 到 9000 的连续端口范围。icmp和arp直接写协议名就可以适合排查连通性和二层地址解析问题。ether host是另一种常见过滤方式按 MAC 地址过滤适合在局域网里锁定某一台设备。3.2 组合与逻辑运算BPF 同样支持and、or、not进行组合也可以用、||、!符号。比如想抓“来自 192.168.1.10 且目标端口是 80 的 TCP 包”可以写成src host 192.168.1.10 and tcp port 80想抓“TCP 或 UDP 流量但不包括 DNS端口 53”可以写成(tcp or udp) and not port 53括号在这里不是可选项它明确表达了逻辑优先级。BPF 默认的优先级是not高于andand高于or但不同场景下写起来容易犯迷糊所以我建议涉及多个条件时一律加括号又清晰又不容易出错。还有一个小技巧抓包过滤器可以直接写底层偏移判断比如tcp[13] 2 ! 0它表示检查 TCP 头部第 13 字节的 flags 字段与二进制00000010也就是 SYN 标志位做按位与结果不为 0 说明该包携带 SYN。用这条过滤可以只抓 TCP 握手的 SYN 包深入一点的端口扫描探测也常会用到不过前提是你对 TCP 头部结构有一定了解。3.3 抓包过滤器的边界为什么不能过滤应用层内容很多人会问抓包过滤器能不能写成http.request.method GET这种形式答案是绝对不能。因为抓包过滤器工作在网卡驱动层在内核协议栈处理的很早阶段就开始匹配它压根不解码 HTTP、DNS 这种应用层协议能看到的只有 IP 头、TCP/UDP 头、MAC 头这些基础信息。而显示过滤器是 Wireshark 在用户态对完整数据包做协议解码之后再进行筛选因此才能深入到应用层字段。所以我的建议是如果要做深度协议分析不要一上来就把抓包过滤器收得太窄。宁可先全量抓或者只限制 IP、端口把原始包保存下来后面用显示过滤器慢慢筛。只有在流量规模大到实在存不住文件、或者你有明确的采集目标时才用抓包过滤器收紧范围。记住一个原则抓包阶段尽量少做“减法”分析阶段再尽情“筛选”因为原始数据一旦丢了后面所有的分析都无从谈起。4. 实战案例用过滤命令快速定位问题光讲语法不落地没意义我挑几个平时最常遇到的排障场景把过滤命令怎么用、为什么这么用说清楚。4.1 案例一网站打不开先看 DNS 还是 TCP某天同事跑来说“网页打不开了”我先在本机抓一份包。这种情况下我不会一上来就限定端口因为问题可能出在好几个环节DNS 解析失败、TCP 连接被拒绝、TLS 握手异常、HTTP 返回 5xx。所以第一阶段先全量抓包等复现出问题后再用显示过滤器逐步排查。第一步过滤 DNS 请求和响应。在显示过滤器里输入dns.flags.response 0 ip.src 本机IP看本机到底有没有发出 DNS 查询再切换为dns.flags.response 1 ip.dst 本机IP看有没有收到响应。如果发现请求发出了但一直没响应大概率是 DNS 服务器或网络路径问题。如果 DNS 没问题第二步就过滤tcp.port 443再配合tcp.flags.syn 1看 TCP 三次握手的 SYN 包有没有发出去、有没有收到 SYN-ACK。如果 SYN 发出去迟迟等不到 SYN-ACK可能是防火墙拦截或者服务器负载过高如果收到了 SYN-ACK 但端到端连接没有建立成功问题可能出在 TCP 协议栈或本机防火墙。这一步一步地筛选排查思路会非常清晰。4.2 案例二应用上传很慢先盯重传和窗口另一个高频问题上传文件或接口响应特别慢。抓包文件往往已经有几百兆全量看根本盯不住这时我会直接用一组显示过滤器锁定关键异常。第一步查重传输入tcp.analysis.retransmission。这个字段不是网卡直接给的而是 Wireshark 经过分析后计算出来的标记只要出现重传就说明网络中出现了丢包或乱序是慢的重要嫌疑之一。第二步查 TCP 确认延迟输入tcp.analysis.ack_rtt 0.1可以看到 ACK 往返时间超过 100ms 的包如果大面积出现这种值可能是网络时延高。第三步查大包分片输入frame.len 1400看看是不是有大包因为 MTU 问题被频繁分片。第四步找到一个重传包后右键“追踪流 - TCP 流”用tcp.stream eq X把整条流的交互过程拉出来观察发送和确认的节奏就能判断瓶颈是在客户端、服务端还是中间链路。这一套组合拳下来大部分性能问题的定位都不难。4.3 案例三程序连不上数据库定位连接断在哪有一次后端服务报连接数据库超时我先在应用服务器上抓包目标很明确只看与数据库之间的流量。数据库 IP 是 10.20.30.40端口 3306过滤条件直接写ip.addr 10.20.30.40 tcp.port 3306。打开过滤结果先看有没有 TCP 三次握手如果 TCP SYN 包存在但目的端没回 SYN-ACK多半是数据库端口没监听或中间防火墙丢弃如果三次握手成功但后续 TLS 客户端问候ClientHello之后没有数据库的回应那可能就是协议配置或账号认证环节出的问题。再配合tls.handshake.type 1、tls.handshake.type 2这类过滤条件可以精细定位 TLS 握手走到哪一步停了。这个案例的关键点在于先用 IP 加端口把流量范围缩小再根据协议层逐步深入而不是打开抓包文件之后从头翻到底。4.4 案例四排查异常外联筛选非标准端口会话在授权测试或安全自查场景下我们经常需要排查一台服务器有没有出现异常的外联行为。最朴素的做法是抓包后过滤出所有“本机发起、目标不在内网网段”的连接。假设本机 IP 是 10.0.0.5内网段是 10.0.0.0/8显示过滤器可以这样写ip.src 10.0.0.5 ip.dst ! 10.0.0.0/8这个条件可以找出所有从本机发往外网地址的包。如果外联量很大再进一步限制非标准端口比如ip.src 10.0.0.5 ip.dst ! 10.0.0.0/8 tcp.port not in {80, 443, 53}意思就是只看 TCP 流量里端口不在 80、443、53 这些常见服务端口范围内的外联包。这类流量往往最值得深挖。定位到可疑会话后配合tcp.stream eq 编号追踪整条流再看数据内容是什么。需要声明的是这类操作必须在你有权限、有授权的设备和网络环境下进行不能拿这套技巧去做任何未经允许的探测。4.5 把常用过滤命令固化下来省去重复输入我平时会把自己常用的显示过滤器保存成“过滤器按钮”这样下次不用再敲一长串。在 Wireshark 显示过滤器输入框右侧有一个五角星或书签样式的按钮打开“管理显示过滤器”点加号填入名称和表达式保存后就能直接点击使用。比如我固定了“仅HTTP请求”“仅DNS响应”“重传”“大包”这几个按钮。抓包过滤器同样可以保存在“捕获选项”窗口左下角的“捕获过滤器”标签页里可以把host x.x.x.x and tcp port 80这类常用预设存下来。人脑记不住所有语法但工具允许你偷懒把常用的固化下来是最划算的习惯。5. 常见问题排查与避坑技巧过滤命令看起来简单实际用起来却有一堆让人卡壳的小问题。我在这里把踩过的一些坑集中写出来按照从现象到解决的思路整理方便你遇到问题时直接查。5.1 输入了过滤命令为什么一条包都不显示遇到这种情况我先按顺序排查三件事。第一检查过滤输入框是不是红色是红色说明语法有误Wireshark 根本没法解析比如把ip.addr 192.168.1.1写成ip.addr192.168.1.1少了一个等号。第二检查有没有按回车或点右侧蓝色小箭头真正应用过滤器有时候输完表达式却没生效界面自然还是全量数据。第三检查过滤条件的方向和字段名是不是搞错了。比如本机向某个 IP 发请求你心里想的是“看目的 IP”却写成了ip.src 目标IP那结果当然是空。还有字段名写错的问题比如tcp.srcport和tcp.dstport一定要区分开udp.sourceport不是合法字段名正确的是udp.srcport。最靠谱的做法是点开“表达式”按钮搜索标准字段名不要凭记忆硬编。5.2 过滤器显示绿色却仍然没有匹配数据过滤器变绿只能说明语法有效并不能说明条件在当前文件中一定匹配。最容易犯的错是把tcp.port写成tcp.dstport方向一限定数据就会少很多。还有一种情况是大小写比如http.request.uri contains Login但真正数据包里的 URI 是小写的login结果完全匹配不上。这时候可以改用matches加忽略大小写标记写成http.request.uri matches (?i)login。另外某些字段的取值类型是数字而不是字符串比如http.response.code 404写对了会匹配但如果写成http.response.code 404有些版本会语法报错有些版本则提示类型不匹配。如果你想确认自己写的条件到底有没有匹配可以先把过滤器清空在“统计”菜单里看某个协议或字段的层级统计再回过来改条件。5.3 抓包文件太大过滤慢到怀疑人生怎么办遇到超大抓包文件时显示过滤器再厉害加载和筛选也会卡顿。我的处理办法有两个方向。一是从源头限制抓包时在“捕获选项”里设置“限制每个包的大小snaplen”。如果只需要分析 TCP 头部、连接行为把每个包限制在 128 或 256 字节就足够如果要分析 HTTP 负载建议保留完整包或至少 1400 字节往上不然 payload 被截断了没法玩。二是对大文件做预处理用 Wireshark 自带的命令行工具editcap和tshark。editcap -r input.pcapng output.pcapng 1-1000可以切出前 1000 个包tshark -r input.pcapng -Y tcp.port 8080 -w output.pcapng则可以根据显示过滤器表达式生成一个新的小文件。这样后续在 Wireshark 里打开的就是过滤好的精炼数据速度会快很多。5.4 想用命令行批量过滤tshark 怎么玩如果你要对大量 pcap 文件做批处理或者需要把过滤结果导出成文本供脚本分析那就得掌握tshark。最简单的用法和 Wireshark 图形界面里的显示过滤器完全一致例如tshark -r input.pcapng -Y dns.flags.response 1 ip.dst 192.168.1.1这会直接打印匹配的包摘要。如果想把结果保存成新的 pcap 文件加一个-w参数tshark -r input.pcapng -Y http.request -w http_only.pcapng如果想把某个字段提取成表格结合-T fields和-e参数tshark -r input.pcapng -Y tcp.port 3306 -T fields -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport这很适合我做批量分析的场景。要注意tshark的过滤表达式和 Wireshark 图形界面里的显示过滤器是同一套你会哪个就会另一个。5.5 权限不足与混杂模式问题抓包时如果发现只能看到自己的收发流量看不到局域网里其他设备的包原因通常是“混杂模式”没有开启或者当前账号权限不够。在 Windows 上安装 Npcap 后需要以管理员身份运行 Wireshark在 Linux 上通常需要 root 权限或者给用户添加抓包能力。开启混杂模式的位置在捕获选项里的“使用混杂模式”复选框如果要在交换机镜像口或 Wi-Fi 环境中抓其他设备的流量这几乎是必选项。无线环境下情况还会更复杂普通 Wi-Fi 网卡驱动可能不支持完整混杂模式要么换 USB 网卡要么使用支持监听模式的无线网卡。这一条属于环境类问题很多新人抓不到包第一反应是过滤器写错了其实换个思路检查权限和设备模式往往能更快解决。6. 关于过滤命令最后的几点个人心得这些内容不是课本上的知识点而是我长期用 Wireshark 干活攒下来的经验。先说一个核心心得抓包分析这件事最重要的不是背过滤命令而是先想清楚你想回答什么问题。比如“这个网页为什么打开慢”本质问题可能是“DNS 解析慢”“TCP 握手慢”“首字节响应慢”“大包下载慢”中的任何一个对应的过滤条件完全不同。我的习惯是先把问题拆解成可验证的小问题再逐层过滤而不是打开抓包文件后一上来就乱敲命令。再分享一个实用技巧给你的过滤器建立一套固定的“工具栏”。我把最常用的十个显示过滤器按钮固定下来涵盖“只看到本机IP”“只看HTTP请求”“只看DNS”“只看重传”“只看大包”“只看非标准端口外联”这几类。这样在突发故障时我能用最快速度切换视角而不需要每次现场回忆语法。抓包过程的节奏也很重要刚上手时可以先抓全量再用显示过滤器慢慢筛等你对流量模式足够熟悉再考虑用抓包过滤器从源头控制数据量。千万别一上来就把条件写得特别死万一方向判断错了丢掉的包是找不回来的。最后补充一点Wireshark 里的过滤表达式网上有很多现成模板但不同场景、不同协议版本下字段名会有差异别盲目复制。看到一条陌生表达式时最稳妥的办法是在“表达式”窗口里搜索相关字段逐一确认字段名和取值类型。工具是死的排查思路是活的。有了这一篇的过滤命令基础再配合自己动手多抓几次包、多踩几次坑你会很快发现 Wireshark 其实是一个非常好用的排障利器。