等待输入...
📖 BPF 黄金法则 & 注意事项(14 条)
🏛️ 基础法则
VXLAN VNI(24位)用 3 字节比对在某些版本不支持。EVE-NG Pro 7.8+ 可用 3 字节,但通用写法是 2+1。
❌ ether[46:3] == 0x002710 ✅ ether[46:2] == 0x0027 and ether[48] == 0x10
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 ...)
括号内的 vlan 偏移相互独立。多 VLAN 嵌套时必须用括号隔离作用域。
✅ arp or (vlan and (arp or (vlan and arp))) ❌ arp or (vlan and arp) or (vlan and vlan and arp)
高层原语(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)))
vlan / mpls / pppoes 会永久改变 BPF 偏移基准。这些关键字必须在 OR 表达式的最后一个分支中出现。
⚙️ 技术细节
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]
优先使用高层原语 tcp port 80,自动处理 TCP Options。手动偏移 tcp[2:2] == 80 不追踪头长度变化。
IP 头长度可变(5-15 行):((ip[0]&0xf)<<2)。TCP 头长度可变(20-60 字节):((tcp[12]&0xf0)>>2)。使用已计算偏移(如 ip[21] 而非 ip[((ip[0]&0xf)<<2)+1])可简化表达式。
ip6 proto 6 只匹配 IPv6 第一个下一个头,不追踪扩展头链。ip6 protochain 6 追踪扩展头链,更慢但更准确。
less 100 和 greater 1000 按实际包长度过滤,不等于 ip[2:2](IP Total Length 字段)。
BPF 中 & 优先级低于比较运算符。ip[6:2] & 0x3fff > 0 容易被误解,建议加括号明确。
⚠️ ip[6:2] & 0x3fff > 0 # 可能不是你想要的意思 ✅ (ip[6:2] & 0x3fff) > 0 # 明确:分片或更多分片
📚 参考速查
64 Linux, macOS, Cisco 路由器 128 Windows (XP/7/10/11) 255 网络设备, traceroute 探测包
每经过一台 P 路由器弹出一层标签(-4 字节偏移基准)。mpls 关键字自动追踪。
使用 ether broadcast、ip broadcast 而非手动 ether[0] == 0xff(后者只匹配以太网广播,不处理 IP 广播子网掩码)。
🧩 常见偏移量速查
| 协议 | 字段 | 偏移量(从 L2 开始) |
|---|---|---|
| IPv4 | IHL + Version | ip[0] |
| TTL | ip[8] | |
| 协议号 | ip[9] | |
| TCP | Flags + Data Offset | tcp[12:2] |
| TCP 头长度 | (tcp[12] & 0xf0) >> 2 | |
| UDP | 源端口 | udp[0:2] |
| 载荷起始 | udp[8:](UDP头固定8字节) | |
| VXLAN | VNI(高2字节) | ether[46:2] |
| VNI(低1字节) | ether[48] | |
| VXLAN 内层 | EtherType | ether[50:2] |
| IP Protocol | ether[63] | |
| Q-in-Q | S-VLAN(外层) | ether[14:2] |
| C-VLAN(内层) | ether[18:2] | |
| ARP | Opcode | arp[6:2] |
| OSPF (IPv4) | 报文类型 | ip[((ip[0]&0xf)<<2)+1] |