hello,我是网工小陈。
Wireshark的强大在于它丰富的过滤功能,帮你从海量抓包数据中精准找出想要的包。
但同时,过滤语法又分成捕获过滤器和显示过滤器,语法复杂且不通用。

今天这篇文章,我帮你把Wireshark过滤器的语法、常用命令、组合用法、实用示例全部捋一遍,帮你彻底搞懂,记得用!
文章目录
1. 捕获过滤器(Capture Filter)详解
捕获过滤器作用是在抓包开始前限制抓取数据包,基于BPF(Berkeley Packet Filter)语法。它对数据流量起“网筛”作用,过滤掉不关心的包,节省空间和性能。常用在抓包前预过滤。
1.1 基础语法结构
捕获过滤器是基于简洁的关键词和运算符,形式类似:
<表达式> [and|or|not <表达式>] ...
支持的基本关键词:
host |
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 |
|
udp |
udp |
|
icmp |
icmp |
|
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 捕获过滤器示例
dst host 192.168.1.5 |
|
tcp and (port 80 or port 443) |
|
not src host 10.0.0.1 |
|
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 |
|
tcp |
tcp.srcport tcp.dstport ,tcp.flags |
|
udp |
udp.srcport udp.dstport |
|
http |
http.request.method http.host |
|
dns |
dns.qry.name dns.flags.response |
|
icmp |
icmp.type icmp.code |
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. 显示过滤器常见字段详细解析(部分)
6. 显示过滤器更详细字段解析
6.1 以太网层(Ethernet)
eth.src
:源MAC地址eth.dst
:目的MAC地址eth.type
:以太网类型,如0x0800表示IPv4,0x86DD表示IPv6
6.2 IP层
ip.version
:IP协议版本,4或6ip.ttl
:生存时间(TTL)ip.id
:标识,用于分片识别ip.proto
:承载协议类型,如6是TCP,17是UDPip.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卡顿甚至崩溃。以下建议帮你提升效率:
尽量先用捕获过滤器减少抓包量
过滤表达式中避免使用
contains
和matches
这类正则匹配,性能消耗大尽量使用字段的等值或范围比较
对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 显示过滤器
12. 常用命令参数总结
-i <interface>
:指定接口-c <count>
:抓包数量限制-s <snaplen>
:抓包长度限制-w <file>
:写入文件-r <file>
:读取文件分析-n
:禁止DNS解析,直接显示IP-v
:详细模式
发表回复