【EVE-NG流量洞察】包过滤规则

推荐阅读:

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 httptcp.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是 <主机>

以上任何主机表达式前均可加上关键字 iparprarpip6,例如 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 地址匹配指定 <网络><掩码>。可以用 srcdst 修饰。注意此语法对 IPv6 网络无效
net <网络>/<长度> IPv4/v6 地址匹配 <网络> 及其 <长度> 位宽的掩码。可以用 srcdst 修饰

<网络> 可以来自配置文件(如 /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 流量)。

以上任何端口或端口范围表达式前均可加上关键字 tcpudp。例如,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 重要说明与注意事项

  1. 十六进制转换 :上面用到的 0x... 值都是目标字符串的ASCII十六进制表示。比如 GET (注意后面有个空格) 对应的就是 47 45 54 20
  2. 加密流量无效:对于像HTTPS, SSH(协商后)这类加密的协议,你用这种方法是看不到任何明文内容的,顶多能抓个协议握手。
  3. 脆弱性:这种基于固定偏移量和内容的过滤方法非常脆弱。只要协议有一点点变化,或者报文里多了个选项,就可能导致过滤失效。
  4. 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.8net 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 80udp 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)

只有当高级原语不好用不存在时,才退而求其次,使用这种"手术刀"式的玩法。

  • 适用场景:
    1. 过滤那些因为封装特殊导致高级原语失效的协议(典型案例:CDP, VTP, DTP等思科私有协议)。
    2. 过滤应用层协议的特定内容(比如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. 二层协议分析
  • 场景举例: 你想知道网络里哪台交换机在发送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邻居关系是在哪些链路上传递的。


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状态分析。
相关推荐
一颗青果2 小时前
TCP协议讲解
服务器·网络·网络协议·tcp/ip
航Hang*2 小时前
第二章:网络系统建设与运维(高级)—— IS-IS路由协议
运维·服务器·网络·笔记·智能路由器·ensp
安科瑞刘鸿鹏172 小时前
企业配电系统中开关柜“可视化运行管理”的实现路径
大数据·运维·网络·物联网
Bruce_Liuxiaowei2 小时前
(2025最后一篇博客)Metasploit框架攻击Windows实例:三种渗透路径
网络·windows·网络安全·网络攻击模型
一颗青果4 小时前
数据链路层讲解
网络
m0_738120724 小时前
渗透测试——靶机DC-6详细横向过程(Wordpress渗透)
服务器·网络·python·web安全·ssh·php
雅欣鱼子酱4 小时前
ECP5702 PD诱骗协议芯片,单芯片取电5V~20V输出给后端充电模板!
网络·人工智能·芯片·电子元器件
baboon_chen5 小时前
SS (Socket Statistic)
linux·网络·ss
我还可以再学点5 小时前
TCP与UDP
网络·tcp/ip·udp