云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

百度云_云存储高清智能摄像机_限时特惠

小七 141 0

L4Drop:XDP DDoS缓解

高效的数据包丢弃是Cloudflare分布式拒绝服务(DDoS)攻击缓解措施的关键部分。在这篇文章中,我们将在我们的数据包丢弃库中介绍一个新工具:L4放下。公开美国空军提供的域名图片我们在过去曾广泛报道过我们的DDoS缓解渠道,封面:Gatebot:分析影响我们边缘的流量,并部署与可疑点匹配的DDoS缓解措施traffic.bpf工具:生成Berkeley数据包筛选器(BPF)字节码匹配基于DNS查询、p0F签名或tcpdump的数据包过滤器.Iptables:将流量与使用xt_BPF模块的BPF工具生成的BPF相匹配,并删除它。闸门:在可能会压倒内核网络堆栈的大型攻击期间,从iptables卸载工作。传入的流量绕过内核直接进入用户空间中的BPF解释器,这将有效地丢弃与由BPF工具。两者都有iptables和Floodgate将接收到的流量样本发送到Gatebot进行分析,并使用bpftools生成的规则过滤传入的数据包。最后看起来像这:基于闸门DDoS缓解管道这条管道为我们提供了很好的服务,但自从我们实施了闸门之后,发生了很多变化。我们新的Gen9和ARM服务器使用的网络接口卡(NIC)与以前的服务器不同。这些新的网卡与Floodgate不兼容,因为它依靠专有的Solarflare技术将流量直接重定向到用户空间。时间终于到了向上.XDP为了拯救这个问题,Linux增加了一个新的替代内核旁路方法:eXpress Data Path(XDP)。XDP使用经典BPF指令集eBPF的扩展版本,允许对网卡驱动程序接收到的每个数据包运行任意代码。正如Marek所演示的,这可以实现高速数据包丢弃!eBPF引入了一系列新功能,其中:地图,eBPF程序和用户空间共享的键值数据结构。一个Clang eBPF后端,允许将相当大的C子集编译成eBPF。一个严格的内核验证器,静态分析eBPF程序,确保运行时性能和安全。比较对于我们的部分内核旁路,XDP不需要忙着轮询数据包。这使我们能够让基于XDP的解决方案"始终开启",而不是仅在攻击流量超过设定的阈值时才启用它。XDP程序也可以在多个CPU上运行,这可能允许处理比Floodgate更多的数据包,Floodgate被固定在一个CPU上以限制繁忙的影响轮询。更新我们的XDP管线图产量:基于XDPDDoS缓解管道引入L4DropAll的目的是将我们现有的规则转换为eBPF!乍一看,我们似乎应该能够将我们的规则存储在eBPF映射中,并且有一个单独的程序来检查传入的数据包。Facebook的防火墙实现了这一策略。这样可以方便地插入或删除规则用户空间。但是,由bpftools创建的过滤器很大程度上依赖于匹配任意数据包数据,以及跨报头执行任意比较。例如,单个p0f签名可以同时检查IP和TCP选项。除此之外,内核的eBPF验证器执行的彻底静态分析目前不允许循环。这个限制有助于确保给定的eBPF程序总是在一定数量的指令中终止。再加上任意匹配和缺少循环,我们无法将规则存储在地图。相反,我们编写了一个工具将Gatebot和bpftools生成的规则编译到eBPF中。这使得生成的eBPF能够与它需要的任何数据包数据相匹配,代价是:必须重新编译程序以添加或删除规则允许地达到内核使用多个规则所强制实施的eBPF代码复杂性限制C程序是根据Gatebot构建的规则生成的,并使用Clang编译成eBPF。剩下的就是重新实现iptables的特性我们使用.BPF支持我们有许多不同的工具来生成BPF过滤器,我们需要能够在L4Drop生成的eBPF中包含这些过滤器。虽然eBPF的名称可能暗示了BPF的一个小扩展,但指令集是不兼容的。事实上,BPF指令甚至没有到eBPF的一对一映射!这可以在内核的内部BPF到eBPF转换器中看到,其中一个BPF IP报头长度指令映射到6个eBPF说明。到为了简化转换,我们实现了一个BPF到C的编译器。这使得我们可以在L4Drop生成的上述C程序中包含任何BPF程序。例如,如果我们生成一个将DNS查询与example.com网站使用bpftools,我们得到:$./bpfgen dns--"*。example.com网站"18177 0 0 0 0 0 0 20 12 0 0 0,。。。转换成C,我们就结束了带:bool cbpf_0_0(uint8_t*数据,uint8_t*数据结束){__属性(未使用)uint32_t a,x,m[16];if(data+1>data_end)返回false;x=4*(*(数据+0)&0xf);...}每个BPF指令扩展为一个C语句,BPF寄存器(a、x和m)被模拟为变量。这有一个额外的好处,允许Clang优化整个程序。生成的C包括防止越界数据包访问所需的最小数量的保护,如内核。包samplingGatebot要求以给定的速率对服务器接收到的所有流量进行采样,然后发送出去进行分析。这包括丢弃的数据包。因此,我们必须在掉东西之前取样。值得庆幸的是,eBPF可以使用一组受限的helper函数调用内核,其中之一bpf xdp_event_output允许我们将数据包复制到perf event ring buffer。然后,用户空间守护进程从perf缓冲区读取数据包,从而获得数据包。再加上另一个助手bpf_get_prandom_u32(),以生成随机数,对数据包进行采样的C代码最终会得到如下结果://Threshold may>UINT32_MAXuint64_t rnd=(uint64_t)获取_prandom_u32();如果(rnd