BPF 表达式检查器

v1.1
等待输入
语法树 (JSON)
等待输入...
输入表达式后将在此显示语法分析结果
📖 BPF 黄金法则 & 注意事项(14 条)

🏛️ 基础法则

法则 1️⃣:VNI 必须拆分为 2+1 字节

VXLAN VNI(24位)用 3 字节比对在某些版本不支持。EVE-NG Pro 7.8+ 可用 3 字节,但通用写法是 2+1。

❌ ether[46:3] == 0x002710
✅ ether[46:2] == 0x0027 and ether[48] == 0x10
法则 2️⃣:OR 中 vlan 必须放最后

vlan 永久改变 BPF 偏移寄存器,导致后续分支基准错误。vlan 条件必须在 OR 的最后一个分支。

✅ icmp[0]==8 or (udp ...) or (vlan and icmp[0]==8)
❌ icmp[0]==8 or (vlan and icmp[0]==8) or (udp ...)
法则 3️⃣:括号具有作用域隔离

括号内的 vlan 偏移相互独立。多 VLAN 嵌套时必须用括号隔离作用域。

✅ arp or (vlan and (arp or (vlan and arp)))
❌ arp or (vlan and arp) or (vlan and vlan and arp)
法则 4️⃣:高层原语 vs 底层偏移

高层原语(icmp/tcp/udp/ip)自动追踪 VLAN 偏移;底层原语(arp/ether proto/ether[]/ip proto)固定偏移,需嵌套括号。

✅ icmp or (vlan and icmp)          # 高层可平铺
❌ arp or (vlan and arp)            # 底层需嵌套
✅ arp or (vlan and (arp or (vlan and arp)))
法则 5️⃣:封装类关键字放 OR 最后

vlan / mpls / pppoes 会永久改变 BPF 偏移基准。这些关键字必须在 OR 表达式的最后一个分支中出现。

⚙️ 技术细节

法则 6️⃣:VXLAN 内层偏移基准

Outer Eth(14) + IP(20) + UDP(8) + VXLAN(8) = 50 字节基准。内层字段偏移:

Outer: Eth(14) + IP(20) + UDP(8) + VXLAN(8) = 50
Inner MAC(12): 50-61
Inner IP(20):  64-83

EtherType: ether[62:2]    IP Proto:   ether[73]  (64+9)
IP Src:    ether[76:4]    IP Dst:     ether[80:4] (64+12/16)
ICMP Type: ether[84]      TCP Dst:    ether[96:2] (64+20/32)
TCP Src:   ether[94:2]
法则 7️⃣:TCP/UDP 端口匹配优先级

优先使用高层原语 tcp port 80,自动处理 TCP Options。手动偏移 tcp[2:2] == 80 不追踪头长度变化。

法则 8️⃣:IP/TCP 头长度计算

IP 头长度可变(5-15 行):((ip[0]&0xf)<<2)。TCP 头长度可变(20-60 字节):((tcp[12]&0xf0)>>2)。使用已计算偏移(如 ip[21] 而非 ip[((ip[0]&0xf)<<2)+1])可简化表达式。

法则 9️⃣:IPv6 扩展头不追踪

ip6 proto 6 只匹配 IPv6 第一个下一个头,不追踪扩展头链。ip6 protochain 6 追踪扩展头链,更慢但更准确。

法则 🔟:less/greater 按包长度过滤

less 100greater 1000 按实际包长度过滤,不等于 ip[2:2](IP Total Length 字段)。

法则 1️⃣1️⃣:位运算优先级

BPF 中 & 优先级低于比较运算符。ip[6:2] & 0x3fff > 0 容易被误解,建议加括号明确。

⚠️ ip[6:2] & 0x3fff > 0    # 可能不是你想要的意思
✅ (ip[6:2] & 0x3fff) > 0  # 明确:分片或更多分片

📚 参考速查

法则 1️⃣2️⃣:TTL 初始值参考
64    Linux, macOS, Cisco 路由器
128   Windows (XP/7/10/11)
255   网络设备, traceroute 探测包
法则 1️⃣3️⃣:MPLS 标签栈偏移

每经过一台 P 路由器弹出一层标签(-4 字节偏移基准)。mpls 关键字自动追踪。

法则 1️⃣4️⃣:broadcast/multicast 是高层原语

使用 ether broadcastip broadcast 而非手动 ether[0] == 0xff(后者只匹配以太网广播,不处理 IP 广播子网掩码)。

🧩 常见偏移量速查

协议字段偏移量(从 L2 开始)
IPv4IHL + Versionip[0]
TTLip[8]
协议号ip[9]
TCPFlags + Data Offsettcp[12:2]
TCP 头长度(tcp[12] & 0xf0) >> 2
UDP源端口udp[0:2]
载荷起始udp[8:](UDP头固定8字节)
VXLANVNI(高2字节)ether[46:2]
VNI(低1字节)ether[48]
VXLAN 内层EtherTypeether[50:2]
IP Protocolether[63]
Q-in-QS-VLAN(外层)ether[14:2]
C-VLAN(内层)ether[18:2]
ARPOpcodearp[6:2]
OSPF (IPv4)报文类型ip[((ip[0]&0xf)<<2)+1]
📡 协议过滤器 按协议类型添加过滤条件,自动生成 BPF 表达式
最近使用的表达式