推荐阅读:
1、EVE-NG 2TB全网最新最全镜像下载地址(保持更新):
https://www.emulatedlab.com/thread-939-1-1.html
2、EVE-NG 2025全网最新最全资源大全(保持更新):
https://www.emulatedlab.com/thread-2262-1-1.html
3、EVE-NG 国代答疑频道(免费公开访问):
https://pd.qq.com/s/8d1hglslz
1 实时流量洞察
注意!
1、该功能目前仅支持节点对象之间互联接口 ∗ ∗ 出 / O U T ∗ ∗ **出/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 填写表达式

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关键字,这样才能抓取完整会话流量。
Bash
tcp port 8080 and host 1.1.1.1
15.1.1 过滤访问223.5.5.5 DNS的流量
Bash
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.1net 192.168.0.0/16tcp port 80udp port 53arpvlan 100ip 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)
- 过滤CDP:
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
- Hello包过滤器:
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. 二层协议分析
-
场景举例: 你想知道网络里哪台交换机在发送VTP更新,或者哪些端口在跑CDP/LLDP。
-
怎么用: 直接用我们今天推导出的精确过滤器。
- VTP过滤器:
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x2003 - CDP过滤器:
ether host 01:00:0c:cc:cc:cc and ether[20:2] == 0x2000
你就能看到VTP报文是从哪个交换机发出来的,CDP邻居关系是在哪些链路上传递的。
- VTP过滤器:
18.1.2 不适用场景 (Where it's Blind 💀)
这个功能的"阿喀琉斯之踵"就是BPF语法的"天花板"。所有BPF搞不定的事,它都搞不定。
18.1.2.1 1. 基于应用层内容的精细过滤
- 场景举例: 你想过滤出所有访问
www.google.com的HTTP流量,而不是所有80端口的流量。 - 为什么不行: 我们已经讨论过了,BPF无法可靠地解析HTTP头里的
Host字段,因为它位置不固定。它只能做到tcp port 80,但分不清里面跑的是哪个网站。 - 正确工具: Wireshark显示过滤器 (
http.host == "www.google.com") 或应用层防火墙。
18.1.2.2 2. 分析加密流量的内容
- 场景举例: 你想过滤出所有访问特定HTTPS网站或特定API接口的流量。
- 为什么不行: 流量是加密的。BPF只能看到这是一个TLS/SSL报文(比如
tcp port 443),但它看不懂里面加密的"天书"到底是什么。它无法根据加密后的URL或API路径进行过滤。 - 正确工具: 需要解密的代理服务器(如Fiddler, Charles)或企业级的流量解密设备。
18.1.2.3 3. 状态化的TCP连接分析
- 场景举例: 你想只看TCP的重传报文,或者乱序报文。
- 为什么不行: BPF是无状态的,它对每个包都是独立判断。它不知道一个TCP会话的上下文,不知道上一个包的序列号是多少,所以它无法判断当前这个包是不是重传。
- 正确工具: Wireshark。它会重组整个TCP流,并用
tcp.analysis.retransmission这样的显示过滤器帮你轻松找到所有问题包。
18.1.3 最终总结
说白了,EVE-NG Pro这个新功能,是一个极其强大的、用于三四层流量路径和协议交互的可视化工具 。你可以把它当成一个**超级图形化的****traceroute和基础的 tcpdump**的结合体。
- 用它来:看流量走向、学协议交互、验证ACL和路由策略。
- 别指望它:替代Wireshark做深度的应用层协议分析和TCP状态分析。