用户空间流量生成

艺术家的概念展示了MoonGen + DPDK + Lua流量生成堆栈

缓解DDoS攻击需要广泛测试和学习各种技术。 硬件和软件网络解决方案需要在接近现实生活的人工环境中进行测试,并且大量的流量模仿攻击。 没有这样的经验,就永远不会承认每个复杂工具都具有的特定功能和局限性。

在本文中,我们将公开Qrator Labs中使用的某些流量生成方法。

免责声明

众所周知,我们建议所有读者不要尝试冒犯我们在此研究中使用的工具。 DoS攻击的组织在法律上受到迫害,并可能导致长期监禁。 Qrator Labs负责在隔离的实验室环境中进行所有测试。

最新技术,或者我们为什么要这样做

我们领域中的挑战性问题是将10G以太网接口与小数据包一起使用,即处理14.88 Mpps(每秒数百万个数据包)。 在此及以下,仅考虑最小的以太网数据包,即64字节大小,因为我们对最大数据包速率感兴趣。 一个简单的估算表明,我们只有大约67纳秒的时间来处理单个数据包。 仅供您比较-此值接近现代CPU上的高速缓存未命中时从主内存中获取一条数据所需的时间。 如果我们必须处理40G或100G以太网接口并使其饱和,事情就会变得更加复杂。

由于典型的数据平面从用户空间应用程序通过内核传递到NIC,因此提高网络性能的第一个直接方法就是直接在内核中实现数据包生成。 此类解决方案的一个示例是pktgen [ 2 ]内核模块。 这种方法确实有助于提高性能,但是不够灵活,并且内核源代码中的任何更改都需要更长的实现-负载-测试循环,从而导致生产率降低(例如,程序员花费的时间和精力)。

另一种方法是提供从用户空间到映射到NIC的缓冲区的直接访问。 这种方法比较复杂,但是值得尝试获得更高的性能。 缺点是较高的复杂性和较低的灵活性。 示例是netmapPF_RINGDPDK [ 4 ]。

实现高性能的另一种合理但昂贵的方法是专用硬件,例如Ixia

还有一些基于DPDK并使用脚本的解决方案,因此在控制生成器的参数和更改运行时发出的数据包方面具有一定的灵活性。 下面我们还将介绍我们使用一种这样的工具MoonGen的经验。

MoonGen体系结构

MoonGen体系结构。 文章[ 1 ]中的图。

MoonGen的主要功能是:

1. DPDK用户空间数据流处理,所有高性能都从此增长;

2. Lua [ 5 ]堆栈,其顶部具有用户友好的脚本,并在其后端绑定到基于C的DPDK;

3.由于使用Lua编写的JIT脚本运行非常快,这与人们通常期望的脚本语言相反;

MoonGen可被视为DPDK库周围的Lua包装器。 至少以下DPDK操作公开给用户Lua界面:

  • NIC配置;
  • 内存池和缓冲区的分配和访问,应连续分配和对齐这些内存池和缓冲区,以使性能最大化;
  • 直接访问NIC RSS队列;
  • 具有NUMA [ 12 ]感知和CPU关联的线程控制API。
MoonGen

MoonGen是基于DPDK构建的可编写脚本的高速数据包生成器。 Lua脚本控制着整个负载生成器:用户提供的脚本可以制作所有进一步发送的数据包。 得益于快速的LuaJIT VM和数据包处理库DPDK,它可以在仅使用单个CPU内核的情况下,通过64字节数据包使10 Gbps以太网链接饱和。 即使Lua脚本修改了每个数据包,MoonGen也可以达到此速度。 它不依赖于重播相同缓冲区的技巧。

MoonGen还可以接收数据包,例如,检查被测系统丢弃了哪些数据包。 由于接收也完全在用户的Lua脚本的控制之下,因此可以将其用于实现高级测试脚本。 例如,可以使用两个MoonGen实例建立彼此的连接。 此设置可用于对防火墙等中间设备进行基准测试。

MoonGen着重于四个要点:

  • 高性能和多核扩展:每个CPU内核每秒超过2000万个数据包
  • 灵活性:每个数据包均由用户提供的Lua脚本实时制作
  • 精确的时间戳记:在商品硬件上具有亚微秒精度的时间戳记
  • 精确的速率控制:在商品硬件上可靠地生成任意流量模式
DPDK

DPDK是数据平面开发套件,它由多个库组成,可加快在各种CPU架构上运行的数据包处理工作量。

在当今世界上,网络已成为人们交流方式的基础,对于诸如无线核心和访问,有线基础设施,路由器,负载均衡器,防火墙,视频流,VoIP等应用而言,性能,吞吐量和延迟对于这些应用越来越重要。

DPDK是一种构建测试和脚本的轻量级方法。 用户空间数据流并不是我们经常看到的东西,因为通常,应用程序通过OS和内核堆栈与网络硬件进行通信,这与DPDK的运行方式相反。

a

通常,Lua努力提供可以根据需要扩展的简单,灵活的元功能,而不是提供特定于一种编程范例的功能集。 因此,基本语言很轻-完整的参考解释器编译后只有180 kB-且很容易适应广泛的应用。

Lua是一种动态类型化的语言,旨在用作扩展或脚本语言,并且足够紧凑以适合各种宿主平台。 它仅支持少量的原子数据结构,例如布尔值,数字(默认情况下为双精度浮点数)和字符串。 典型的数据结构(例如数组,集合,列表和记录)可以使用Lua的单一本机数据结构(表)来表示,该表是异构关联数组。

Lua使用JIT(及时)编译,因此,作为一种脚本语言,它的性能仍可与C [ 10 ]之类的编译语言相媲美。

为什么选择MoonGen

作为一家抗DDoS公司,Qrator Labs需要开发,现代化和验证其防护解决方案。 为了测试这些,需要某种模仿真实攻击的流量生成器。 但是,要在OSI的L2,L3级别模仿危险但直接的泛洪攻击并非易事,因为要在流量生成中实现高性能可能很困难。

换句话说,DDoS缓解公司很自然地在孤立的实验室环境中模拟各种DoS攻击,以了解不同硬件设置的真实行为。

MoonGen是一种以最少的CPU内核生成NIC线速流量的方法。 与产生大量流量的许多其他方式相比,用户空间数据流极大地提高了此类(MoonGen + DPDK)堆栈的性能。 使用纯DPDK需要付出更多的努力,因此,我们的工作流程优化工作不会令您感到惊讶。 我们还维护原始MoonGen存储库的克隆[ 7 ],以扩展其功能并实施一些特定的测试。

为了获得最大的灵活性,数据包生成逻辑由用户定义的Lua脚本描述,这是MoonGen的主要功能之一。 在数据包处理相对简单的情况下,该解决方案似乎可以足够快地工作,以使单个CPU内核饱和10G接口。 处理传入数据包和制作新数据包的典型方法是处理相同类型的数据包并更改其多个字段。

考虑下面描述的l3-tcp-syn-ack-flood示例。 注意,在所有活动中,处理数据包的任何操作都可以在传入或先前生成的数据包所在的同一缓冲区中执行。 实际上,这种处理操作非常快,因为它们不需要昂贵的操作,例如系统调用,访问可能未缓存的内存等。

Qrator Labs硬件测试

硬件设定

Qrator Labs使用各种硬件维护着一个实验室。 这里是一些正在使用和测试的NIC示例:

  • 英特尔82599ES 10G
  • Mellanox ConnectX-4 40G
  • Mellanox ConnectX-5 100G

请注意,当我们处理10G以上的网络接口控制器时,性能问题就变得更加紧迫。 如今,似乎不可能通过单个CPU内核来饱和40G接口,尽管有几个内核足以做到这一点。

对于Mellanox NIC,可以使用制造商的调整指南[ 3 ]来调整设备的某些设置,以实现更高的性能,或者在某些情况下需要改变NIC的行为。 其他NIC制造商也为高性能设备提供了类似的文档,即使找不到,也可以直接与公司联系。 在我们的案例中,Mellanox的响应速度很快,可帮助我们在所需任务中实现100%的带宽利用率。

TCP SYN泛洪测试

l3-tcp-syn-ack-flood示例旨在模仿SYN泛洪攻击[ 6 ]。 它是MoonGen中央存储库中l3-tcp-syn-flood的扩展版本,由Qrator Labs在克隆的存储库中开发[7]。 我们的测试可以执行三种活动:

  1. 从头开始生成TCP SYN数据包流,其中包含一些字段,例如源IP地址,源端口号等。
  2. 根据TCP协议对每个接收到的SYN包进行有效的ACK应答;
  3. 根据TCP协议,对收到的每个ACK数据包进行有效的SYN-ACK答复。

例如,制作ACK回复的内循环样板代码如下所示:

https://github.com/QratorLabs/MoonGen/blob/master/examples/l3-tcp-syn-ack-flood.lua#L99

通常,制作回复的想法如下。 首先,从RX队列中提取一个数据包,然后检查接收到的数据包是否属于预期类型。 如果是,请通过修改原始数据包的某些字段来准备答案。 最后,使用相同的缓冲区将伪造的数据包放入TX队列。 为了提高性能,而不是一个一个地处理数据包,我们通过从RX队列中获取所有可用的数据包,精心设计各个答案并将它们放入TX队列中来汇总它们。 尽管单个数据包的操作数量相对较高,但由于Lua JIT将所有这些操作编译为几个CPU指令,因此性能仍然足够。 以相同的方式实现了许多其他测试,不仅是TCP SYN / ACK。

下表显示了在Mellanox ConnectX-4上运行的SYN泛洪测试(仅生成SYN而没有答复)的结果。 该NIC有两个40G端口,单个端口的理论峰值性能为59.52 Mpps,两个端口均为2 * 50 Mpps。 带有PCIe的特定NIC连接导致后者的带宽限制(仅2 * 50,而不是预期的2 * 59.52)。

SYN洪水测试; NIC:Mellanox Technologies MT27700系列( ConnectX-4 ),双40G端口; 处理器:Intel(R)Xeon(R)Silver 4114 CPU @ 2.20GHz

下表显示了在具有单个100G端口的Mellanox ConnectX-5上进行相同的SYN泛洪测试的结果。

SYN洪水测试; NIC:Mellanox Technologies MT27800系列( ConnectX-5 ),单个100G端口; 处理器:Intel(R)Xeon(R)Silver 4114 CPU @ 2.20GHz

注意,在所有这些情况下,只有少数几个CPU内核才能达到理论峰值性能的96%以上。

捕获PCAP文件中的传入流量

另一个示例是rx-to-pcap,它试图将所有传入流量保存到许多PCAP文件中[ 8 ]。 尽管此测试与数据包生成无关,但它可以证明以下事实:这种数据流中最薄弱的链接是文件系统:即使虚拟tmpfs文件系统也会减慢数据流的速度。 在这种情况下,需要8个CPU内核来利用14.88 Mpps,而仅一个内核就足以接收(以及丢弃或重定向)相同数量的流量。

下表显示了接收并保存在PCAP文件中的流量(以Mpps为单位),这些文件位于固态磁盘(第二列)或tmpfs文件系统(第三列)的ext2文件系统上。 。

Rx到pcap捕获测试; NIC: Intel 82599ES 10千兆位 ; CPU:英特尔(R)至强(R)CPU E5–2683 v4 @ 2.10GHz

MoonGen增强功能:任务管理器

我们还为MoonGen引入了扩展,它表示启动一组任务的另一种方法。 想法是将常规配置和特定于任务的选项分开以同时运行任意数量的各种任务(即Lua脚本)。 该实现在Qrator的存储库克隆中公开,并在其中进行了描述[ 9 ],让我们回顾一下。

较新的CLI界面允许一次启动许多不同的任务。 这是简介:

而且./build/tman -h提供了更多增强的帮助。

但是,普通任务Lua文件与tman接口不兼容。 tman的任务文件必须确定以下对象:

  • 函数configure(parser)描述任务的选项。
  • 函数task(taskNum,txInfo,rxInfo,args)描述正在运行的内容。 这里的txInfo和rxInfo分别是RX和TX队列的数组,args保留任务管理器和任务本身的参数。

请参阅examples / tman /中的示例。

使用任务管理器为运行异构任务提供了更大的灵活性。

结论

MoonGen方法看起来很满足我们的目标,因为它提供了高性能,同时仍使使用脚本语言编写的测试保持简单。 实现性能的主要原因是两个功能:直接NIC缓冲区访问和Lua中的JIT技术。

通常有可能达到NIC的理论峰值性能。 单个内核可能足以使10G端口饱和,而几个内核可能足以使100G端口饱和。

我们感谢Mellanox团队的合作以及MoonGen团队在错误修复方面的反应。

参考文献

  1. MoonGen:可编写脚本的高速数据包生成器— Paul Emmerich等人,2015年Internet测量会议(IMC'15),2015年
    https://www.net.in.tum.de/fileadmin/bibtex/publications/papers/MoonGen_IMC2015.pdf
  2. Pktgen http://netoptimizer.blogspot.com/2014/10/unlocked-10gbps-tx-wirespeed-smallest.html
  3. Mellanox调整指南: http : //www.mellanox.com/related-docs/prod_software/Performance_Tuning_Guide_for_Mellanox_Network_Adapters.pdf
  4. 数据平面开发套件: https : //www.dpdk.org/
  5. Lua: https//www.lua.org/
  6. SYN洪水: https//en.wikipedia.org/wiki/SYN_flood
  7. Qrator Labs的MoonGen存储库克隆: https : //github.com/QratorLabs/MoonGen
  8. PCAP文件格式: https//en.wikipedia.org/wiki/Pcap
  9. 任务管理器: https : //github.com/QratorLabs/MoonGen#using-tman-task-manager
  10. Lua性能: https : //nullprogram.com/blog/2018/05/27/
  11. 网络功能虚拟化白皮书: https : //portal.etsi.org/NFV/NFV_White_Paper.pdf
  12. NUMA,非统一内存访问: https : //en.wikipedia.org/wiki/Non-uniform_memory_access

From: https://hackernoon.com/userspace-traffic-generation-fe32e2bd97da

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值