第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中的位置和作用:

抓包过滤器知识体系 抓包过滤器知识体系 BPF 抓包过滤器 协议匹配 方向限定 条件值 ip / ip6 tcp / udp icmp / arp vlan / stp src dst host net port portrange len broadcast 逻辑组合:and / or / not 实战示例:ip src 192.168.1.0/24 and tcp dst port 80 协议匹配 → 方向限定 → 条件值 → 逻辑组合

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语法,你就能精准地「命中」你想要的流量,而不是在茫茫包海里大海捞针。

记住三个核心:协议、方向、条件。再复杂的表达式,都是这三者的组合。多写、多试、多编译验证,慢慢就熟练了。