综合

wireshark过滤器语法

时间:2010-12-5 17:23:32  作者:知识   来源:百科  查看:  评论:0
内容摘要:打开Wireshark,抓包列表刷得飞快,几百个包混在一起,你要找的那个HTTP请求藏在哪儿?答案就在显示过滤器里。别小看输入框那行字,写对了,几秒钟定位问题;写错了,盯着满屏数据干瞪眼。 显示过滤器

打开Wireshark,滤器抓包列表刷得飞快,语法几百个包混在一起,滤器你要找的语法那个HTTP请求藏在哪儿?答案就在显示过滤器里。别小看输入框那行字,滤器写对了,语法几秒钟定位问题;写错了,滤器盯着满屏数据干瞪眼。语法

显示过滤器和捕获过滤器是滤器两码事。捕获过滤器在抓包之前生效,语法用的滤器是BPF语法,比如tcp port 80。语法显示过滤器在抓包之后过滤视图,滤器语法完全不同。语法我见过不少人把两者搞混,滤器在显示过滤栏里敲port 80,结果报红——得写成tcp.port == 80才行。

最常用的几个原语

按IP过滤:ip.addr == 192.168.1.1,这一条同时匹配源和目的。只想看发往这个地址的包,用ip.dst == 192.168.1.1。按协议过滤更简单,直接敲http、dns、tcp就行。但要注意,tcp会匹配所有含TCP头的包,包括HTTP和TLS,范围比你想的宽。

按端口过滤时,tcp.port == 443同样不区分方向。实际排查中我更常用tcp.srcport == 54321这种精确写法,尤其是追踪某个特定连接的往返流量。

比较运算符和逻辑组合

Wireshark支持==、!=、>、<、>=、<=,还有contains和matches。比如http.host contains "example"能筛出Host头里含example的请求。matches走的是PCRE正则,http.request.uri matches "\\.php$"可以抓所有PHP请求。

逻辑组合用and、or、not,也支持&&、||、!。我习惯用英文单词,可读性好一些。组合的时候注意优先级,not最高,然后and,最后or。拿不准就加括号:(ip.addr == 10.0.0.1 or ip.addr == 10.0.0.2) and tcp.port == 8080。

几个实战场景

排查TCP重传:tcp.analysis.retransmission。这一条直接列出所有重传包,比肉眼翻序列号快得多。想看零窗口:tcp.analysis.zero_window。这两个过滤器我几乎每次分析网络卡顿都会用。

抓特定HTTP状态码:http.response.code >= 400。服务器报错的时候,一条过滤器就能把4xx和5xx全捞出来。http.response.code == 500更精确,但有时候499、502也得一起看。

找DNS查询失败:dns.flags.rcode != 0。正常响应rcode是0,非零就是出问题了。配合dns.qry.name contains "test"能缩小到具体域名。

那些容易踩的坑

字段名拼错是家常便饭。http.request.method是对的,写成http.method就报错。Wireshark的自动补全会帮你,但补全列表太长的时候,手快选错也常有。我的习惯是敲前几个字母,等补全出来再用方向键选,别直接回车。

字符串比较要加引号,http.host == "www.baidu.com"。不加引号在某些版本里也能跑,但遇到特殊字符就崩。还有contains是区分大小写的,http.host contains "Baidu"和"baidu"结果不一样。

另一个坑是!=的行为。ip.addr != 192.168.1.1并不是“排除这个IP的所有包”,而是“源或目的不等于该IP”。一个包如果源是该IP、目的是别的,它仍然会被匹配到——因为目的地址确实不等于。想真正排除,得写!(ip.addr == 192.168.1.1)。这个逻辑差异坑过我不止一次。

过滤器写多了可以存成按钮,工具栏上点一下就行。Analyze菜单里的Display Filter Expression对话框能帮你按字段树逐层选,适合记不住字段名的时候用。不过手敲熟练之后,速度比点选快得多。

说到底,显示过滤器就是Wireshark的搜索语言。花半小时把常用字段和运算符过一遍,后面抓包分析能省下大量翻页的时间。我现在的习惯是抓完包先敲三五个过滤器,把无关流量滤掉,剩下的才是真正要看的东西。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap