标题中文释义:利用 eBPF 在商品硬件中进行机器学习驱动的流量处理
作者:Jorge Gallego-Madrid, Irene Bru-Santa, Alvaro Ruiz-Rodenas, Ramon Sanchez-Iborra ∗ , Antonio Skarmeta
期刊/会议:Computer Networks 243 (2024) 110295
GitHub库:https://github.com/irenebru/eBPF-neural-network
环境配置 | |
ML框架 | Python 的 ScikitLearn(sklearn) |
把python代码变成c代码的库 | TinyML 的 emlearn |
ABSTRACT
When combined with Machine Learning (ML) algorithms, it becomes a promising enabler to perform smart monitoring and networking tasks at any required place of the fog-edge-cloud continuum.
网络软件化正在为下一代网络(NGNS)的设计和开发铺平道路,这需要深刻改进现有的通信基础设施。NGNs的两个基本支柱是灵活性和智能,以创建弹性网络功能,能够以高效和具有成本效益的方式管理复杂的通信系统。从这个意义上说,扩展的伯克利数据包过滤器eBPF)是一种先进的解决方案,可以在通用硬件的Linux内核中实现低延迟流量处理。当与机器学习(ML)算法结合使用时,它成为在雾-边缘-云连续统一体的任何所需位置执行智能监控和网络任务的有前途的使能器(When combined with Machine Learning (ML) algorithms, it becomes a promising enabler to perform smart monitoring and networking tasks at any required place of the fog-edge-cloud continuum.)。在此工作中,我们提出了一种解决方案,该解决方案利用 eBPF将基于 ML的智能与 Linux 内核中的快速数据包处理集成在一起,以灵活的方式执行复杂的计算任务,节省资源并减少处理延迟。在物联网(IoT)场景中进行了实际实现和一系列实验,以评估该解决方案在 6LoWPAN 系统中检测攻击的性能。内核实现的表现表明,与使用用户空间的开发方法相比,:多层感知器(MLP)模型的执行时间(-97%)和CPU使用率(-6%)显著降低;因此,将我们的建议定位为将ML驱动的快速数据包处理嵌入Linux内核的有前途的解决方案。
-
Introduction
以前:在内核态用ebpf采集数据,在用户态用ML技术分析数据并预测
本文:都在内核态进行
研究背景和意义:
NGNs 的发展需要显著改善通信基础设施,而 eBPF 允许在商品硬件中进行高效的流量处理,与 ML 算法结合后,能够在雾 - 边缘 - 云连续体的任何所需位置执行智能监控和网络任务。
目前 eBPF 和 ML 的结合通常是在 Linux 内核级别收集流量数据,在用户平面分析数据并做出预测或决策,但这种解耦方式性能较低。
相关工作背景:
eBPF 是集成到 Linux 内核中的技术,能够在特权上下文安全地运行沙盒程序,主要用于安全、可观测性和网络等场景,通常与 Linux eXpress Data Path(XDP)结合实现灵活、高效和可移植的网络功能。
不同的工作提出使用 eBPF 程序作为由应用程序 / 控制级别运行的 ML 驱动框架的执行工具,但目前还没有使用 eBPF 能力在 Linux 内核中集成复杂 ML 模型的工作。
下一代网络(NGNs)的出现将要求通信基础设施在速度、灵活性、智能和延迟方面得到显著改善,这将使所有垂直领域的新用例得到进一步发展。[1]为了应对这种爆炸式增长,多个网络和流量管理解决方案正在出现,因为协调构成分散的Beyond-5G(B5G)架构的不同网络部分的复杂性将显着增加。[2].此外,由于需要对新硬件、软件和基础设施进行必要的投资,向新一代网络的过渡构成了重大挑战。
通过采用网络软件化方法,需要先进和新的技术来为NGN基础设施提供灵活性和智能。在这方面,最先进的技术是扩展的伯克利数据包过滤器(eBPF),它通过在Linux内核中安全执行代码,允许在通用硬件中高效处理流量[31鉴于非网络专用设备的能力,这一点尤为重要。
具体地说,在考虑雾-边缘-云连续体的场景中,借助机器学习(ML)技术,eBPF是NGN在基础设施的任何点执行智能网络和数据监控任务的支持者,这是管理预期的新服务和应用程序将产生的高吞吐量、低延迟流量的基本支柱。此外,该技术还有助于安全目的,因为它允许快速检查流量以实时检测攻击或入侵,这对于NGN来说也是至关重要的,因为未来基础设施中会出现新的攻击向量。众所周知,机器学习是向网络管理和编排提供智能决策的关键技术之一。[4].它使网络设备能够自动适应不断变化的网络条件,因为 ML驱动的机制可以检测异常、预测网络行为或预测故障和瓶颈[5]这样,这种主动性就可以用于自动执行网络管理任务,以实时优化网络,而无需人工干预。[6].
近年来,文献中探讨了 eBPF和 ML之间的协同作用【7,8】它们的融合使得能够以主动和智能的方式快速处理数据包,自动适应网络功能和服务应用程序的要求,从而全面提高网络性能、灵活性和可靠性。通常,它们以如下方式一起使用:eBPF负责在Linux的内核级别从流量流中收集数据,Linux的用户平面中的ML模型分析该信息并做出预测
然而,将流量处理和 ML处理解耦并不是最佳方法,因为在用户空间中执行计算任务与完整的内核实现相比,性能较低。其他实现选项,如数据面开发套件(DPDK)和AFXDP,also aim at improving the performance of data traffic processing【9,10】。AF_XDP是LinuxXDP的扩展,允许绕过 Linux 内核网络堆栈,因此,它能够直接从网卡将原始数据包数据发送到用户空间,而无需复制。然而,要使用 Direct Memory Access 实现这种零拷贝模式,网卡驱动程序(NIC)必须支持XDP REDIRECT 操作,这在廉价和受限制的硬件中可能无法实现。反过来,DPDK是一个用于数据平面应用程序快速处理数据包的平台,它比 Linux 内核中可用的传统中断方案更高效。然而DPDK应用程序的开发和维护并非易事,它需要特定的设备,而这些设备通常无法在通用硬件中找到。
在此背景下,作为本文的主要贡献,我们提出了一种解决方案,该方案将智能流量检查模型集成到 Linux 内核中,利用 eBPF提供的功能在同一级别(内核级别)上结合快速数据包处理和基于 ML的智能决策。该策略允许在执行此类计算的设备中节省资源,并显着降低处理延迟,如上所述这在边缘支持的 B5G 系统中非常重要。具体地说,据作者所知,这是首次在 Linux 内核中为数据包处理目的实现神经网络模型(多层感知器,MLP)的功能性实现。通过这样做,我们为 eBPF的数据包处理能力提供了智能,以灵活和轻量级的方式提高了性能并降低了该任务的延迟。该提案在一个物联网(IoT)场景中得到了验证,其中边缘上的资源受限设备能够通过机器学习处理有效地处理显着的流量负载,以检测网络攻击。
-
Background
相关文献:
不同的研究都建议使用 eBPF 程序作为执行工具,由在应用/控制层面运行的 ML 驱动框架进行指导
1.[12] 的作者开发了一个基于 ML 的框架,用于动态选择和部署拥塞控制算法。该解决方案基于两个 eBPF 模块,一个用于收集 TCP 流量信息并将其转发给用户空间框架,另一个用于实施拥塞控制算法,上述框架可在运行时对其进行重新配置。在模拟网络和生产网络中进行的实验表明,它比基准解决方案更有效。
2.文献[13]开发了一种基于 eBPF 和长短时记忆(LSTM)的预测模型,用于监控 Linux 网络协议栈状态。该解决方案使用 eBPF 程序跟踪内核网络协议栈中的 HTTP 请求和响应。然后将这些数据转发给 LSTM 模型,以预测随后的网络状况。与类似方法相比,该方案在进行实时预测方面表现出更高的准确性。
3.文献[14]介绍了一种内核级监控系统。该系统由一个收集应用层流量的非侵入式 eBPF 程序组成。然后使用 ML 方法对收集到的信息进行分析,以获得性能诊断结果,从而定位网络瓶颈。
4.文献 [15] 基于 eBPF 和随机森林开发了一个 Redis 自动调整模型。eBPF 程序用于识别不同的工作场景。这些数据被发送到随机森林模块,该模块会对内存参数进行排序,以找到效率更高的参数。然后,这些信息被直接发送到操作系统,以优化硬件资源的使用。
5.作者在 [16] 中提出了一种对微服务进行指纹识别和分类的解决方案。指纹识别使用 eBPF 模块来跟踪系统调用。然后,贝叶斯学习和 LSTM 自动编码器相结合,可以对许多现实世界中的微服务进行指纹识别,准确率高达 99%,而且只需额外使用 1%-2%的 CPU。
通过现有作品可以看出,eBPF已成为在Linux内核中执行监控和网络功能的高度合适的解决方案。与机器学习算法相结合,它们提供了一个强大的工具,可以自动检测网络中断,并实时采取行动。然而,仍然没有将复杂的机器学习模型集成到Linux内核中,使用eBPF功能。我们只是发现了一个初步的工作,其中使用一系列连接的if/else指令实现了简单的决策树模型。[7】.然而,如上所述,通常会发现使用eBPF程序从网络收集数据,然后将它们转发到用户空间,在那里提供机器学习算法并生成决策的框架。[17】.这带来了额外的开销,因为基于 ML的处理被移出了内核空间。因此,据我们所知,这是第一个在 Linux 内核中集成复杂的 ML算法,即 MLP 神经网络(this is the first integration within the Linux kernel of a complex ML algorithm),嵌入eBPF程序中,以实现低延迟和智能流量处理。
-
Use case
用例:IOT物联网
在物联网部署中,每个终端节点都有可能成为整个网络基础设施的切入点,因此提高终端节点抵御攻击的能力对整个系统的安全性至关重要。因此,考虑到物联网设备的局限性及其在运行环境中面临的特殊威胁,开发专为物联网设备设计的防御机制至关重要。由于 eBPF 允许在 Linux 内核中高效执行代码,因此有可能通过开发可完全集成到操作系统(即内核)中的先进轻量级安全解决方案来提高物联网元件的安全性。因此,eBPF 可用于在内核层面执行安全策略,为终端设备提供额外的自我保护层,以抵御攻击。这样,就有可能根据物联网节点的具体需求建立自我保护机制,使其能够自主检测并及时有效地应对安全威胁,从而减少对固定基础设施的依赖。
物联网设备有无数的应用,通常有几台设备在所谓的无线传感器网络(WSN)中协同工作。实现这些系统最常用的技术之一是6LOWPAN(Pv6over Low-Power Wireless PersonalArea Networks),这是IETF定义的一个开放标准,用于使IPv6 数据包能够在 IEEE 802.15.4 定义的低压无线网络上传输。[21].6LOWPAN 的设计目的是使IPv6能够被高度受限的设备使用,从而使其能够直接连接到互联网[221.与 6LOWPAN 密切相关,RPL(用于低功率和损耗网络的路由协议)[231是种低功耗、易受数据包丢失影响的无线网络的路由协议。它是一种基于距离向量的主动协议,运行在IEEE 802.15.4和6LOWPAN 之上。该协议可以快速创建网络路由,共享路由信息,并以高效的方式适应拓扑结构的变化,使其非常适合具有受限设备的 WSN,因此是这类系统中使用最多的路由协议之-。[24].
考虑到这些方面,本用例的目标是演示和验证eBPF的港力,通过允许在 Linux内核中执行由神经网络等复杂ML算法(即 MLP 模型)支持的攻击检测算法,实现loT设备的自我保护。为了允许实验的可重复性,在下面的子部分中介绍了实现本用例的步骤。
3.1数据集生成
获得训练模型用的数据集
为了生成嵌入终端设备内核的 ML 模型,需要一个数据集来对其进行训练。为了生成该数据集,我们配置了一个受控测试场景。该测试平台能够收集可靠的数据,而无需损害任何生产中 WSN 的安全性。该环境使用 Cooja [25]进行部署,Cooja 是一种允许模拟运行 Contiki 的设备网络的工具,Contiki 是专为物联网设备设计的开源操作系统,同时实现了 6LoWPAN 和 RPL。
所研究的场景主要是检测对 RPL 协议的 “Hello Flood ”攻击(是指攻击者通过代理或僵尸主机向目标服务器发起大量的HTTP报文,请求涉及数据库操作的URI(Universal Resource Identifier)或其它消耗系统资源的URI,造成服务器资源耗尽,无法响应正常请求)。为了实现这种攻击,使用了 RPL-AttackFramework [26]。这包括 RPL 管理的 WSN 中根节点、恶意节点和良性节点的模块。在本用例中,“Hello Flood ”攻击涉及一个或多个恶意节点周期性地生成路由信息请求,使其他节点响应这些信息,以浪费它们的资源(如电池电量)。
如图 1 所示,模拟包括一个根节点(绿色设备)、十个传感器节点(黄色设备)和一个在根节点通信范围内的恶意节点(紫色设备)。Cooja 的 “无线电信息工具 ”用于捕获十分钟模拟过程中产生的所有通信量,并生成一个 .pcap 文件,数据集就是由此生成的。在实验中,我们重点关注根节点的自我保护,因为它是 RPL 网络中最重要的元素。为此,我们对原始 .pcap 文件进行了处理,以提取根节点专门接收的 RPL 数据包,每一行代表在给定时间窗口内由同一来源生成并由根节点接收的数据包数量(按 RPL 报文类型1 分列,即 DODAG 信息请求 (DIS)、DODAG 信息对象 (DIO)、目的地广告对象 (DAO) 和其他)。测试使用 1 秒、5 秒和 10 秒的时间窗口来评估最适当的数据聚合,以最大限度地提高 ML 模型的准确性和终端设备的性能。因此,得到了分别包含 1919、1047 和 572 行的三个数据集。在这些数据集中,每一行还包括相应源节点的地址(尽管该字段只是信息性的,并未用于训练 ML 模型),以及表示该源是否为恶意节点的标签label。在此过程中,请注意,我们生成的数据集使用的是每个节点(本例中为根节点)在运行过程中实时收集到的数据,即每个邻居在某个时间段(1 秒、5 秒和 10 秒)内收到的 DIS、DIO、DAO 和其他消息(ML 模型的输入特征)的数量。因此,训练数据集以及由此生成的模型都是完全真实的,可用于真实的 WSN 场景。关于设备正常运行期间物联网节点的信息处理和数据聚合,我们将在后面详细介绍 eBPF 的实现。
数据截图:
3.2机器学习模型
在这一步中,我们利用生成的数据集收集根节点在特定时间窗口内从其相邻节点接收到的 RPL 协议消息。如前所述,我们的最终目标是在 eBPF 的支持下实现一种基于内核 ML 的解决方案,它能够识别某些攻击(本例中为 “Hello Flood ”攻击)。虽然可以考虑使用不同类型的 ML 算法,但我们考虑使用 MLP 模型,因为神经网络在分析流量和检测异常情况时具有灵活性和良好的准确性[27]。如前所述,最近的研究已成功开发出一种通过大量 if/else 语句在 eBPF 中实现决策树的方法[7]。不过,我们更进一步,采用了更复杂的 ML 算法(如 MLP)。在检测网络攻击方面,MLP 神经网络由于能够处理输入特征和输出标签之间的非线性关系(这是网络流量数据的共同特征),历来被广泛使用。MLP 可以学习数据中的复杂模式,因此适用于检测可能无法立即察觉的细微攻击行为。此外,MLP 还能实现高精度和高速度,因此非常适合在线安全系统中的实时攻击检测 [28]。
针对这一特定用例,我们使用了基于 Python 的 ScikitLearn MLP 实现,在使用整流线性单元(ReLU)激活函数时,该实现在我们生成的数据集上显示出了良好的性能。该函数适用于二元分类任务,例如检测节点从邻居接收到的流量是否构成攻击。此外,它也是 eBPF 的合适选择,因为它不仅能有效地进行模式检测,而且对于需要近乎实时处理的应用来说,计算效率也很高。在训练过程中,生成的数据集将 80% 的样本用于训练,20% 的样本用于测试。选择 80/20 的分配比例,既能为模型训练提供足够的数据,又能为有意义的性能评估保留相当大的测试集,在两者之间取得了平衡。此外,我们还在分割中加入了分层,以确保在训练集和测试集中都能保持原有的类别分布。由于数据集中的阴性样本多于阳性样本,因此这一决定尤为重要。通过确保训练集和测试集中两个类别的比例代表,这一程序有助于避免模型性能评估中的偏差。
在对不同的 MLP 配置(每层的隐藏层和神经元)进行了多次测试后,采用层数和神经元数量有限的神经网络架构就足够了。这是因为要获得良好的结果,并不需要损失线性。增加过多的层或神经元可能会导致过度拟合,从而降低模型的泛化性能。具体来说,在测试中,我们最终采用了由两个隐藏层组成的 MLP 模型,分别由三个和两个感知器构成。每一层都使用了 ReLU 激活函数,而最后一层则使用了 sigmoid 函数。值得注意的是,正如下一节所详述的那样,所采用的开发程序能够利用更复杂的神经网络和其他激活函数来实施解决方案。通过所选的 MLP 配置,我们在使用 1 秒、5 秒和 10 秒的聚合窗口训练模型时,准确率分别达到了 0.99、1 和 1。回顾一下,尽管所达到的准确率非常高,但这项工作的重点是在 Linux 内核中运行神经网络模型所面临的挑战。
最后,为了将获得的 MLP 模型从 Scikit-Learn 1.2.0 移植到 eBPF,我们使用了 TinyML 的 emlearn 0.14.0 库[29],它可以将 Python 模型转换为 C 代码,从而大大简化了将模型集成到 eBPF 程序中的工作。该库提供了转换工具,用于生成包含每个神经网络层的权重和偏置的浮点数组,以及表示训练过的模型的完整结构。下一节将详细介绍最后一步所采用的方法:攻击检测解决方案的 eBPF 实现。
3.3基于ebpf的实现
鉴于 eBPF 验证器[11]的严格限制,在 eBPF 程序中集成 C 代码 MLP 模型并非易事。在下文中,我们将详细介绍开发过程和在此过程中面临的所有挑战,以及我们是如何克服这些挑战的。由此产生的代码已在公共存储库中公布。
我们使用了 emlearn 库提供的头文件,其中包含实现神经网络逻辑的函数。具体来说,对于神经网络的每一层,前一层的输出与当前一层的权重和偏置进行线性组合,然后应用非线性激活函数(在我们的例子中为 ReLU 激活函数)。尽管 emlearn 库提供了很多好处,但由于 eBPF 程序的上述限制,将 MLP 模型直接集成到 eBPF 中并不可行。
因此,为了解决这些限制,我们在 emlearn 库中引入了几处修改,以将其生成的代码调整为 eBPF 验证器可接受的有效代码。主要的实施挑战如下所述:
第一、eBPF 程序不能使用浮点运算 [30]。鉴于神经网络的权重和偏差都是非整数,这是一个很大的限制。为了应对这一挑战,我们引入了定点表示法(误差小很多),整数部分用 16 位表示,小数部分用 15 位表示,数字符号用 1 位表示。为了便于转换,我们还加入了量身定制的转换函数,利用这种隐式表示法将所有浮点数值系统地转换为 32 位定点整数。
执行这一转换过程需要对我们的神经网络实现进行一系列调整。具体来说,我们开发了新的算术函数(加法、减法、乘法和除法,重载运算符),可与这种表示方法配合使用。事实证明,加法的调整非常简单,而定点整数的乘法和除法则需要采用 64 位整数,以避免精度下降,并使用 2 的幂次来缩放结果。此外,我们还对神经网络中的激活函数进行了调整。在我们的实施中,各层之间只使用 ReLU 函数,而最终分类则使用 sigmoid 函数。关于 ReLU,我们进行了额外的调整,以方便它接受定点整数作为输入,并验证它们是否超过零。同时,还对 sigmoid 函数进行了优化,以简化推理过程中的最终分类流程。值得注意的是,为了加入任何所需的激活函数,必须仔细考虑定点执行。这可能涉及直接使用新引入的算术函数、使用数值方法逼近或优化函数,特别是在最终分类任务中。
第二、eBPF 校验器在处理循环时会受到限制,因为它必须保证所有加载到内核的程序都能终止,例如,为了避免拒绝服务(DoS)攻击。起初,循环是不允许使用的,但在 5.3 版 Linux 内核中引入了对有界循环的支持3,尽管它是在每个程序允许的最大 eBPF 指令数(从 5.2 版开始为 100 万条)的范围内。继这一改进之后,5.17 版本又增加了 bpf_loop() 辅助函数4,该函数以更快的验证过程换取了一些执行时间,并允许使用更大的有界循环(最多可迭代 800 万次),因为它不受 eBPF 指令限制。不过,仍有必要遵守验证器堆栈限制,以避免嵌套循环导致程序运行时间过长。在我们的实现中,考虑到不需要大量迭代的循环,我们按照第一种方法调整了循环,使其有界,这样在编译时就能知道迭代次数。这样,编译器中的循环展开指令就能将循环转化为一系列独立的指令。为了实现这一目标,代表层数、辅助缓冲区长度和神经网络输出的变量被替换为 MACROS,for 循环也做了相应修改。这种方法不仅实现了循环解卷,还提高了代码的可读性和可维护性,使其更易于在其他类型的神经网络中重复使用。此外,包含各神经网络层输入和输出数量的恒定静态数组用于正确应用各层权重和偏置的线性组合。考虑到这一点,我们的实现设计允许使用具有不同层数、神经元和激活函数的神经网络,从而证明了通用能力。
第三、为了使用 MLP 模型检测针对 RPL 协议的 “Hello Flood ”攻击,eBPF 中还实施了报头解析程序,以分析传入的网络数据包。eBPF 中的解析过程需要进行边界检查,以确保内存访问在预期边界内。否则,eBPF 校验器将不允许程序运行。要成功执行解析过程,必须考虑到链路层报头是 IEEE 802.15.4,其次是包含压缩 IPv6 地址的 6LoWPAN 报头(见图 2)。请注意,6LoWPAN 报头可能不包含整个地址,因为它通常省略前缀或只包含最后几个字节。RPL 报文类型由其报文头中的一个字节决定,DIS 报文的值为 0,DIO 报文的值为 1,DAO 报文的值为 2。
3.4.实验
解析报文头后,收集到的数据需要在 eBPF 程序执行之间持续存储,因为它们之间没有保持状态。为此,我们使用了固定的 eBPF 映射,这样就能跟踪每个 IPv6 地址在不同时间窗口(1 秒、5 秒和 10 秒)内发送到根节点的报文。具体来说,所使用的 eBPF 地图属于 BPF_MAP_TYPE_HASH 类型,该类型可为一般用途提供散列地图存储。我们将其用作哈希映射,其中键是源设备的 IP 地址,值是由 4 个整数组成的数组。每个整数代表从该 IP 地址接收到的每种类型数据包的数量,即 DIS (0)、DIO (1)、DAO (2) 和其他类型数据包 (3)。关于时间窗口的计算,我们使用了以 ns 为单位返回机器时间的 bpf_ktime_get_ns() 函数。为了实现时间窗口,我们再次使用了 BPF_MAP_TYPE_HASH 类型的 eBPF 映射。因此,每次执行神经网络时,都会从机器中提取时间并存储到映射中。每次执行 eBPF 程序时,都会将保存的时间与当前时间进行比较,检查时间窗口是否已过期。一旦窗口结束,就会应用 MLP 模型来分析收集到的数据,并确定是否发生了攻击。这一过程会随着时间的推移不断重复,以确保对设备(本例中为 WSN 根节点)的持续保护。值得一提的是,所有描述的行为都是在单个 eBPF 程序中实现的,因此在我们的解决方案中没有使用尾部调用。
一旦实施准备就绪,eBPF 程序就会被编译、验证并加载到通用的 XDP eBPF 钩子上。XDP 允许使用不同模式将程序附加到网卡上,其中卸载模式和本地模式效率最高。不过,这两种模式需要网卡驱动程序来支持这种操作[31]。商品硬件通常配备的网卡比较有限,不支持这些驱动程序。在这种情况下,XDP 允许将 eBPF 程序附加到在设备驱动程序之后运行的通用钩子上。这就允许在受限的商品硬件上执行 eBPF 程序,从而在这些设备上实现高级数据包处理。
通过这一过程,我们获得了 eBPF 程序,并准备通过实验阶段进行验证。为了更好地理解和总结该工具的功能,图 3 描述了程序的状态图。请注意,它是以基于事件的方式运行的,因此在网卡接收到 eBPF/XDP 钩子中的每个数据包后,整个过程都会重复。当数据包到达时,程序会解析其报头并识别 RPL 数据包类型,然后将数据包类型计数及其来源存储到 eBPF 哈希映射中(如前所述),以便在后续执行中访问这些数据。然后,程序会检查时间窗口是否已过期。如果没有,则结束执行。否则,ML 模型会从持久映射中收集数据包计数信息,并推断是否发生了攻击。最后要指出的是,考虑攻击的高级对策不在本文讨论范围之内,因此在我们的实现过程中,当检测到攻击者时,会实例化一条新规则,因此根节点会直接丢弃来自该设备(通过其 IPv6 地址识别)的数据包,以避免浪费不必要的资源。
图3:ebpf程序的程序流程图
实验使用两个设备进行,即一台用于产生流量的普通计算机和一台运行 eBPF 程序的物联网设备,后者负责处理接收到的数据包并执行嵌入式神经网络。前者是一台台式电脑,采用英特尔 i5-3470 四核 CPU 和 8GB 内存;后者是一台树莓派 3 Model B V1.2,采用 Ubuntu 22.04 LTS 和 GNU/Linux 5.15.0-1034-raspi 内核,配备四核 CPU 和 1GB 内存。两者通过以太网电缆直接连接,最大理论吞吐速度为 100 Mbps,因为 Raspberry Pi 的网络接口仅限于此速度。流量使用 tcpreplay [32] 工具生成并注入,该工具用于复制之前展示的原始数据集的捕获流量。通过这种方式,从原始 .pcap 文件(见第 3.1 节)中提取的流量以理想的速度离开台式电脑,到达 Raspberry Pi 的以太网端口,并在其接口上连接了 eBPF 程序。
除了神经网络的eBPF实现外,我们还开发了另一个版本的程序,将神经网络与解析机制解耦,并在Linux的用户空间中执行(对比试验)。因此,我们可以比较在内核和用户空间中运行的ML模型的性能(图4)。通过这种方式,为实验准备了两种场景,一种是在内核内的特权上下文中执行数据包解析和神经网络执行,另一种是将神经网络计算移动到用户空间。用户空间中的神经网络实现使用与内核中实现相同的C代码,有125行代码(LoC)。eBPF程序有176 LoC,混合解决方案分为eBPF解析程序(141 LoC)和用户空间中的ML模型处理(63 LoC)。此外,具有整个实现的eBPF程序、仅具有解析器的eBPF软件和用户空间程序的二进制大小分别为26KB、16KB和546KB。内核加载具有ML模型的eBPF程序所需的时间为830.2±53.4μs,加载仅包含数据包解析机制的eBPF需要788.8±57.9μs。如前所述,选择了三个不同的时间窗口(1秒、5秒和10秒)来评估ML模型准确性方面的最佳数据聚合,并检查对终端设备性能的影响。每个实验在60秒内执行10次,以避免所获得结果的奇异性并获得统计财富。
图4:对比实验,一个是数据获取和ML都在内核,一个是一个在内核一个在用户
如前所述,选择了三个不同的时间窗口(1秒、5秒和10秒)来评估ML模型准确性的最佳数据聚合,并检查对终端设备性能的影响。每个实验在60秒内执行10次,以避免获得的结果中出现奇异值,并获得丰富的统计数据。
-
Results
本节介绍了在上述试验台上开发的解决方案的性能。第一次进行的测试旨在评估两个设备之间的物理链路在不执行eBPF程序的情况下支持的最大数据速率(基线性能)。这包括使用iPerf工具测量多个数据包大小(TCP流量)实现的最大带宽。如图5所示,随着数据包大小的减小,数据速率如预期的那样降低。这是因为物联网设备的NIC每秒必须处理大量数据包,超过了其能力。对于大数据包,最大可达速率超过90 Mbps,而对于64 B的数据包,则降至28.5 Mbps。请注意,在本次实验和后续实验中,我们利用高数据速率对物联网设备和eBPF功能进行了压力测试,以研究它们在苛刻条件下的性能。然而,这不是典型物联网系统的常见行为,通常会出现更零星和有限的流量。
图5:
一旦eBPF程序在物联网节点中嵌入并执行,表1显示了每种配置在不丢失数据包的情况下实现的最大数据速率。配置的变量是神经网络是在内核还是用户空间中执行(第一列),以及聚合数据和执行神经网络的时间窗口的持续时间(第二列)。首先,考虑到我们实验中采用的平均数据包长度(从数据集生成期间捕获的原始流量中提取)为90 B,与基线情况相比,获得的数据速率没有明显下降(图5)。因此,可以推断出eBPF程序并没有成为物联网设备的瓶颈。比较两种实现方法,当神经网络在用户空间执行时,即当eBPF程序执行数据包解析时,ML模型在用户空间中执行,以解耦的方式从共享映射中收集其输入数据时,可以获得最高的速度(图4)。当神经网络在Linux内核中执行时,与其他配置相比,数据速率会降低,在最坏的情况下(聚合窗口为1秒)差异约为5%。这是由于eBPF程序要求在每次时间窗口到期时执行神经网络,在此期间程序保持“忙碌”状态,无法接收额外的数据包。同样,这就是为什么在内核场景中,数据速率随着时间窗口的增加而增加的原因。这一结果是意料之中的,因为ML模型在较长的时间窗口内执行的频率较低,因此eBPF程序能够处理更多的数据包,因为它不忙于其他任务。这可以被理解为inkernel实现的一个缺点,尽管如上所述,在高要求的流量条件下,性能下降仅为5%,而且这种情况在物联网环境中似乎不太可能发生。
表1:
考虑到计算性能,图6显示了在两种情况下,在聚合时间窗口为5秒的情况下,执行实验期间CPU消耗的实时图。该结果旨在显示两种实现的稳定性,并比较它们在运行时的性能。可以看出,尽管两个图的振荡范围相似(60%-80%),但使用inkernel实现的平均CPU消耗低于用户空间实现。具体来说,通过在内核中运行神经网络,CPU使用率降低了6%。此外,当从用户空间运行时,会出现明显的低峰值。考虑到端节点的显著计算限制,在物联网环境中减少CPU的使用非常重要。请注意,实验表明CPU消耗没有达到核心资源的100%使用率。这是因为实验是在每种配置中可能的最大无损数据速率下进行的,这意味着该图表示CPU在达到数据速率之前的稳定行为,在该数据速率下,由于CPU饱和(CPU使用率为100%),数据包开始丢失。
最后,图7显示了ML模型在两种实现中的平均执行时间,具体取决于所选的时间窗口。这些测量值是使用操作系统的工具(bpf_ktime_get_ns()和clock())实时获得的,这些工具允许在调用ML模型之前和之后以纳秒为单位计算时间机器。此调用包括处理来自映射的输入和执行神经网络本身。可以看出,与在用户空间中运行该进程的情况相比,在内核空间中运行时该进程的执行时间显著减少(所考虑的三个时间窗口减少了约97%)。这一显著差异是因为在特权上下文中执行速度更快,eBPF可以以非常有效的方式运行沙盒程序。与在内核环境中执行程序相比,在用户空间中运行程序时的其他操作系统活动会增加额外的开销,例如上下文切换、I/O操作、系统调用等。正如预期的那样,执行时间几乎不会随着窗口的长度而变化,因为它不受数据聚合频率的影响。我们认为这一结果具有重要意义,因为它证明了在内核中执行复杂任务的优势,与在用户空间中执行任务相比,可以实现明显的性能提升。
因此,所获得的结果证明了eBPF在内核空间中运行程序以提高数据包处理时间和计算资源使用率的优势。通过这种方式,这种解决方案在雾/边缘场景中可能很有趣,在这些场景中,执行任何类型的基于机器学习的处理都是相关的,例如网络攻击的自我检测案例。此外,它还作为一种经济高效的变通方法,以智能方式处理流量,而不需要昂贵的硬件,因为已经证明,在某些情况下,具有显著资源限制的商品硬件的性能是可以接受的。
-
Conclusions
下一代网络正在呼吁能够增强底层基础设施的智能和灵活性的网络和流量管理解决方案。随着网络的软件化,多种技术正在出现,以满足B5G架构在这方面的苛刻要求。因此,一种灵活且便携的技术应运而生,作为在非敏感硬件eBPF中实现低延迟流量处理的推动者。它允许在Linux内核中的特权上下文中执行程序,允许在网络基础设施(雾边缘云)的任何点以快速灵活的方式处理流量。到目前为止,eBPF已经通过将eBPF程序用作内核级的数据收集器,并为在用户空间中运行的ML算法提供数据,与ML模型结合使用。作为这项工作的主要贡献,我们提出了一种在Linux内核中集成ML处理的解决方案,以提供智能快速的数据包检测。具体来说,我们已经实现了一个复杂的模型,叫做MLP。通过利用eBPF,我们在网络数据平面内实现了高性能和低延迟的处理,实现了实时流量分类任务,而无需依赖强大的外部支持。考虑到物联网网络安全用例,与经典的用户空间实现方法相比,所获得的结果显示出明显的改进。具体来说,当在Linux内核中而不是在用户空间中操作时,我们分别在ML模型的执行时间和CPU使用率方面实现了97%和6%的显著降低。这为开发能够在大量设备中运行的高效、便携的新型网络功能铺平了道路。
可以探索几个方向来增强和扩展我们的工作。首先,在eBPF中集成更复杂的神经网络模型,如卷积神经网络,可以提高解决方案的分类能力。此外,可以采用替代实现方法,旨在提高实现的数据速率,改进eBPF中的定点算法,以提高实现的神经网络的准确性。此外,基于eBPF的神经网络的硬件加速潜力是未来研究的一个有前景的方向。特定的硬件,如FPGA或SmartNIC,可能会提高基于eBPF的分类器的性能,使其能够在更苛刻的用例中应用。