dpdk - 如何在没有地图的情况下在 dpdk 上使用 ebpf
问题描述
我需要在 dpdk 上运行一个 ebpf 安全应用程序,但没有地图可以做到这一点。
如果没有 dpdk,ebpf 应用程序会解析每个传入的数据包 5tuple 和其他参数,并将它们与包含 ACL 的 ebpf 映射进行比较。与 ACL 匹配的数据包将被丢弃。用户空间应用程序正在使用 ACL 动态更新地图。
但是在 ebpf 的 dpdk 实现中没有映射。
是否有另一种方法可以为 ebpf 应用程序提供 ACL 规则列表并动态更新它们?
解决方案
[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实例
- 在 DPDK 线程上下文中运行 eBPF 代码
- 使用 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(DPDK 线程上的 eBPF 上下文):在这种方法中,您将重写并采用 XDP ebpf 来接受 MBUF strcut 数据(或 MBUF 的 mtod)来访问以太网 + 有效负载。EBPF 5 元组映射需要使用 DPDK API 或自定义 API 转换为查找,以与数据包 5 元组进行比较。为了模仿通过用户应用程序更新 eBPF Maps 的相同行为,您需要使用 DPDK 多进程(辅助应用程序)来更新 5 个元组表条目。
方法 2(内核 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 进程访问。
推荐阅读
- pydub - 如何有效地将 gtts 音频转换为 pydub audiosegments?
- ios - 如何在不使用 segues 的情况下将 tableview 单元格的名称传递给另一个 swift 文件?
- android - Android appflow部署不更新设备
- python - 使用 Pandas 数据框绘制 Holoviews.Image
- firebase - 颤动-手机中未显示firebase消息
- kubernetes - 在 Kubernetes 中,将文件中的机密公开为环境变量
- entity-framework - 实体框架.刷新上下文
- php - SQLSTATE = 23502 出现在我部署的网站上。(通过上传 .csv)
- python - 将悬停文本添加到 Plotly 散点图线或散点图线的多种颜色
- javascript - 返回或推送字符串 Char