首页 > 解决方案 > 如何在没有地图的情况下在 dpdk 上使用 ebpf

问题描述

我需要在 dpdk 上运行一个 ebpf 安全应用程序,但没有地图可以做到这一点。

如果没有 dpdk,ebpf 应用程序会解析每个传入的数据包 5tuple 和其他参数,并将它们与包含 ACL 的 ebpf 映射进行比较。与 ACL 匹配的数据包将被丢弃。用户空间应用程序正在使用 ACL 动态更新地图。

但是在 ebpf 的 dpdk 实现中没有映射。

是否有另一种方法可以为 ebpf 应用程序提供 ACL 规则列表并动态更新它们?

标签: dpdkebpf

解决方案


[EDIT-1] 的问题Is there an alternative way to feed the ebpf app with a list of ACL rules and update them dynamically ?

[Answer] 是的,请参考下面的 option-1在 dpdk 线程上下文中运行 eBPF 代码以访问表、acl 和其他大页面 cotnext。

DPDK中有2个EBPF实例

  1. 在 DPDK 线程上下文中运行 eBPF 代码
  2. 使用 AF_XDP 运行 eBPF 以将数据包注入 DPDK 进程
  • DPDK 线程上下文中的 eBPF:旨在允许用户创建在 DPDK 线程或回调中运行的沙盒逻辑,以实现动态调试、调试计数器、特殊规则等目标。

  • AF_XDP 中的 eBPF:不是 DPDK 逻辑的一部分,而是kernel packet processing via XDP. 标记为发送到 DPDK 的数据包可以使用 AF_XDP 套接字通过 BPF 映射发送到 DPDK 应用程序。这种方法的优点是 NIC 接口不需要与 uio_pci_generic、vfio-pci 或 igb_uio 等 UIO 驱动程序绑定

由于问题不清楚I need to run an ebpf security app over dpdk,请为两者找到答案

  1. 方法 1(DPDK 线程上的 eBPF 上下文):在这种方法中,您将重写并采用 XDP ebpf 来接受 MBUF strcut 数据(或 MBUF 的 mtod)来访问以太网 + 有效负载。EBPF 5 元组映射需要使用 DPDK API 或自定义 API 转换为查找,以与数据包 5 元组进行比较。为了模仿通过用户应用程序更新 eBPF Maps 的相同行为,您需要使用 DPDK 多进程(辅助应用程序)来更新 5 个元组表条目。

  2. 方法 2(内核 XDP 挂钩中的 eBPF 上下文):使用现有的 eBPFsecurity app构建二进制文件。使用 DPDK AF_XDP 将 eBPF 二进制文件加载到接口。通过 BPF API(Python 或 C 或 GO)包装器适当地更新 5 元组查找表(如您之前所做的那样)。

笔记:

  1. 如果您使用方法 1,为了实现本机性能,我的建议是重写 eBPF 代码 DPDK API(因为您想使用 DPDK)。可以利用硬件卸载、多队列、PTYPES、RTE_FLOW,并且在 DPDK 线程上下文中运行沙盒 eBPF 没有任何开销。
  2. 如果您使用的是方法 2,因为 5 元组匹配的操作是 drop 我必须假设in case of a match you would be injecting back to kernel。因此不需要 DPDK 线程。除非您有特定的数据包要由 DPDK 用户空间处理。
  3. 共享用户空间可以使用 rte_malloc 创建,可以被多个 DPDK 进程访问。

推荐阅读