BPF在网络分析与数据包过滤中的应用
1. BPF工具与系统分析
在系统分析领域,有许多实用的工具借助BPF(Berkeley Packet Filter)的强大能力。例如,Cloudflare使用eBPF Exporter来监控其所有数据中心的指标,并且将常见的需要导出的指标进行了打包,同时也很容易扩展新的指标。
在系统出现异常时,这些工具能帮助我们进行调试。BPF相较于其他分析工具有诸多优势,现代Linux内核都包含BPF虚拟机,我们可以基于此构建新的工具。除了前面提到的工具,还有Cilium和Sysdig等也使用BPF实现类似目的,大家可以尝试使用。
2. Linux网络与BPF的结合
从网络角度来看,BPF程序主要用于两个方面:数据包捕获和过滤。这意味着用户空间程序可以为任何套接字附加过滤器,提取流经该套接字的数据包信息,并根据需要允许、禁止或重定向特定类型的数据包。
在Linux内核网络栈的数据路径中,BPF程序可以在不同阶段与套接字缓冲区(Socket Buffer,简称SKB或sk_buff)结构进行交互。常见的程序类型有以下两种:
- 与套接字相关的程序类型
- 为基于BPF的流量控制分类器编写的程序
SKB是内核中用于处理每个发送或接收数据包的结构。通过读取SKB,我们可以决定是否通过或丢弃数据包,还能填充BPF映射以创建当前流量的统计信息和流指标。部分BPF程序甚至允许我们操作SKB,进而转换最终的数据包,例如在仅支持IPv6的系统中,将接收到的IPv4数据包转换为IPv6数据包。
3. BPF与数据包过滤
BPF过滤器和eBPF程序