Wireshark 过滤语法太多记不住?这一篇直接全汇总!

小陈 的头像

0 评论

5 阅读

6,579 字,阅读时间 32 分。

hello,我是网工小陈。

Wireshark的强大在于它丰富的过滤功能,帮你从海量抓包数据中精准找出想要的包。

但同时,过滤语法又分成捕获过滤器和显示过滤器,语法复杂且不通用。

Wireshark 过滤语法太多记不住?这一篇直接全汇总!_img_1

今天这篇文章,我帮你把Wireshark过滤器的语法、常用命令、组合用法、实用示例全部捋一遍,帮你彻底搞懂,记得用!


1. 捕获过滤器(Capture Filter)详解

捕获过滤器作用是在抓包开始前限制抓取数据包,基于BPF(Berkeley Packet Filter)语法。它对数据流量起“网筛”作用,过滤掉不关心的包,节省空间和性能。常用在抓包前预过滤。

1.1 基础语法结构

捕获过滤器是基于简洁的关键词和运算符,形式类似:

<表达式> [and|or|not <表达式>] ...

支持的基本关键词:

关键词
说明
示例
host
指定IP地址
host 192.168.1.1
src
源地址
src host 10.0.0.1
dst
目的地址
dst host 10.0.0.2
net
网段
net 192.168.1.0/24
port
端口号(源或目的)
port 80
src port
源端口
src port 53
dst port
目的端口
dst port 22
tcp
TCP协议
tcp
udp
UDP协议
udp
icmp
ICMP协议
icmp
arp
ARP协议
arp

1.2 逻辑运算符

  • and:且
  • or:或
  • not:非

示例:

  • 抓取源IP是10.0.0.1且目标端口为80的TCP流量:

    src host 10.0.0.1 and tcp and dst port 80
  • 抓取所有UDP包或ICMP包:

    udp or icmp
  • 排除ARP包:

    not arp

1.3 捕获过滤器示例

场景
捕获过滤器表达式
抓取目标IP是192.168.1.5的包
dst host 192.168.1.5
抓取TCP端口80和443流量
tcp and (port 80 or port 443)
抓取源IP不是10.0.0.1的包
not src host 10.0.0.1
抓取网段192.168.0.0/16流量
net 192.168.0.0/16

2. 显示过滤器(Display Filter)详解

显示过滤器用在抓包完成后筛选数据包,功能强大、语法复杂,能针对各种协议和字段精确过滤。

2.1 语法结构

<协议>.<字段> <比较符> <值> [逻辑运算符 <过滤表达式>]...

2.2 常用比较符

比较符
说明
例子
==
等于
ip.src == 192.168.1.1
!=
不等于
tcp.dstport != 80
>
大于
frame.len > 1000
<
小于
tcp.seq < 10000
>=
大于等于

<=
小于等于

contains
包含(字符串)
http.host contains "google"
matches
正则匹配
dns.qry.name matches ".*\.com"

2.3 逻辑运算符

  • and:且
  • or:或
  • not:非

2.4 常用协议及字段示例

协议
常用字段
说明
ip ip.src
,ip.dst
源/目的IP地址
tcp tcp.srcport
,tcp.dstport,tcp.flags
TCP端口,标志位
udp udp.srcport
,udp.dstport
UDP端口
http http.request.method
,http.host
HTTP请求方法,Host头
dns dns.qry.name
,dns.flags.response
DNS查询名,响应标志
icmp icmp.type
,icmp.code
ICMP类型、代码

2.5 示例过滤器

  • 过滤源IP是10.0.0.2的包:

    ip.src == 10.0.0.2
  • 过滤目标端口是80或443的TCP包:

    tcp.dstport == 80 or tcp.dstport == 443
  • 过滤HTTP GET请求:

    http.request.method =="GET"
  • 过滤DNS查询包:

    dns.flags.response == 0

3. 显示过滤器高级技巧

3.1 组合逻辑过滤

过滤条件可以任意组合,利用括号明确优先级,满足复杂过滤需求。

示例:过滤源IP是192.168.1.1且目标端口是80或443的TCP包

ip.src == 192.168.1.1 and (tcp.dstport == 80 or tcp.dstport == 443)

3.2 利用协议标志位过滤

针对TCP标志位的过滤非常实用,常用于诊断连接问题。

  • 过滤TCP SYN包(发起连接)

    tcp.flags.syn == 1 and tcp.flags.ack == 0
  • 过滤TCP FIN包(关闭连接)

    tcp.flags.fin == 1
  • 过滤TCP重传包

    tcp.analysis.retransmission

3.3 按报文长度过滤

有时候抓包数据量巨大,可以按包大小过滤,只看超过一定长度的包。

frame.len > 1000

这可以帮你快速聚焦大数据包,比如文件传输。

3.4 过滤存在某字段的包

某些字段只有部分包有,例如SSL握手包中的ssl.handshake字段,过滤时可以用:

ssl.handshake

表示只显示带有握手字段的包。

3.5 过滤IPv6流量

IPv6过滤与IPv4类似,但字段名不同。

  • 过滤IPv6源地址为fe80::1的包:

    ipv6.src == fe80::1
  • 过滤所有IPv6流量:

    ipv6

3.6 过滤字符串字段包含关系

常用HTTP或DNS过滤,查找域名或URL包含某关键字。

  • HTTP Host中包含google

    http.host contains"google"
  • DNS查询名匹配某正则表达式(如所有以.com结尾):

    dns.qry.name matches".*\.com"

4. 捕获过滤器实用技巧和复杂表达式

4.1 捕获时指定多个条件

要捕获多个IP或端口流量时,用括号明确优先级。

示例:抓取目的IP是192.168.1.1或192.168.1.2的TCP包

tcp and (dst host 192.168.1.1 or dst host 192.168.1.2)

4.2 排除特定协议

想抓包排除ARP包:

not arp

想抓取非TCP包:

not tcp

4.3 指定网卡的捕获过滤器

-i参数指定抓哪个接口,结合过滤器精确抓包:

tcpdump -i eth0 tcp port 80

4.4 捕获过滤器语法限制

捕获过滤器不支持协议内部字段,只能针对包头基本字段(IP、端口、协议),不支持显示过滤器的复杂条件。


5. 显示过滤器常见字段详细解析(部分)

协议
字段
说明
ip
ip.src
源IP地址
ip
ip.dst
目的IP地址
tcp
tcp.srcport
TCP源端口
tcp
tcp.dstport
TCP目的端口
tcp
tcp.flags
TCP标志位
tcp
tcp.flags.syn
SYN标志
tcp
tcp.flags.ack
ACK标志
udp
udp.srcport
UDP源端口
udp
udp.dstport
UDP目的端口
http
http.request.method
HTTP请求方法(GET、POST等)
http
http.host
HTTP Host字段
dns
dns.qry.name
DNS查询名
dns
dns.flags.response
DNS响应标志(0请求,1响应)
icmp
icmp.type
ICMP类型
icmp
icmp.code
ICMP代码
frame
frame.len
报文长度
eth
eth.src
源MAC地址
eth
eth.dst
目的MAC地址

6. 显示过滤器更详细字段解析

6.1 以太网层(Ethernet)

  • eth.src:源MAC地址
  • eth.dst:目的MAC地址
  • eth.type:以太网类型,如0x0800表示IPv4,0x86DD表示IPv6

6.2 IP层

  • ip.version:IP协议版本,4或6
  • ip.ttl:生存时间(TTL)
  • ip.id:标识,用于分片识别
  • ip.proto:承载协议类型,如6是TCP,17是UDP
  • ip.flags:分片标志
  • ip.frag_offset:分片偏移

示例过滤TTL小于64的包:

ip.ttl < 64

6.3 TCP层

  • tcp.seq:序列号
  • tcp.ack:确认号
  • tcp.flags:标志位整体
  • tcp.flags.syn:同步标志
  • tcp.flags.ack:确认标志
  • tcp.flags.fin:关闭连接标志
  • tcp.window_size:窗口大小

过滤TCP窗口大小小于1024的包:

tcp.window_size < 1024

6.4 UDP层

  • udp.length:UDP报文长度

6.5 ICMP层

  • icmp.type:类型码(如8是Echo请求,0是Echo应答)
  • icmp.code:类型细分

过滤ICMP Echo请求包:

icmp.type == 8

6.6 HTTP协议

  • http.request.method:请求方法(GET、POST、PUT等)
  • http.response.code:响应码(200、404等)
  • http.host:请求的主机名
  • http.user_agent:客户端信息

过滤HTTP响应码404:

http.response.code == 404

6.7 DNS协议

  • dns.qry.name:查询域名
  • dns.qry.type:查询类型(A、AAAA、MX等)
  • dns.a:A记录返回IP地址
  • dns.flags.response:0表示请求,1表示响应

过滤所有DNS查询包:

dns.flags.response == 0

6.8 SSL/TLS协议

  • ssl.handshake.type:握手类型(客户端Hello、服务端Hello等)
  • ssl.record.version:协议版本
  • ssl.record.length:记录长度

过滤所有TLS客户端Hello包:

ssl.handshake.type == 1

7. 显示过滤器性能优化建议

当抓包文件巨大时,复杂过滤语法可能会导致Wireshark卡顿甚至崩溃。以下建议帮你提升效率:

  • 尽量先用捕获过滤器减少抓包量

  • 过滤表达式中避免使用containsmatches这类正则匹配,性能消耗大

  • 尽量使用字段的等值或范围比较

  • 对IP和端口的过滤尽量集中,不要写太多or条件

  • 使用括号明确运算顺序,避免解析错误

  • 分步骤过滤,先用粗过滤,再逐步精细化


8. 实用场景举例

8.1 定位特定主机通信

只看某台主机的所有流量:

ip.addr == 192.168.1.100

8.2 诊断TCP三次握手过程

过滤TCP SYN包:

tcp.flags.syn == 1 and tcp.flags.ack == 0

过滤TCP SYN+ACK包:

tcp.flags.syn == 1 and tcp.flags.ack == 1

过滤完成三次握手的包:

tcp.flags.ack == 1 and tcp.seq == tcp.ack - 1

8.3 抓取HTTP请求

过滤所有HTTP请求:

http.request

过滤POST请求:

http.request.method =="POST"

8.4 DNS问题排查

过滤DNS请求:

dns.flags.response == 0

过滤DNS响应:

dns.flags.response == 1

过滤查询失败的DNS响应(RCODE不为0):

dns.flags.rcode != 0

8.5 网络攻击检测

过滤ICMP洪泛攻击(大量ICMP请求):

icmp.type == 8

过滤TCP SYN洪泛攻击:

tcp.flags.syn == 1 and tcp.flags.ack == 0

9. 捕获过滤器更丰富的使用场景

9.1 按接口过滤

指定接口抓包:

tcpdump -i eth1

监听所有接口:

tcpdump -i any

9.2 指定MAC地址抓包

抓取源MAC地址是00:11:22:33:44:55的包:

ether src 00:11:22:33:44:55

目的MAC地址:

ether dst 00:11:22:33:44:55

9.3 抓特定协议

抓取HTTP流量(通常端口80端口):

tcp port 80

抓取DNS流量:

udp port 53

抓取所有ARP包:

arp

9.4 按包大小过滤

抓包长度大于1000字节的包:

greater 1000

9.5 复杂组合示例

抓取目标是192.168.1.10且TCP端口是22或80的包:

dst host 192.168.1.10 and tcp and (dst port 22 or dst port 80)

抓取除ICMP外所有流量:

not icmp

10. 显示过滤器高级语法技巧

10.1 字段赋值判断

某些协议中字段可判断是否存在或赋值。

  • 判断HTTP请求是否有Host头:

    http.host
  • 判断DNS查询名是否以某域名结尾(正则):

    dns.qry.name matches".*\.cn$"

10.2 多字段范围过滤

过滤TCP目的端口是1024到65535的包(高端口):

tcp.dstport >= 1024 and tcp.dstport <= 65535

10.3 空值判断

过滤没有TCP选项的包:

!tcp.options

10.4 按协议层级过滤

过滤所有包含HTTP但排除HTTPS的包:

http and not ssl

10.5 显示过滤器变量

Wireshark支持变量绑定和条件过滤,可在高级脚本和命令行用法中发挥作用,这里不做深讲。


11. 捕获过滤器 vs 显示过滤器

方面
捕获过滤器
显示过滤器
作用阶段
抓包开始前限制抓取包
抓包后过滤显示包
语法基础
简单,基于BPF语法
复杂,支持协议字段精确过滤
支持字段
IP、端口、协议、MAC地址等简单
详细协议内部字段
性能影响
对抓包性能影响较大
对显示性能影响较大
适用场景
资源有限时控制抓包量
抓完包后细致分析
语法兼容性
tcpdump等工具通用
Wireshark专用

12. 常用命令参数总结

  • -i <interface>:指定接口
  • -c <count>:抓包数量限制
  • -s <snaplen>:抓包长度限制
  • -w <file>:写入文件
  • -r <file>:读取文件分析
  • -n:禁止DNS解析,直接显示IP
  • -v:详细模式

免责声明:本文内容来源于:

微信公众号

网络工程师小陈

,原文链接:

http://mp.weixin.qq.com/s?__biz=Mzk0OTc0MzYxNA==&mid=2247485745&idx=1&sn=05df8301bc8a6e7fbe372b30463fdbaa&chksm=c352f3a0f4257ab63dbc4eb541fb6bfcad766e51e3d02af18fc55aaf29bbf1c6170c584022a3#rd

本站为个人站点,相关文章均为网络公开资料,仅出于个人学习、研究及资料整理之用途转载收集,所有版权均归原作者及原发布平台所有。文末作者信息仅用于进行本站文章的分类信息使用,不代表原作者授权或者原作者入驻等依据。
本站不保证内容的完整性与准确性,亦不对内容承担任何法律责任。 如本文涉及版权问题,请原作者及时与我们联系,我们将在第一时间内进行删除处理。 本站尊重并遵守相关版权法规,倡导合法使用网络资源。 联系方式:[email protected]

小陈 的头像

30篇作品

290总阅读量

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

更多文章

网工通信弱电的宝藏知识网站