两类过滤器的区别
Wireshark 里有两个位置可以写过滤条件,作用完全不同。捕获过滤器在抓取阶段生效,用 BPF 语法(如 port 443),不匹配的报文会被直接丢弃且无法找回;显示过滤器在展示阶段生效,用字段表达式(如 tcp.port == 443),数据仍在文件里,随时改条件都能重新筛。两者的语法不通用,把字段名填进捕获过滤器会报语法错,把 BPF 原语填进显示过滤器同样如此。
基本信息
| 捕获过滤器位置 | 捕获选项对话框里的输入框,命令行对应 dumpcap 的 -f |
|---|---|
| 显示过滤器位置 | 主窗口顶部过滤栏,命令行对应 tshark 的 -Y |
| 捕获过滤器语法 | BPF,如 port 443、host 10.0.0.9 |
| 显示过滤器语法 | 字段表达式,如 tcp.port == 443 |
| 可逆性 | 捕获过滤器丢弃后不可恢复,显示过滤器随时切换 |
两类过滤器对比
| 维度 | 捕获过滤器 | 显示过滤器 |
|---|---|---|
| 生效时机 | 报文进入抓包缓冲区之前 | 报文已经落盘或进入内存之后 |
| 语法体系 | BPF 原语,不认识字段名 | 协议字段表达式,可使用协议名限定 |
| 不可逆性 | 丢弃的报文不会出现在文件里 | 任何时候都能改条件重新筛 |
| 典型用途 | 高流量口限流、远程抓包省带宽 | 分析阶段反复切片与统计 |
| 组合限制 | 只能表达地址、端口、协议等有限条件 | 可表达字段比较、正则、集合等复杂条件 |
典型使用场景
- 高流量接口上先限定主机或端口,避免把磁盘写满,此时用捕获过滤器
- 不确定问题在哪台主机时,先全量抓一小段,再在本地用显示过滤器反复切片
- 远程抓包受带宽限制时用捕获过滤器,本地分析不受限时用显示过滤器
- 需要留证归档的场景尽量不加捕获过滤器,避免事后缺少上下文
- 长期巡检固定几个业务端口时,捕获过滤器可以显著降低存储压力
两种写法的等价示例
两种写法的等价示例
捕获过滤器:port 443 显示过滤器:tcp.port == 443
捕获过滤器:host 10.0.0.9 显示过滤器:ip.addr == 10.0.0.9
捕获过滤器:tcp port 80 or tcp port 443 显示过滤器:tcp.port in {80, 443}
捕获过滤器:not arp 显示过滤器:!arp
捕获过滤器:ip proto 47 显示过滤器:ip.proto == 47判断条件该写在哪边,看两件事:这条条件是否需要丢弃报文来降低开销,以及这个条件事后会不会想改。需要省开销写在捕获侧,需要灵活性写在显示侧。
捕获过滤器丢掉的报文不会留在文件里。事后复盘时如果发现当时过滤得太狠,唯一的补救办法是重抓一次,关键故障场景建议保守过滤或不过滤。
命令行对应
命令行对应
dumpcap -i eth0 -f 'tcp port 443' -w a.pcapng # 捕获过滤器:-f
tshark -r a.pcapng -Y 'tcp.port == 443' | head # 显示过滤器:-Y
tcpdump -i eth0 -nn port 443 -w a.pcap # tcpdump 的表达式也是捕获侧选择建议
- 高流量口先加捕获条件限流,宁可少抓一点也要保证抓包进程跟得上
- 问题范围不明时全量抓短时段,比长时间带过滤抓更容易抓住真相
- 长期抓包用环形缓冲加少量捕获条件,兼顾磁盘与信息量
- 交接文件时附上当时使用的捕获过滤器,别人才能判断是否存在信息缺失