3. 捕获过滤器语法与典型场景
捕获过滤器在抓包链路中的位置
捕获过滤器(Capture Filter,BPF 语法)工作在抓包引擎之前:网卡驱动把帧交给 libpcap/Wireshark 的 BPF 虚拟机,只有匹配表达式的帧才会被写入内存缓冲区并最终落盘。因此它决定的是"哪些包根本不会进入抓包文件",而不是"哪些包显示在列表里"。这一点直接决定了它对本例目标——缩小 pcap 体积——的有效性。
四类核心原语与写法
捕获过滤器只认 BPF 原语,不认 Wireshark 显示过滤器的字段名(如 ip.addr、tcp.port 在捕获过滤器中无效)。常用四类原语如下:
| 原语 | 匹配层次 | 典型写法 | 说明 |
|---|---|---|---|
host | IP 层 | host 192.168.1.20 | 源或目的 IP 任一为该地址即匹配 |
net | IP 层 | net 192.168.1.0/24 | 按网段匹配,CIDR 或掩码写法均可 |
port | 传输层 | port 53、tcp port 443 | 可加 tcp/udp 限定协议 |
ether host | 数据链路层 | ether host 00:1a:2b:3c:4d:5e | 按 MAC 匹配,用于二层定位 |
方向限定符 src / dst 可加在 host、net、port 前,例如 src host 192.168.1.20 只匹配源地址为该 IP 的帧。逻辑组合用 and、or、not,优先级为 not > and > or,需要改变结合顺序时用括号。
捕获过滤器一旦写错,可能把目标流量整体排除,且无法在事后恢复——被丢弃的帧不会进入 pcap。因此建议先用宽松表达式抓一小段,确认目标流量确实存在,再收紧表达式正式抓包。
实操:用 host 与 port 限定范围并对比文件
下面以一台本机(示例 IP 192.168.1.20)访问 HTTPS 服务为例,演示过滤前后差异。示例参数均为教学假设值,实际 IP、端口请按你的环境替换。
- 确认目标主机与端口:
ipconfig(Windows)或ip addr(Linux)查看本机 IP,浏览器访问一个 HTTPS 站点,确认目标端口为 443。 - 第一次抓包:选择正确网卡,捕获过滤器留空,抓 30 秒后停止,保存为
no_filter.pcapng。 - 第二次抓包:同一网卡,捕获过滤器填入
host 192.168.1.20 and tcp port 443,同样抓 30 秒,保存为host_port.pcapng。 - 对比两个文件:在文件管理器中查看大小,或在 Wireshark 中打开后看状态栏的包数量。
# Linux 下用 capinfos 快速对比两个抓包文件
capinfos -c -s no_filter.pcapng
capinfos -c -s host_port.pcapng
# 输出示例(教学假设值):
# no_filter.pcapng : 包数 18432, 文件大小 12.4 MB
# host_port.pcapng : 包数 1265, 文件大小 0.9 MB
预期现象:host_port.pcapng 的包数与体积应显著小于 no_filter.pcapng,且其中只包含 192.168.1.20 与 443 端口之间的 TCP 会话(含握手、TLS 记录、FIN/RST)。若过滤后包数为 0,说明表达式与真实流量不匹配,需检查 IP 是否写错、端口是否被 NAT 改写、或目标流量走的是 IPv6。
典型场景表达式速查
| 场景 | 捕获过滤器 | 要点 |
|---|---|---|
| 只看某台主机全部流量 | host 192.168.1.20 | 双向匹配,最常用 |
| 只看某主机发出的流量 | src host 192.168.1.20 | 排除回程噪声 |
| 只看某网段 | net 192.168.1.0/24 | 适合排查整个子网 |
| 只看 DNS 查询 | udp port 53 | DNS 走 UDP,TCP 53 用于区域传送 |
| 只看某主机 HTTPS | host 192.168.1.20 and tcp port 443 | and 组合缩小范围 |
| 排除某主机 | not host 192.168.1.20 | 用于屏蔽已知干扰源 |
| 按 MAC 定位二层设备 | ether host 00:1a:2b:3c:4d:5e | IP 未配置或 ARP 场景 |
| 排除广播与组播 | not broadcast and not multicast | 减少 ARP、mDNS 噪声 |
捕获过滤器与显示过滤器是两道独立的闸门:捕获过滤器决定"抓什么",显示过滤器决定"看什么"。先用捕获过滤器把范围压到目标主机/端口,再用显示过滤器在已抓到的数据里做精细筛选,是体积与灵活性兼顾的常规做法。
常见错误与排查
- 把显示过滤器语法写进捕获过滤器:
ip.addr == 192.168.1.20在捕获过滤器中会报语法错误,应改为host 192.168.1.20。 - 端口被 NAT 改写:内网访问外网时,抓包点若在 NAT 之后,看到的端口可能已不是原始端口,需按实际抓包位置调整表达式。
- IPv6 流量被漏掉:
host 192.168.1.20只匹配 IPv4,若目标走 IPv6,需改用ip6 host或对应地址。 - 过滤器过严导致零包:先用
host <目标IP>单独验证,再逐步叠加and tcp port 443,定位是哪一段条件把流量排除了。