4. 显示过滤器基础表达式实战

显示过滤器基础表达式实战 学习卡片

为什么显示过滤器是“定位”而不是“限制”

捕获过滤器在网卡驱动层丢弃不匹配的包,一旦丢弃就无法恢复;显示过滤器只作用于已捕获的数据帧,在 Wireshark 的显示层做匹配,不改变 pcap 内容。因此实战中推荐“宽捕获 + 精显示”:先用宽松条件把可疑流量全部抓下来,再用显示过滤器逐层缩小到目标会话。

显示过滤器由三部分组成:协议/字段名 + 比较运算符 + 值。本节聚焦最常用的四类基础表达式:ip.addr、tcp.port、http、dns。

四类基础表达式的语义与写法

表达式匹配对象典型写法注意点
ip.addrIPv4 源或目的地址ip.addr == 192.168.1.10同时匹配 src 和 dst;只匹配单向用 ip.src/ip.dst
tcp.portTCP 源或目的端口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(宽捕获结果) ARP · DNS · TCP 握手 · HTTP · TLS · 其他 UDP ip.addr == 192.168.1.10 匹配该 IP 的 所有收发帧(双向) tcp.port == 443 匹配 443 端口的 TCP 会话(双向) http 被 HTTP 解析器 识别的明文请求/响应 dns DNS 查询与响应 (UDP/TCP 53) 叠加使用:字段级 + 协议级 ip.addr == 192.168.1.10 && http → 只看该主机的 HTTP 会话 tcp.port == 53 || dns → 覆盖 DNS 的 TCP 回退场景 定位顺序建议:先协议名缩小范围(http / dns),再用 ip.addr 锁定主机,最后用 tcp.port 锁定会话 每次只加一个条件,观察包列表数量变化,避免一次叠加过多条件导致“零结果”难以排查

实战:从混杂 pcap 定位一次 HTTP 会话

假设已捕获一份包含 ARP、DNS、TCP 握手、HTTP、TLS 的 pcap,目标主机为 192.168.1.10,Web 服务器为 203.0.113.5。按以下顺序在显示过滤器栏输入表达式,观察包列表的变化:

  1. 输入 http,包列表只剩 HTTP 请求与响应,记录下请求的 Host 和 URI。
  2. 改为 ip.addr == 192.168.1.10,确认该主机参与的所有会话,包括 DNS 和 TLS。
  3. 叠加为 ip.addr == 192.168.1.10 && http,精确定位该主机的 HTTP 流量。
  4. 若 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" 中的域名通常小写匹配。写错大小写不会报错,但会静默返回零结果。