1 实时流量洞察
注意! 1、该功能目前仅支持节点对象之间互联接口∗∗出/OUT∗∗**出/OUT**∗∗出/OUT∗**∗**方向的流量,并且不支持网络对象(例如cloud 0-9,nat等类型,network对象没有接口)
2、如果创建了包含错误表达式的过滤器,需要删除过滤器重新添加才行,直接修改表达式无效
1.1 介绍
该功能可以直接高亮显示出流量经过的链路路径,相对于在接口抓包而言更加直观。
- 使用BPF PCAP捕获报文(支持捕获过滤器表达式,不支持wireshark显示过滤器表达式,不支持linux shell 过滤条件);需要通过BPF PCAP filters来问AI想要捕获报文的过滤表达式
- 支持自定义不同过滤器颜色;
- 支持统计链路两端节点出方向的数据包数量;
| 特性 |
捕获过滤器 (Capture Filter) |
显示过滤器 (Display Filter) |
| 工作阶段 |
抓包时(数据进入前) |
分析时(数据已捕获后) |
| 处理位置 |
内核层/驱动层 (libpcap/BPF) |
应用层 (Wireshark) |
| 语法引擎 |
**BPF (Berkeley Packet Filter)**语法 |
Wireshark 专用语法 |
| 执行速度 |
极快(内核过滤) |
较慢(应用层解析后过滤) |
| 资源影响 |
减少内存/CPU使用(丢弃无关数据) |
不影响已保存文件大小 |
| 灵活性 |
有限(只能基于头部信息) |
强大(可解析所有字段) |
| 可用字段 |
主要基于协议头部固定偏移 |
所有解析出的协议字段 |
| 修改结果 |
永久影响(未捕获的数据永远丢失) |
临时影响(可随时更改) |
捕获/显示过滤器区别详情右键新标签页打开
| 过滤需求 |
捕获过滤器 (BPF) |
显示过滤器 (Wireshark) |
| HTTP 流量 |
tcp port 80 |
http或 tcp.port == 80 |
| 来自 192.168.1.1 |
src host 192.168.1.1 |
ip.src == 192.168.1.1 |
| ARP 请求 |
arp[6:2] = 1 |
arp.opcode == 1 |
| TCP SYN 包 |
tcp[13] & 2 != 0 |
tcp.flags.syn == 1 |
| 数据包长度 > 1000 |
greater 1000 |
frame.len > 1000 |
| DNS 响应 |
(无法区分) |
dns.flags.response == 1 |
| HTTP 404 错误 |
(无法实现) |
http.response.code == 404 |
1.2 使用方法
1.2.1 进入实验后,在侧边栏点击流量过滤器

1.2.2 新建过滤表达式

1.2.3 填写表达式

1.2.4 效果演示
下面视频为使用流量过滤器在链路上显示icmp流量的演示(过滤表达式:icmp,显示颜色:红色,显示时间:500ms)
2 逻辑运算符
- and:所有的条件都需要满足
- or:只要有一个条件满足就可以
- not:取反
支持 > < = >= <= && || !
2.1 协议筛选
- icmp:
icmp
- tcp:
tcp
- udp:
udp
- http:
port 80
- dns:
port 53
3 二层协议
3.1 以太网帧格式
https://www.wolai.com/qWQNMAp3AmtuKmj2ewpKgq
3.2 802.1Q VLAN
https://www.wolai.com/wt6rEFtqwF8rg8yiopnfEN
3.3 802.1ad (Q-IN-Q)
https://www.wolai.com/cT1DrYqbMCDC2yiEyXpvrn
3.4 PVLAN
https://www.wolai.com/mLD9W1b94HtB4Nj4YkgAQh
3.5 LACP
https://www.wolai.com/w3J83APT18pX6g8LGfLYKh
3.6 PAgP
https://www.wolai.com/jpK2gZVuyVJfRzmfMcLYRi
3.7 华为Eth-Trunk
https://www.wolai.com/7qGTeq8bK6yFQZCbTY4dL6
3.8 STP
https://www.wolai.com/mVf61ZDi3mNuMziGF1SUvC
3.9 RSTP
https://www.wolai.com/6EcBrCa1k9EFejxneRBZTB
3.10 MSTP
https://www.wolai.com/bLsX23CVAHFdMJjVAKdXG
3.11 L2TP
https://www.wolai.com/ngyFSdwwyEDcb5g93MRkW
3.12 思科PVST/PVST+/Rapid-PVST+
https://www.wolai.com/vw829W6YYHgRGViqYax3Bt
3.13 PPPOE
https://www.wolai.com/i23dUQ2b8bNr5a1XyGi6sJ
3.14 DOT1X
https://www.wolai.com/bWpzB7AN6TvJW7XKF9zRcH
3.15 LLDP
https://www.wolai.com/nyovvgVoHdzRLYaGRKQpbE
3.16 CDP
https://www.wolai.com/jMq2gnLubteuFmr3fYRers
3.17 MPLS
https://www.wolai.com/sAZYt3f68dM6LjEoyayW8Y
3.18 SRV6二层应用
https://www.wolai.com/pPoU9KWNcBZLsXveDQoQyL
3.19 M-LAG
https://www.wolai.com/hNCk2S7QoZKkqPUTQkqjuG
4 三层协议
4.1 IPv4
4.2 IPV6
4.3 NAT
4.4 ARP
4.5 RARP
4.6 Proxy ARP
4.7 GARP
4.8 NDP(IPv6)
4.9 路由协议
4.10 隧道协议
4.11 QOS
4.12 ICMP/ICMPV6
4.13 VRRP/HSRP/GLBP
4.14 BFD
4.15 DHCP/DHCPv6
5 四层协议
5.1 TCP
5.2 UDP
5.3 TLS/SSL
5.4 DTLS
6 应用层协议
6.1 HTTP
| 表达式语法 |
筛选内容 |
验证 |
tcp port 80 |
http协议 |
|
80 and tcp[((tcp[12]&0xf0)>>2)+8:4] = 0x20XXYYZZ |
http 200响应 |
|
tcp port 80 and tcp[((tcp[12]&0xf0)>>2)+8:4] = 0x20343034 |
http 404响应 |
|
tcp port 80 and tcp[((tcp[12]&0xf0)>>2)+8:4] = 0x20353032 |
http 502 响应 |
|
tcp port 80 and tcp[((tcp[12]&0xf0)>>2):4] = 0x47455420 |
http GET请求 |
|
tcp port 80 and tcp[((tcp[12]&0xf0)>>2):4] = 0x504f5354 |
http POST请求 |
|
更多内容请参考:
https://www.wolai.com/8R78KkgziNE1nrXuevyhYr
7 ICMP
右键新标签页打开查看协议详情
- 请求包筛选:
icmp[0] == 8
- 应答包筛选:
icmp[0] == 0
8 思科私有二层协议
**右键新标签页打开查看协议详情 **
| 协议 (Protocol) |
协议全称 |
SNAP PID |
捕获过滤器语法 (Capture Filter Syntax) |
验证 |
| CDP |
Cisco Discovery Protocol |
0x2000 |
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x2000 |
|
| VTP |
VLAN Trunking Protocol |
0x2003 |
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x2003 |
|
| DTP |
Dynamic Trunking Protocol |
0x2004 |
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x2004 |
|
| PAgP |
Port Aggregation Protocol |
0x0104 |
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x0104 |
|
| UDLD |
Unidirectional Link Detection |
0x0111 |
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x0111 |
|
| ISL |
Inter-Switch Link |
|
ether dst 01:00:0c:00:00:00 |
|
9 HOST
| 表达式语法 |
使用条件 |
验证 |
dst host <主机> |
数据包的目的IP是 <主机>,它可以是IP地址或主机名 |
|
src host <主机> |
数据包的源IP是 <主机> |
|
host <主机> |
数据包的源或目的IP是 <主机> |
|
以上任何主机表达式前均可加上关键字 ip、arp、rarp 或 ip6,例如 ip host <主机>,这等同于 ether proto \ip and host <主机>。如果 <主机> 是一个对应多个 IP 地址的名称,则会检查每个地址是否匹配。
10 DHCP
| 类型 |
表达式语法 |
验证 |
| dhcp discover |
udp[247:4] = 0x63350101 |
|
| dhcp offer |
udp[247:4] = 0x63350102 |
|
| dhcp request |
udp[247:4] = 0x63350103 |
|
| dhcp ack |
udp[247:4] = 0x63350105 |
|
11 网络与掩码(Net & Mask)
| 语法 |
条件 |
验证 |
dst net <网络> |
数据包的 IPv4/v6 目的地址的网络号为 <网络> |
|
src net <网络> |
数据包的 IPv4/v6 源地址的网络号为 <网络> |
|
net <网络> |
数据包的 IPv4/v6 源地址或目的地址的网络号为 <网络> |
|
net <网络>mask <掩码> |
IPv4 地址匹配指定 <网络>和 <掩码>。可以用 src或 dst修饰。注意此语法对 IPv6 网络无效 |
|
net <网络>/<长度> |
IPv4/v6 地址匹配 <网络>及其 <长度>位宽的掩码。可以用 src或 dst修饰 |
|
<网络> 可以来自配置文件(如 /etc/networks 等)中的名称,也可以是一个网络号。
IPv4 网络号可以按照下表网络号写,则会自动对应指定掩码
| 网络号 |
掩码 |
| 192.168.1.1 |
255.255.255.255 |
| 192.168.1 |
255.255.255.0 |
| 192.168 |
255.255.0.0 |
| 192 |
255.0.0.0 |
对于 IPv6 地址,网络只能通过使用网络号和掩码长度来定义。例如,过滤器 net fe80:1234:5678:9abc:0000:0000:0000:0000/64将包含所有 IPv6 地址在以下范围内的流量:fe80:1234:5678:9abc:0000:0000:0000:0000 - fe80:1234:5678:9abc:ffff:ffff:ffff:ffff。
12 PORT
| 语法 |
条件 |
验证 |
dst port <端口> |
数据包的目的端口值为 <端口> |
|
src port <端口> |
数据包的源端口值为 <端口> |
|
port <端口> |
数据包的源端口或目的端口值为 <端口> |
|
dst portrange <端口1>-<端口2> |
数据包的目的端口值在 <端口1>到 <端口2>之间 |
|
src portrange <端口1>-<端口2> |
数据包的源端口值在 <端口1>到 <端口2>之间 |
|
portrange <端口1>-<端口2> |
数据包的源端口或目的端口值在 <端口1>到 <端口2>之间 |
|
当数据包是 IPv4/IPv6 TCP、IPv4/IPv6 UDP 或 IPv4/IPv6 SCTP(在某些系统中)且具有指定的目的端口值时,条件为真。
<端口> 可以是一个数字,也可以是 /etc/services 文件中使用的名称。
如果使用名称,则会同时检查端口号和协议,如果使用数字或含义不明确的名称,则只检查端口号(例如,dst port 513 将匹配 TCP/login 流量和 UDP/who 流量;port domain 将匹配 TCP 53和 UDP 53 流量)。
以上任何端口或端口范围表达式前均可加上关键字 tcp 或 udp。例如,tcp src port <端口> 仅匹配源端口为 <端口> 的 TCP 数据包。
13 应用层协议
13.1 HTTP
13.2 BPF应用层协议过滤Cookbook (EVE-NG Pro 专用)
13.2.1 核心原理复习
- 端口过滤是基础:先用端口号把范围缩小,例如
tcp port 80。
- TCP载荷定位是关键:由于TCP头长度可变,我们用
tcp[((tcp[12] & 0xf0) >> 2):4] 这段“咒语”来动态定位TCP载荷的起始位置,然后从中读取数据。
- UDP载荷定位很简单:UDP头固定是8字节,所以载荷从第8个字节开始(
udp[8])。
13.2.2 案例大全
13.2.2.1 Web & 核心服务
| 协议 |
过滤目标 |
BPF 捕获过滤器语法 |
验证 |
| HTTP |
GET 请求 |
tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420) |
|
| HTTP |
POST 请求 |
tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x504f5354) |
|
| DNS |
DNS 查询 (Query) |
udp port 53 and (udp[10] & 0x80) = 0 |
|
| DNS |
DNS 响应 (Response) |
udp port 53 and (udp[10] & 0x80) != 0 |
|
13.2.2.2 邮件服务
| 协议 |
过滤目标 |
BPF 捕获过滤器语法 |
验证 |
| SMTP |
HELO/EHLO握手 |
tcp port 25 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x48454c4f or tcp[((tcp[12] & 0xf0) >> 2):4] = 0x45484c4f) |
|
| POP3 |
USER用户名命令 |
tcp port 110 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x55534552) |
|
| IMAP |
LOGIN登录命令 |
tcp port 143 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x4c4f47494e) |
|
13.2.2.3 文件传输与共享
| 协议 |
过滤目标 |
BPF 捕获过滤器语法 |
验证 |
| FTP |
USER用户名命令 |
tcp port 21 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x55534552) |
|
| FTP |
PASS密码命令 |
tcp port 21 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x50415353) |
|
| SMB/CIFS |
SMB 协议头 |
tcp port 445 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0xff534d42) |
|
13.2.2.4 远程管理
| 协议 |
过滤目标 |
BPF 捕获过滤器语法 |
验证 |
| SSH |
初始版本协商 (SSH-) |
tcp port 22 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x5353482d) |
|
| Telnet |
包含 login:提示 |
tcp port 23 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x6c6f6769) |
|
| RDP |
初始连接请求 |
tcp port 3389 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x03000013 |
|
13.2.2.5 目录与时间服务
| 协议 |
过滤目标 |
BPF 捕获过滤器语法 |
验证 |
| NTP |
客户端请求 (Mode 3) |
udp port 123 and (udp[8] & 0x07) = 3 |
|
| LDAP |
任何LDAP消息 (ASN.1 SEQUENCE) |
tcp port 389 and (tcp[((tcp[12] & 0xf0) >> 2):1] = 0x30) |
|
13.2.2.6 VoIP & 流媒体
| 协议 |
过滤目标 |
BPF 捕获过滤器语法 |
验证 |
| SIP |
INVITE呼叫请求 |
udp port 5060 and (udp[8:4] = 0x494e5649) |
|
| RTP |
识别RTP报文 (Version 2) |
udp and (udp[8] & 0xc0) = 0x80 |
|
| 协议 (Protocol) |
过滤目标 (Filtering Goal) |
BPF 捕获过滤器语法 (Capture Filter Syntax) |
验证 |
| HTTP |
过滤所有GET请求 |
tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420) |
|
| HTTP |
过滤所有POST请求 |
tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x504f5354) |
|
| DNS |
只过滤查询报文 (Query) |
udp port 53 and (udp[10] & 0x80) = 0 |
|
| DNS |
只过滤响应报文 (Response) |
udp port 53 and (udp[10] & 0x80) != 0 |
|
| NTP |
只过滤客户端请求 |
udp port 123 and (udp[8] & 0x07) = 3 |
|
| NTP |
只过滤服务器响应 |
udp port 123 and (udp[8] & 0x07) = 4 |
|
| SSH |
过滤初始协议版本协商报文 |
tcp port 22 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x5353482d) |
|
| FTP |
过滤USER用户名命令 |
tcp port 21 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x55534552) |
|
| FTP |
过滤PASS密码命令 |
tcp port 21 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x50415353) |
|
| DHCP |
过滤DHCPDISCOVER报文 |
udp port 67 and udp[240:3] = 0x350101 |
|
| DHCP |
过滤DHCPOFFER报文 |
udp port 68 and udp[240:3] = 0x350102 |
|
| DHCP |
过滤DHCPREQUEST报文 |
udp port 67 and udp[240:3] = 0x350103 |
|
| DHCP |
过滤DHCPACK报文 |
udp port 68 and udp[240:3] = 0x350105 |
|
13.2.3 重要说明与注意事项
- 十六进制转换:上面用到的
0x... 值都是目标字符串的ASCII十六进制表示。比如 GET (注意后面有个空格) 对应的就是 47 45 54 20。
- 加密流量无效:对于像HTTPS, SSH(协商后)这类加密的协议,你用这种方法是看不到任何明文内容的,顶多能抓个协议握手。
- 脆弱性:这种基于固定偏移量和内容的过滤方法非常脆弱。只要协议有一点点变化,或者报文里多了个选项,就可能导致过滤失效。
- DHCP偏移量:上面DHCP的例子
udp[240:3] 是基于标准DHCP报文结构计算的(UDP载荷的第240字节开始是DHCP选项)。如果你遇到的环境有特殊封装,这个偏移量可能需要调整(就像我们之前讨论的那样)。
14 路由协议
14.1 OSPF
14.1.1 OSPFv2 报文类型过滤 (IPv4)
| 标题 (Title) |
颜色 (Color) |
过滤表达式 (Filter Expression) |
验证 |
| OSPFv2 - ALL |
(自定义) |
ip proto 89 |
|
| OSPFv2 - Hello |
(自定义) |
ip proto 89 and ip[21] == 1 |
|
| OSPFv2 - DBD |
(自定义) |
ip proto 89 and ip[21] == 2 |
|
| OSPFv2 - LSR |
(自定义) |
ip proto 89 and ip[21] == 3 |
|
| OSPFv2 - LSU |
(自定义) |
ip proto 89 and ip[21] == 4 |
|
| OSPFv2 - LSAck |
(自定义) |
ip proto 89 and ip[21] == 5 |
|
| OSPFv2 - Multicast |
(自定义) |
ip host 224.0.0.5 or ip host 224.0.0.6 |
|
14.1.2 OSPFv3 报文类型过滤 (IPv6)
OSPFv3是跑在IPv6上的,IPv6头部是固定的40字节,所以偏移量也很好算。
| 标题 (Title) |
颜色 (Color) |
过滤表达式 (Filter Expression) |
验证 |
| OSPFv3 - ALL |
(自定义) |
ip6 proto 89 |
|
| OSPFv3 - Hello |
(自定义) |
ip6 proto 89 and ip6[41] == 1 |
|
| OSPFv3 - DBD |
(自定义) |
ip6 proto 89 and ip6[41] == 2 |
|
| OSPFv3 - LSR |
(自定义) |
ip6 proto 89 and ip6[41] == 3 |
|
| OSPFv3 - LSU |
(自定义) |
ip6 proto 89 and ip6[41] == 4 |
|
| OSPFv3 - LSAck |
(自定义) |
ip6 proto 89 and ip6[41] == 5 |
|
| OSPFv3 - Multicast |
(自定义) |
ip6 host ff02::5 or ip6 host ff02::6 |
|
14.1.3 进阶:OSPF LSA 类型过滤
如果你想看得更细,比如只想看特定类型的LSA(LSA是装在LSU报文里的),也可以做到。这对于分析复杂的路由问题特别有用。
(LSA Type的偏移量计算:IP头20字节 + OSPF头24字节 + LSU头4字节 + LSA头内部偏移3字节 = 51)
| 标题 (Title) |
颜色 (Color) |
过滤表达式 (Filter Expression) |
验证 |
| LSA - Type 1 (Router) |
(自定义) |
ip proto 89 and ip[21] == 4 and ip[51] == 1 |
|
| LSA - Type 2 (Network) |
(自定义) |
ip proto 89 and ip[21] == 4 and ip[51] == 2 |
|
| LSA - Type 3 (Summary) |
(自定义) |
ip proto 89 and ip[21] == 4 and ip[51] == 3 |
|
| LSA - Type 5 (External) |
(自定义) |
ip proto 89 and ip[21] == 4 and ip[51] == 5 |
|
| LSA - Type 7 (NSSA) |
(自定义) |
ip proto 89 and ip[21] == 4 and ip[51] == 7 |
|
15 举例
15.1 筛选访问指定1.1.1.1 8080端口的流量
这里不指定源或目的ip而是直接使用host关键字,这样才能抓取完整会话流量。
tcp port 8080 and host 1.1.1.1
15.1.1 过滤访问223.5.5.5 DNS的流量
host 223.5.5.5 and port 53
16 BPF过滤能力清单
16.1 BPF 直接过滤能力清单 (分层详解)
16.1.1 第二层:数据链路层 (Layer 2)
这是BPF的起点,它对以太网帧头了如指掌。
| 协议/字段 |
BPF 捕获过滤器原语/语法 |
举例 |
验证 |
| 以太网 MAC 地址 |
ether src,ether dst,ether host |
ether host 00:11:22:33:44:55 |
|
| 以太网 协议类型 |
ether proto <protocol> |
ether proto arp(或 arp) |
|
| VLAN (802.1Q) |
vlan [vlan_id] |
vlan 100(匹配单层VLAN 100) |
|
| QinQ (802.1ad) |
vlan [outer_id] and vlan [inner_id] |
vlan 100 and vlan 20(匹配外100内20) |
|
| ARP/RARP |
arp,rarp |
arp and host 192.168.1.1 |
|
16.1.1.1 第三层:网络层 (Layer 3)
这是BPF最强大的主场,几乎IP头里的所有东西都能被直接或间接地过滤。
| 协议/字段 |
BPF 捕获过滤器原语/语法 |
举例 |
验证 |
| IP 地址 |
src,dst,host,net |
host 8.8.8.8或 net 192.168.0.0/16 |
|
| IP 协议号 |
proto <protocol>或 ip proto <protocol> |
ip proto 89(OSPF),ip proto 88(EIGRP) |
|
| ICMP |
icmp,icmp6 |
icmp(匹配所有ICMPv4) |
|
| IGMP |
igmp |
igmp(匹配所有IGMP) |
|
| IP 广播/组播 |
broadcast,multicast |
ip broadcast(匹配所有IP广播) |
|
| IP头长度/TTL等 |
ip[offset](字节偏移量) |
ip[8] < 10(过滤TTL小于10的包) |
|
16.1.1.2 第四层:传输层 (Layer 4)
BPF对TCP和UDP的头部也非常熟悉。
| 协议/字段 |
BPF 捕获过滤器原语/语法 |
举例 |
验证 |
| TCP/UDP 端口 |
src port,dst port,port,portrange |
tcp port 80或 udp portrange 1000-2000 |
|
| TCP 标志位 |
tcp[tcpflags](位掩码) |
tcp[tcpflags] & tcp-syn != 0(过滤SYN包) |
|
| TCP 标志位组合 |
tcp[tcpflags](位掩码) |
`tcp[tcpflags] & (tcp-syn |
tcp-ack) = (tcp-syn |
16.1.2 核心原理:为什么二三四层这么容易?
答案很简单:因为这些层的协议头部格式是固定的、标准化的。
- BPF引擎就像一个流水线上的质检员,它手里有一张“图纸”(协议规范),清楚地知道一个以太网帧的第0-5字节是目的MAC,第6-11字节是源MAC,第12-13字节是协议类型...
- 对于IP头、TCP头、UDP头也是同理。每个字段(如IP地址、端口号、协议号)在头部里的位置(偏移量)都是固定的。
- 所以,BPF可以以极高的效率,直接去“摸”特定位置的字节,然后跟你给的条件进行比较。这就是它为什么快,为什么天生就适合干这个。
而我们之前讨论的应用层协议(HTTP、DNS等),它们的内容位于TCP/UDP的**载荷(Payload)**里,这个载荷的结构是多变的、长度不定的,所以BPF这个“质检员”就很难直接找到它想要的东西,必须用各种“黑魔法”去猜位置。
总结一下:
基本上,只要一个协议的信息是明确地、固定地写在二、三、四层头部里的,BPF就能用它内置的“原语”(比如 host, port, vlan)或者简单的字节偏移量直接过滤。这覆盖了绝大多数网络基础协议。
17 BPF Pcap 过滤常见报文
17.1 一、二层(数据链路层)过滤条件
| 过滤场景 |
BPF过滤条件 |
验证 |
| 所有ARP包 |
arp |
|
| 仅ARP请求 |
arp and arp[6:2] == 1 |
|
| 仅ARP响应 |
arp and arp[6:2] == 2 |
|
| 源MAC为指定值 |
ether src 00:11:22:33:44:55 |
|
| 目的MAC为指定值 |
ether dst 00:11:22:33:44:55 |
|
| 以太网广播包 |
ether dst ff:ff:ff:ff:ff:ff |
|
| 所有以太网多播包 |
ether[0] & 1 = 1 |
|
| VLAN ID为100的包 |
vlan 100 |
|
| 双层VLAN(外层100、内层200) |
vlan 100 and vlan 200 |
|
17.2 二、三层(网络层)过滤条件
| 过滤场景 |
BPF过滤条件 |
验证 |
| 所有IPv4包 |
ip |
|
| 所有IPv6包 |
ip6 |
|
| 源IP为指定地址 |
src host 192.168.1.1 |
|
| 目的IP为指定地址 |
dst host 192.168.1.1 |
|
| 源/目的IP为指定地址 |
host 192.168.1.1 |
|
| 源IP属于指定网段 |
src net 192.168.1.0/24 |
|
| 源/目的IP属于指定网段 |
net 192.168.1.0/24 |
|
| 所有ICMP包(IPv4) |
icmp |
|
| 仅ICMP ping请求 |
icmp and icmp[0] == 8 |
|
| 仅ICMP ping响应 |
icmp and icmp[0] == 0 |
|
| 所有ICMPv6包 |
icmp6 |
|
| 所有IP协议中的TCP包 |
ip proto 6(等价于 tcp) |
|
| 所有IP协议中的UDP包 |
ip proto 17(等价于 udp) |
|
17.3 三、四层(传输层)过滤条件
| 过滤场景 |
BPF过滤条件 |
验证 |
| 所有TCP包 |
tcp |
|
| 源TCP端口为80 |
tcp src port 80 |
|
| 目的TCP端口为80 |
tcp dst port 80 |
|
| 源/目的TCP端口为80 |
tcp port 80 |
|
| TCP端口范围1-1024 |
tcp portrange 1-1024 |
|
| 仅TCP SYN包 |
tcp[tcpflags] & tcp-syn != 0 |
|
| 仅TCP SYN+ACK包 |
tcp[tcpflags] & (tcp-syntcp-ack) == (tcp-syntcp-ack) |
|
| 仅TCP FIN包 |
tcp[tcpflags] & tcp-fin != 0 |
|
| 仅TCP RST包 |
tcp[tcpflags] & tcp-rst != 0 |
|
| 所有UDP包 |
udp |
|
| 源UDP端口为53 |
udp src port 53 |
|
| 目的UDP端口为53 |
udp dst port 53 |
|
| 源/目的UDP端口为53 |
udp port 53 |
|
| UDP数据长度>100字节 |
udp and udp[4:2] > 100 |
|
| 所有SCTP包 |
sctp |
|
| SCTP端口为3868 |
sctp port 3868 |
|
17.4 四、多层组合过滤条件(实战常用)
| 过滤场景 |
BPF过滤条件 |
验证 |
| 192.168.1.0/24网段的HTTP流量 |
ip net 192.168.1.0/24 and tcp port 80 |
|
| 非回环的ICMP ping请求 |
icmp and icmp[0] == 8 and not host 127.0.0.1 |
|
| VLAN 100中目的IP为10.0.0.1的DNS包 |
vlan 100 and ip dst 10.0.0.1 and udp port 53 |
|
| 排除SSH(22端口)的TCP流量 |
tcp and not tcp port 22 |
|
| 源IP为10.0.0.5且目的TCP端口为443 |
src host 10.0.0.5 and tcp dst port 443 |
|
17.4.1 到底用哪种表达式合适?
17.4.1.1 第一优先级:使用高级原语 (The High-Level Way)
这是最简单、最可读、也最高效的选择。只要你想过滤的东西,BPF有现成的关键字,就无脑用它。
- 适用场景: 过滤绝大多数二、三、四层协议。
- 举例:
host 192.168.1.1
net 192.168.0.0/16
tcp port 80
udp port 53
arp
vlan 100
ip proto 89 (OSPF)
17.4.1.2 第二优先级:使用字节偏移量“黑魔法” (The Low-Level Way)
只有当高级原语不好用或不存在时,才退而求其次,使用这种“手术刀”式的玩法。
- 适用场景:
- 过滤那些因为封装特殊导致高级原语失效的协议(典型案例:CDP, VTP, DTP等思科私有协议)。
- 过滤应用层协议的特定内容(比如HTTP方法、DNS查询类型等)。
- 举例:
- 过滤CDP:
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x2000
- 过滤HTTP POST:
tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x504f5354)
17.4.2 你的Cookbook终极版
| 协议/流量类型 |
推荐的EVE-NG Pro过滤表达式 |
理由 |
|
| IP/TCP/UDP |
host,net,port,proto |
使用最高效、最可读的标准原语。 |
|
| ARP/VLAN |
arp,vlan |
使用标准原语。 |
|
| OSPF/EIGRP |
ip proto 89,ip proto 88 |
使用协议号原语,一网打尽。 |
|
| CDP/VTP/DTP等 |
ether host ... and ether[offset:len] == ... |
标准原语 cdp不可靠,必须用MAC+字节偏移的组合拳。 |
|
| HTTP/DNS等应用层 |
tcp/udp port ... and (tcp/udp[offset:len] == ...) |
没有应用层原语,只能靠字节偏移的“黑魔法”去猜。 |
|
17.4.3 BPF/PCAP 常用原语大全 (The Greatest Hits)
| 类别 (Category) |
原语/关键字 (Primitive/Keyword) |
功能说明 (Function) |
详细举例 (Examples) |
| 主机/网络 (Host/Network) |
host,net,src,dst |
用于过滤IPv4或IPv6地址和网络。 |
host 8.8.8.8(源或目是8.8.8.8)net 192.168.1.0/24(在192.168.1.0/24网段内)src host 10.0.0.1(源是10.0.0.1)dst net 172.16.0.0 mask 255.240.0.0(目标是172.16.0.0/12) |
| 端口 (Port) |
port,portrange,src port,dst port |
用于过滤TCP或UDP端口。 |
port 80(源或目端口是80)src port 1025(源端口是1025)dst portrange 20-21(目的端口在20到21之间) |
| 协议 (Protocol) |
proto,ip,ip6,arp,rarp,tcp,udp,icmp,icmp6 |
用于按协议类型过滤。 |
ip proto 89(OSPFv2)tcp(等同于 ip proto 6)udp(等同于 ip proto 17)arp(过滤所有ARP报文) |
| 数据链路层 (Data Link) |
ether host,ether src,ether dst,vlan |
用于过滤MAC地址和VLAN标签。 |
ether host 00:11:22:aa:bb:cc(源或目MAC是...)ether dst ff:ff:ff:ff:ff:ff(以太网广播)vlan 100(匹配VLAN 100) |
| 广播/组播 (Broadcast/Multicast) |
broadcast,multicast |
用于过滤广播或组播地址。 |
ip broadcast(IP广播, x.x.x.255)ip multicast(IP组播, 224.0.0.0/4)ether broadcast(以太网广播, ff:ff:ff:ff:ff:ff) |
18 适用场景分析
18.1 适用场景 (Where it Shines ✨)
这个功能的核心价值在于实时、直观地可视化数据包的路径和类型。所以,它最擅长处理那些能被BPF语法清晰、无歧义地定义的流量。
18.1.1 1. 路由与路径验证 (它的核心价值)
- 场景举例: 你配置了复杂的策略路由(PBR)或负载均衡,想知道从PC1到服务器的流量到底走了ISP A还是ISP B。
- 怎么用: 创建一个过滤器
host <PC1_IP> and host <Server_IP>。然后从PC1去ping服务器,看彩色的线条出现在哪条物理链路上。这比在每个路由器上敲 traceroute要直观一万倍。
18.1.1.1 2. 协议学习与教学
- 场景举例: 一个新手想搞明白OSPF邻居关系是怎么建立的。
- 怎么用: 分别创建Hello, DBD, LSR, LSU, LSAck的过滤器,并设置成不同颜色。然后启动两台路由器,你就能在拓扑图上亲眼看到五颜六色的报文按照“Down -> Init -> 2-Way -> ExStart -> Exchange -> Loading -> Full”的顺序依次亮起,瞬间就懂了。
- Hello包过滤器:
ip proto 89 and ip[21] == 1
- DBD包过滤器:
ip proto 89 and ip[21] == 2
18.1.1.2 3. ACL与防火墙策略验证
- 场景举例: 你刚在防火墙上写了一条规则,禁止内网
192.168.1.0/24网段访问外部的Telnet服务。
- 怎么用: 创建一个过滤器
net 192.168.1.0/24 and tcp port 23。然后从内网PC尝试telnet外部服务器。如果彩色线条在防火墙那里就“断头”了,说明策略生效;如果线条穿过了防火墙,说明你的规则写错了。
18.1.1.3 4. 二层协议分析
18.1.2 不适用场景 (Where it's Blind