ddos攻击是啥意思 DDoS是什么意思( 三 )



传统Linux内核读取数据包使用中断模式驱动首先当数据包到达网卡后,网卡产生硬中断,将网卡加入到轮询输入数据包的网卡队列中,然后关闭硬中断并开启软中断,此时硬中断处理结束,软中断被激活后轮询设备,读取指定量的数据包后清空设备队列,至此结束软中断 。对于在大流量下的服务器来说会在硬中断和软中断上浪费大量的时间,所以DPDK采用轮询模式驱动,收到数据包后直接通过DMA方式传送到预分配内存并直接处理,避免了中断下文切换开销,对于高并发大流量的系统来说会极大的提高数据包处理效率和性能 。另外DPDK的轮询模式驱动还用到了用户空间设备驱动程序(Userspace I/O, uio),将绝大部分程序放到用户空间实现,减少了内核空间的程序,使得uio的开发与维护都很方便,避免了过度依赖内核版本导致开发调试复杂 。DPDK在使用uio的同时还利用mmap技术将网卡缓存映射到用户空间,使得报文不需要经过内核空间处理,减少了报文从内核空间到用户空间的拷贝 。
传统Linux内核的多核系统中运行程序会使用负载均衡机制,即某个进程在哪个核中运行是不确定的,内核根据各CPU负载情况来统一调度,这样会造成一个进程在运行过程中会在各CPU之间频繁切换,导致资源开销增大 。此外切换CPU时从内存中预先获取的CPU Cache也会失效,降低了CPU Cache的命中概率 。DPDK利用线程的CPU亲和绑定机制使得特定任务能够被指定在某个特定的核上执行,这样可避免线程在不同核之间频繁转换而导致的因cache miss和cachewrite back造成的性能损失 。
检测是否为 slow header 攻击的demo , 通过是否包含连续的两个 rn 来进行判断
int process_http_pkt(
struct FeatureExtractCoreConfig* config, uint32_t src_ip, uint16_t http_payload_len,uint8_t* http_payload){
uint8_t atk_type = -1;
char* find = strstr(http_payload, “rnrn”);
if(find == NULL){
atk_type = ATK_TYPE_HTTP_POST;
}else{
switch (http_payload[0]){
case ‘G’:
atk_type = ATK_TYPE_HTTP_GET;
break;
case ‘P’:
atk_type = ATK_TYPE_HTTP_POST;
break;
default:
break;
}
}
if(atk_type != -1){
update_feature(config->featureTableList[atk_type], src_ip, http_payload_len);
}
return 0;
}
开源的基于DPDK的 抗D工具:
https:http://github.com/AltraMayor/gatekeeper
使用XDP进行DDOS拦截在计算机网络中,Hook钩子在操作系统中用于在调用前或执行过程中拦截网络数据包 。Linux内核中暴露了多个钩子,BPF程序可以连接到这些钩子上,实现数据收集和自定义事件处理 。XDP全称为eXpress Data Path,是Linux内核网络栈的最底层 。它只存在于RX路径上,允许在网络设备驱动内部网络堆栈中数据来源最早的地方进行数据包处理,在特定模式下可以在操作系统分配内存(skb)之前就已经完成处理 。XDP暴露了一个可以加载BPF程序的网络钩子 。在这个钩子中,程序能够对传入的数据包进行任意修改和快速决策,避免了内核内部处理带来的额外开销 。基于XDP实现高效的防DDoS攻击,其本质上就是实现尽可能早地实现「丢包」,而不去消耗系统资源创建完整的网络栈链路,即「early drop」 。

XDP暴露的钩子具有特定的输入上下文,它是单一输入参数 。它的类型为 struct xdp_md,在内核头文件bpf.h 中定义,具体字段如下所示:
*/
struct xdp_md {
__u32 data;
__u32 data_end;
__u32 data_meta;
/* Below access go through struct xdp_rxq_info */
__u32 ingress_ifindex; /* rxq->dev->ifindex */
__u32 rx_queue_index; /* rxq->queue_index */
};
程序执行时,data和data_end字段分别是数据包开始和结束的指针,它们是用来获取和解析传来的数据,第三个值是data_meta指针,初始阶段它是一个空闲的内存地址,供XDP程序与其他层交换数据包元数据时使用 。最后两个字段分别是接收数据包的接口和对应的RX队列的索引 。当访问这两个值时 , BPF代码会在内核内部重写,以访问实际持有这些值的内核结构struct xdp_rxq_info 。
在处理完一个数据包后,XDP程序会返回一个动作(Action)作为输出,它代表了程序退出后对数据包应该做什么样的最终裁决,也是在内核头文件bpf.h 定义了以下5种动作类型:
enum xdp_action {
XDP_ABORTED = 0, http:// drop packet while raising an exception
XDP_DROP, http:// drop packet silently
XDP_PASS, http:// Allow further processing by the kernel stack
XDP_TX, http:// Transmit from the interface it came from

推荐阅读