我需要在dpdk上运行ebpf安全应用程序,但没有映射。
如果没有dpdk,ebpf应用程序会解析每个传入的数据包5元组和其他参数,并将它们与包含ACL的ebpf映射进行比较。将丢弃与ACL匹配的数据包。用户空间应用程序正在使用ACL动态更新地图。
然而,在ebpf的dpdk实现中没有映射。
有没有其他方法可以向ebpf应用程序提供ACL规则列表并动态更新它们?
eBPF的DPDK实现中没有BPF映射,也没有其他方法在BPF VM的两次运行之间保持状态。因此,您最好的选择是将这些信息编码到程序本身中。
Is there an alternative way to feed the ebpf app with a list of ACL rules and update them dynamically ?
的[EDIT-1]
[答:]是的,请参阅下面的选项1,在dpdk线程上下文中运行eBPF代码,以访问表、acl和其他巨大的页面cotnext。
DPDK 中有2个EBPF实例
- 在DPDK线程上下文中运行eBPF代码
- 使用AF_XDP运行eBPF将数据包注入DPDK进程
DPDK线程上下文中的eBPF:旨在允许用户创建在DPDK螺纹中运行的沙箱逻辑或回调,以实现动态调试、调试计数器、特殊规则等目标。
AF_XDP中的eBPF不是DPDK逻辑的一部分,而是
kernel packet processing via XDP
的一部分。标记为发送到DPDK的数据包可以通过BPF映射使用AF_XDP套接字发送到DPDK应用程序。这种方法的优点是NIC接口不需要与UIO驱动程序绑定,如UIO_pci_generic、vfio-pci或igb_UIO-
由于问题I need to run an ebpf security app over dpdk
不清楚,请找到两个的答案
方法-1(DPDK线程上的eBPF上下文(:在这种方法中,您将重写并采用XDP-eBPF来接受MBUF strcut数据(或MBUF的mtod(以访问以太网+负载。EBPF 5元组映射需要转换为使用DPDK API或自定义API进行查找,以与数据包5元组进行比较。为了模仿通过用户应用程序更新的eBPF映射的相同行为,您需要使用DPDK多进程(辅助应用程序(来更新5个元组表条目。
方法2(Kernel XDP挂钩中的eBPF上下文(:使用现有的eBPF
security app
构建二进制文件。使用DPDK AF_XDP将eBPF二进制文件加载到接口。通过BPF API(Python或C或GO(包装器适当地更新5元组查找表(正如您之前所做的那样(。
注意:
- 如果您使用方法-1,为了实现本机性能,我建议重写eBPF代码DPDK API(因为您想要使用DPDK(。可以利用硬件卸载、多个队列、PTYPES、RTE_FLOW,并且在DPDK线程上下文中运行沙箱eBPF没有开销
- 如果您使用的是方法-2,由于5元组匹配的操作是drop,所以我必须假设
in case of a match you would be injecting back to kernel
。因此不需要DPDK线程。除非您有特定的数据包要由DPDK用户空间处理 - 共享用户空间可以使用rte_malloc创建,多个DPDK进程可以访问该共享用户空间