第4章 抓包过滤器:从BPF语法到实战应用
抓包过滤器这东西,说白了就是给Wireshark装上一双「眼睛」。你想看什么流量,它就给你看什么流量。我刚入行那会儿,在机房抓包,一开就是几万条数据包,眼睛都看花了。后来才明白——不会用过滤器,等于不会用Wireshark。
这一章,我带你彻底搞懂抓包过滤器的语法、BPF表达式,以及最常见的几种过滤场景。嗯,内容有点干,但都是硬货。
核心观点:抓包过滤器在数据包进入Wireshark之前就生效了。它直接告诉网卡:「我只收这些包,其他的别进来。」这和显示过滤器完全不同——显示过滤器是抓完再筛,抓包过滤器是抓之前就筛。
4.1 抓包过滤器的语法基础
Wireshark的抓包过滤器,底层用的是BPF(Berkeley Packet Filter)语法。BPF最早是BSD系统上的东西,后来成了事实标准。几乎所有抓包工具都支持它——tcpdump、tshark、Wireshark,底层都是同一套规则。
BPF表达式的核心结构,其实就三部分:
- 协议:你要抓什么协议?比如
ip、tcp、udp、arp - 方向:数据流向哪里?比如
src、dst、src or dst - 条件:具体的匹配值,比如IP地址、端口号
组合起来就是:协议 方向 条件
举个例子:
ip src 192.168.1.1
这条表达式的意思是:只抓取源IP为192.168.1.1的IP数据包。
你可能会问:「为什么前面要加个 ip?」因为BPF是分层匹配的。先匹配协议层,再匹配具体字段。如果不写协议,BPF不知道你要在哪个层级上做匹配。
我的小习惯:写过滤器时,我永远先写协议关键字。哪怕你觉得「这肯定是IP包」,也加上 ip。为什么?因为有些包可能是ARP、IPv6,不加协议关键字,BPF会默认在所有协议里搜,效率反而低。
4.2 BPF表达式详解
BPF表达式支持的操作符,其实不多。我列个表,你一看就明白:
| 操作符 | 含义 | 示例 |
|---|---|---|
and / && |
逻辑与 | ip and tcp |
or / || |
逻辑或 | ip or arp |
not / ! |
逻辑非 | not arp |
src |
源地址/端口 | src 10.0.0.1 |
dst |
目的地址/端口 | dst port 80 |
host |
主机(源或目的) | host 192.168.1.1 |
net |
网段 | net 192.168.0.0/16 |
port |
端口 | port 443 |
portrange |
端口范围 | portrange 8000-9000 |
len |
数据包长度 | len > 100 |
broadcast |
广播包 | broadcast |
multicast |
组播包 | multicast |
这些操作符可以自由组合。比如:
ip src 192.168.1.0/24 and tcp dst port 80
这条表达式的意思是:抓取源IP在192.168.1.0/24网段内,且目的端口是80的TCP数据包。
我曾经踩过的坑:BPF表达式里,and 和 or 的优先级容易搞混。比如 ip src 10.0.0.1 or 10.0.0.2 这条,你以为匹配两个IP,实际上BPF会解析成 (ip src 10.0.0.1) or (10.0.0.2)——第二个条件没有协议限定,结果可能不是你想要的。正确写法是:ip src 10.0.0.1 or ip src 10.0.0.2。记住:每个条件都要写完整。
4.3 常见抓包过滤器示例
下面我按场景分类,给你列一些最常用的过滤器。这些我在项目里反复用,你直接复制就能用。
4.3.1 IP过滤
IP过滤是最基础的需求。你想看某个IP的流量,或者排除某个IP的流量,用下面这些:
- 抓取特定主机所有流量:
host 192.168.1.100 - 抓取源IP:
src host 10.0.0.5 - 抓取目的IP:
dst host 172.16.0.1 - 抓取整个网段:
net 192.168.0.0/24 - 排除某个IP:
not host 192.168.1.1 - 抓取两个主机之间的流量:
host 192.168.1.10 and host 192.168.1.20
我记得有一次排查内网ARP攻击,我直接用 not host 192.168.1.1 排除了网关,剩下的全是异常ARP包,问题一下就定位了。
4.3.2 端口过滤
端口过滤常用于分析特定服务。比如Web服务、数据库服务:
- 抓取HTTP流量:
tcp port 80 - 抓取HTTPS流量:
tcp port 443 - 抓取DNS流量:
udp port 53 - 抓取SSH流量:
tcp port 22 - 抓取MySQL流量:
tcp port 3306 - 抓取端口范围:
tcp portrange 8000-9000 - 抓取源端口:
src port 8080 - 抓取目的端口:
dst port 443
我建议:如果你不确定服务跑在哪个端口,先用 tcp portrange 1-65535 抓一小段时间,然后看Wireshark的统计功能。别一上来就全量抓,数据量太大,你分析不过来。
4.3.3 协议过滤
协议过滤直接指定你要抓哪类协议。Wireshark支持的协议关键字很多,我列几个最常用的:
| 协议关键字 | 说明 | 示例 |
|---|---|---|
ip |
IPv4数据包 | ip |
ip6 |
IPv6数据包 | ip6 |
tcp |
TCP数据包 | tcp |
udp |
UDP数据包 | udp |
icmp |
ICMP数据包(ping) | icmp |
arp |
ARP数据包 | arp |
vlan |
VLAN标记包 | vlan |
pppoe |
PPPoE数据包 | pppoe |
stp |
生成树协议 | stp |
ether |
以太网帧 | ether |
组合使用效果更好:
icmp and host 8.8.8.8
tcp and port 443 and not host 192.168.1.1
arp and not broadcast
第一条:只抓取和8.8.8.8之间的ping包。第二条:抓取HTTPS流量,但排除来自192.168.1.1的。第三条:抓取ARP包,但排除广播包——这在分析ARP攻击时特别有用。
4.4 抓包过滤器知识体系
下面这张图,我把本章的核心知识点串起来了。你一看就能明白BPF过滤器在Wireshark中的位置和作用:
4.5 实战技巧与避坑指南
光知道语法还不够,我分享几个实战中总结出来的经验:
技巧1:先测试再正式抓包
在Wireshark的抓包过滤器输入框里,输入表达式后,旁边有个「编译」按钮。点一下,如果显示绿色「OK」,说明语法正确。如果报红,说明写错了。我每次写复杂表达式,都会先点一下编译,确认无误再开始抓包。
技巧2:用tcpdump验证过滤器
有时候Wireshark的过滤器界面不太方便调试。我习惯先在命令行用tcpdump测试:tcpdump -i eth0 'ip src 192.168.1.1 and tcp port 80' -c 10。确认能抓到想要的包,再复制到Wireshark里用。这样效率更高。
我曾经踩过的坑:BPF表达式对大小写敏感。所有关键字必须小写。比如 TCP 写成大写,Wireshark会报错。还有,and 和 or 前后要加空格,否则BPF解析器会当成一个单词处理。这些细节,不注意就会浪费你半小时。
技巧3:善用「not」排除干扰
在复杂的网络环境里,干扰流量往往比目标流量多。比如你要分析内网两台服务器之间的通信,但中间有大量广播包。这时候用 host 192.168.1.10 and host 192.168.1.20 and not broadcast,直接排除广播,清净很多。
4.6 本章小结
抓包过滤器是Wireshark的第一道关卡。掌握BPF语法,你就能精准地「命中」你想要的流量,而不是在茫茫包海里大海捞针。
记住三个核心:协议、方向、条件。再复杂的表达式,都是这三者的组合。多写、多试、多编译验证,慢慢就熟练了。