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

Wireshark过滤器全面汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部

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

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

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

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

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

1.1 基础语法结构

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

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

支持的基本关键词:

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 捕获过滤器示例

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

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

2.1 语法结构

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

2.2 常用比较符

2.3 逻辑运算符

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

2.4 常用协议及字段示例

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 ==&nbsp;"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&nbsp;"google"
  • DNS查询名匹配某正则表达式(如所有以.com结尾):

    dns.qry.name matches&nbsp;".*\.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或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卡顿甚至崩溃。以下建议帮你提升效率:

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

  • 过滤表达式中避免使用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 ==&nbsp;"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&nbsp;".*\.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:详细模式
  • -e:显示链路层头部信息

原创:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值