4. 显示过滤器基础表达式实战
为什么显示过滤器是“定位”而不是“限制”
捕获过滤器在网卡驱动层丢弃不匹配的包,一旦丢弃就无法恢复;显示过滤器只作用于已捕获的数据帧,在 Wireshark 的显示层做匹配,不改变 pcap 内容。因此实战中推荐“宽捕获 + 精显示”:先用宽松条件把可疑流量全部抓下来,再用显示过滤器逐层缩小到目标会话。
显示过滤器由三部分组成:协议/字段名 + 比较运算符 + 值。本节聚焦最常用的四类基础表达式:ip.addr、tcp.port、http、dns。
四类基础表达式的语义与写法
| 表达式 | 匹配对象 | 典型写法 | 注意点 |
|---|---|---|---|
ip.addr | IPv4 源或目的地址 | ip.addr == 192.168.1.10 | 同时匹配 src 和 dst;只匹配单向用 ip.src/ip.dst |
tcp.port | TCP 源或目的端口 | tcp.port == 443 | 双向匹配;UDP 端口需用 udp.port |
http | 协议名(HTTP 解析器) | http | 只匹配被识别为 HTTP 的帧,不含 TLS 加密流量 |
dns | 协议名(DNS 解析器) | dns | 匹配查询与响应;可按 dns.qry.name 进一步限定域名 |
协议名过滤器(如
http、dns)本质是“该协议解析器是否成功解析此帧”,比手写端口更贴近协议语义,但依赖 Wireshark 的解析结果。从混杂流量到目标会话的定位路径
下面这张图展示同一份混杂 pcap 中,四类基础表达式各自“切”出的流量子集及其相互关系。可以看到 ip.addr 与 tcp.port 是字段级过滤,http 与 dns 是协议级过滤,二者可以叠加使用。
实战:从混杂 pcap 定位一次 HTTP 会话
假设已捕获一份包含 ARP、DNS、TCP 握手、HTTP、TLS 的 pcap,目标主机为 192.168.1.10,Web 服务器为 203.0.113.5。按以下顺序在显示过滤器栏输入表达式,观察包列表的变化:
- 输入
http,包列表只剩 HTTP 请求与响应,记录下请求的 Host 和 URI。 - 改为
ip.addr == 192.168.1.10,确认该主机参与的所有会话,包括 DNS 和 TLS。 - 叠加为
ip.addr == 192.168.1.10 && http,精确定位该主机的 HTTP 流量。 - 若 HTTP 走非 80 端口,用
tcp.port == 8080 && http验证端口与协议解析是否一致。
验证方法:在过滤结果中右键任意帧 → Follow → TCP Stream,若能还原出完整的 HTTP 请求行、请求头和响应体,说明过滤器定位正确;若 Follow 后出现乱码或 TLS 握手记录,说明该帧并非明文 HTTP,应改用
tls 或 tcp.port == 443 重新定位。常见误用与排查
- 用
ip.addr = 192.168.1.10(单等号):Wireshark 会报语法错误,比较运算符必须是==、!=、>等。 - 用
tcp.port == 53找 DNS:DNS 默认走 UDP 53,应使用udp.port == 53或直接dns;仅在响应过大触发 TCP 回退时才用 TCP 53。 - 用
http找 HTTPS:HTTPS 是 TLS 加密流量,HTTP 解析器无法识别,应使用tls或tcp.port == 443。 - 过滤器返回零结果:先清空过滤器确认包确实存在,再逐条添加条件;若
http无结果但tcp.port == 80有结果,说明该流量未被识别为 HTTP(可能是非标准端口或分片重组问题)。
显示过滤器区分大小写:协议名和字段名必须小写(
http、ip.addr),字符串值如 dns.qry.name == "example.com" 中的域名通常小写匹配。写错大小写不会报错,但会静默返回零结果。