一、先分清两种过滤器
Wireshark 有两个地方能填过滤条件,位置不同,作用完全不同:
| 捕获过滤器 | 显示过滤器 | |
|---|---|---|
| 位置 | 抓包前,选网卡那个界面 | 抓包后,主界面顶部绿色栏 |
| 语法 | BPF 语法(tcp port 80) | Wireshark 语法(tcp.port == 80) |
| 作用 | 不抓不符合的包 | 抓了但不显示不符合的包 |
| 能反悔吗 | 不能,没抓就没了 | 能,改一下条件就显示出来 |
| 写文章的用处 | 减少文件大小 | 分析时切换视角 |
核心区别:捕获过滤器是物理丢弃,显示过滤器是视觉过滤。
建议:除非包特别多,否则只用显示过滤器。捕获过滤器留着抓大流量时用。
二、显示过滤器的三种基本写法
写法 1:直接写协议名
tcp udp http dns icmp arp tls http2 quic只看这个协议,最简单。
写法 2:字段 + 运算符 + 值
ip.addr == 192.0.2.10 tcp.port == 80 http.request.method == "GET" tls.handshake.type == 1这是最常用的形式。
写法 3:逻辑组合
&& 与(同时满足) || 或(满足一个即可) ! 非(不满足)&&/||/! 仍能用,但在 Wireshark 3.x+ 会触发警告。对应的推荐写法是 and / or / not。
三、运算符速查
| 运算符 | 含义 | 示例 |
|---|---|---|
== | 等于 | ip.addr == 192.0.2.10 |
!= | 不等于 | ip.addr != 192.0.2.10 |
>< | 大于 / 小于 | tcp.len > 1000 |
>=<= | 大于等于 / 小于等于 | frame.len >= 1500 |
contains | 包含字符串 | http.host contains "example" |
matches | 正则匹配 | http.host matches ".*\\.com" |
in | 在集合里 | tcp.port in {80,443,8080} |
注意:==是两个等号,不是=。写一个等号 Wireshark 会报错。
四、常用字段速查
IP 相关
ip.addr == 192.0.2.10 任意方向匹配这个 IP ip.src == 192.0.2.10 只匹配源 ip.dst == 192.0.2.10 只匹配目的 ip.addr in {192.0.2.10, 192.0.2.20} 两个 IP 任一个TCP / UDP 端口
text tcp.port == 80 任意方向 tcp.srcport == 54321 只匹配源端口 tcp.dstport == 443 只匹配目的端口 tcp.port in {80,443,8080} 三个端口任一个 udp.port == 53HTTP
text http.request 只看请求 http.response 只看响应 http.request.method == "GET" http.request.uri contains "/api" http.host == "example.com" http.response.code == 200 http.response.code >= 400 所有客户端/服务端错误TLS
text tls.handshake.type == 1 Client Hello tls.handshake.type == 2 Server Hello tls.alert_message 告警消息 tls.handshake.extensions_alpn_str contains "h2" 协商 HTTP/2TCP 分析字段(排查故障专用)
text tcp.analysis.retransmission 重传 tcp.analysis.fast_retransmission 快速重传 tcp.analysis.duplicate_ack 重复 ACK tcp.analysis.zero_window 零窗口 tcp.analysis.reset RST tcp.analysis.out_of_order 乱序 tcp.analysis.ack_rtt > 0.1 RTT 超过 100ms帧相关
text frame.len > 1000 包长超过 1000 frame.time_relative > 10 相对时间超过 10 秒 frame.number == 100 第 100 个包 frame contains "password" 包内容包含 password五、十组实战组合(背下来)
1. 看某个 IP 的所有通信
text ip.addr == 192.0.2.102. 看某个 IP 的 HTTPS 流量
text ip.addr == 192.0.2.10 && tcp.port == 4433. 看 HTTP 的 POST 请求
text http.request.method == "POST"4. 看所有 4xx 和 5xx 错误
text http.response.code >= 4005. 看所有 TCP 重传
text tcp.analysis.retransmission6. 看重传 + 零窗口(应用慢的典型)
text tcp.analysis.retransmission || tcp.analysis.zero_window7. 看某个流的所有包
text tcp.stream == 58. 看 DNS 查询失败的
text dns.flags.rcode != 09. 看 ICMP 错误
text icmp.type == 3 || icmp.type == 1110. 排除噪声,只看业务流量
text !arp && !mdns && !ssdp && !nbnsarp、mdns、ssdp、nbns是局域网里的广播噪声,分析时经常先排除。
六、三个进阶技巧
技巧 1:右键生成过滤器
不用手打字段名。在协议树里右键任意字段 →Apply as Filter → Selected,Wireshark 自动生成正确的过滤器表达式。
这是最推荐的学习方式:想过滤什么,先右键看看它生成的语法,慢慢就记住了。
技巧 2:过滤按钮栏
过滤器输入框右边有个书签图标,点一下可以保存常用过滤器。下次直接点书签就用。
常用几个可以存进去:
text tcp.analysis.retransmission http.response.code >= 400 tls.handshake.type == 1技巧 3:颜色 + 过滤器联动
把过滤器和配色规则一起用:
加一条配色规则:Filter =
tcp.analysis.retransmission,红底不填过滤器时,重传包也是红的
填上过滤器时,只显示重传包
这样既能看到全貌,又能一眼抓住异常。
七、常见错误
| 错误写法 | 报错原因 | 正确写法 |
|---|---|---|
ip.addr = 192.0.2.10 | 少一个等号 | ip.addr == 192.0.2.10 |
tcp.port = 80 | 同上 | tcp.port == 80 |
http.request.method == GET | 字符串要加引号 | http.request.method == "GET" |
ip.addr == 192.0.2.10/24 | 不支持 CIDR | ip.addr == 192.0.2.0/24(用ip contains) |
tcp.stream = 5 | 少一个等号 | tcp.stream == 5 |
字符串一定加双引号,这是最常见的坑。
八、安全脱敏
写文章时,过滤器表达式本身不敏感,但截图里的过滤结果要注意:
| 位置 | 处理 |
|---|---|
| 过滤器栏里的 IP | 可以保留(只是表达式,不是真实流量) |
| 列表里的 IP 列 | 打码 |
| Info 列里的域名 | 内部域名换成example.com |
| 协议树里的 Cookie | 打码 |
小技巧:文章里展示过滤器时,直接用192.0.2.10这种文档地址段,截图也就自动脱敏了。