eBPF和XDP基础知识 您所在的位置:网站首页 发电机Xdp是什么 eBPF和XDP基础知识

eBPF和XDP基础知识

#eBPF和XDP基础知识| 来源: 网络整理| 查看: 265

eBPF和XDP基础知识 什么是eBPF,什么是XDP

eBPF是Berkeley Packet Filter(BPF)的扩展版本(传统的BPF即cBPF)。它是在Linux内核中运行的抽象虚拟机 (VM),就像Java虚拟机(JVM)可以在受控环境中运行应用程序一样。eBPF可以在内核的沙箱内执行用户自定义的程序,它通常用在Linux中编写低级监控、跟踪或网络程序。

eXpress Data Path(XDP)是一个框架,可以在BPF应用程序中执行高速数据包处理。为了更快地响应网络操作,XDP会尽快运行BPF程序,通常是在网络接口接收到数据包后立即运行。

XDP对eBPF的需要

XDP是一种允许开发人员将eBPF程序附加到低级钩子的技术,是Linux内核中的网络设备驱动程序以及在设备驱动程序之后运行的通用钩子实现。

XDP可用于在eBPF架构中实现高性能数据包处理,主要使用内核旁路技术。这大大减少了内核所需的开销,因为它不需要处理上下文切换、网络层处理、中断等。网络接口卡(NIC)的控制被转移到eBPF程序。如果你需要更高的网络速度(10 Gbps及以上)工作,这一点尤其重要。

但是,内核绕过方法有一些缺点:

eBPF程序必须编写自己的驱动程序,这为开发人员创造了额外的工作。 XDP程序在数据包被解析之前运行,这意味着eBPF程序必须直接实现他们完成工作所需的功能,而不依赖于内核。

这些限制产生了对XDP的需求。XDP通过允许eBPF程序直接读取和写入网络数据包数据,并在到达内核级别之前确定如何处理数据包,使得在eBPF中实现高性能网络变得更加容易。

XDP的工作原理

XDP程序可以直接连接到网络接口。每当在网络接口上接收到一个新的数据包时,XDP程序都会收到一个回调,并且可以非常快速地对数据包执行操作。

可以使用以下模型将XDP程序加载到接口:

通用XDP – XDP程序作为普通网络路径的一部分加载到内核中。这并不提供全部的性能优势,但它是一种测试XDP程序或在不为XDP提供特定支持的通用硬件上运行它们的简单方法。 Native XDP – XDP程序由网卡驱动程序加载,作为其初始接收路径的一部分。这也需要网卡驱动的支持。 Offloaded XDP – XDP程序直接加载到NIC上,并且不使用CPU执行。这需要网络接口设备的支持。

以下是XDP程序在连接到网络接口后可以对其接收的数据包执行的一些操作:

XDP_DROP – 丢弃且不处理数据包。eBPF程序可以分析流量模式并使用过滤器实时更新XDP应用程序以丢弃特定类型的数据包(例如,恶意流量)。 XDP_PASS – 指示应将数据包转发到正常网络堆栈以进行进一步处理。XDP程序可以在此之前修改包的内容。 XDP_TX – 将数据包(可能已被修改)转发到接收它的同一网络接口。 XDP_REDIRECT – 绕过正常的网络堆栈并通过另一个NIC将数据包重定向到网络。 XDP典型用例

以下是eBPF中XDP的一些常见用例。

DDoS缓解和防火墙

eBPF中XDP的基本功能之一是使用XDP_DROP,它告诉驱动程序在早期丢弃数据包。这使您可以应用各种有效的网络策略,同时保持每个数据包的成本非常低。

这对于需要处理任何类型的DDoS攻击的情况非常有用,但更一般地说,使用XDP,eBPF可以以很少的开销实现任何类型的防火墙策略。XDP可以处理这些情况,例如,通过清理非法流量并使用XDP_TX将合法数据包转发到它们的目的地。

XDP既可以部署在独立的网络设备中,也可以分布到保护主机的多个节点上。后一种情况可以使用XDP_PASS或cpumap XDP_REDIRECT来实现。为了提高性能,您可以使用卸载的XDP,它将每个数据包已经很小的成本完全转移到以线速处理的NIC。

转发和负载均衡

XDP的另一个主要用例是使用XDP_TX或XDP_REDIRECT操作进行数据包转发和负载平衡。数据包可以被运行在XDP层上的BPF程序操作。BPF助手——BPF程序用来与系统或它们运行的​​上下文交互的函数——可用于增加或减少数据包的净空,在发送回数据包之前封装和解封装数据包。

实现负载均衡器的常用方法有两种:

您可以使用XDP_TX使用接收数据包的同一NIC转发数据包 您可以使用XDP_REDIRECT将数据包转发到不同的网络接口

监控和流量采样

XDP通常用于数据包监控、采样和其他形式的网络分析。例如,它可用于监控终端主机路径中的中间节点上的流量,或与上述任何用例结合使用。

对于复杂的数据包分析,XDP将网络数据包(截断或完整的有效负载)和自定义元数据映射到eBPF程序。这也可以支持仅分析流中的初始数据,然后在确定流量合法时绕过监控的情况。

BPF和XDP提供的灵活性让您可以实现任何类型的自定义监控或采样。

运行你的第一个XDP程序

第1步:安装开发环境

使用以下代码安装所需的软件包:

$ sudo apt install clang llvm gcc libbpf libbpf-dev libxdp libxdp-dev xdp-tools bpftool linux-headers-`uname -r`

第2步:编写一个简单的XDP程序 以下C程序(源文件名xdp_drop.c)使用xdp_drop命令丢弃所有数据包。

#include #include SEC("xdp_drop") int xdp_drop_prog(struct xdp_md* ctx) { return XDP_DROP; } char _license[] SEC("license") = "GPL";

包含linux/bpf.h头文件提供了对XDP命令的访问。SEC宏将编译对象的一部分放在可执行和可链接格式(ELF)文件的特定部分中。

第3步:构建eBPF程序

您可以使用clang实用程序来构建程序,如下所示:

$ clang -O2 -g -Wall -target bpf -c xdp_drop.c -o xdp_drop.o 如果报`fatal error: 'asm/types.h' file not found`错误,则cp -rf /usr/include/asm-generic /usr/include/asm 如果报`fatal error: 'bpf/bpf_helpers.h' file not found`错误,则apt install libbpf-dev安装依赖

您可以使用命令llvm-objdump显示由clang命令生成的ELF代码。-h标志允许您显示对象中的所有部分。

$ llvm-objdump-14 -h xdp_drop.o xdp_drop.o: file format elf64-bpf Sections: Idx Name Size VMA Type 0 00000000 0000000000000000 1 .strtab 000000e7 0000000000000000 2 .text 00000000 0000000000000000 TEXT 3 xdp_drop 00000010 0000000000000000 TEXT 4 license 00000004 0000000000000000 DATA 5 .debug_abbrev 000000bd 0000000000000000 DEBUG 6 .debug_info 000000cd 0000000000000000 DEBUG 7 .rel.debug_info 00000040 0000000000000000 8 .debug_str_offsets 00000068 0000000000000000 DEBUG 9 .rel.debug_str_offsets 00000180 0000000000000000 10 .debug_str 0000010f 0000000000000000 DEBUG 11 .debug_addr 00000018 0000000000000000 DEBUG 12 .rel.debug_addr 00000020 0000000000000000 13 .BTF 000001f5 0000000000000000 14 .rel.BTF 00000010 0000000000000000 15 .BTF.ext 00000050 0000000000000000 16 .rel.BTF.ext 00000020 0000000000000000 17 .debug_frame 00000028 0000000000000000 DEBUG 18 .rel.debug_frame 00000020 0000000000000000 19 .debug_line 0000008c 0000000000000000 DEBUG 20 .rel.debug_line 00000070 0000000000000000 21 .debug_line_str 00000052 0000000000000000 DEBUG 22 .llvm_addrsig 00000002 0000000000000000 23 .symtab 00000120 0000000000000000

第4步:加载BPF程序

在继续之前,使用Linux veth(虚拟以太网设备)进行测试很重要。因此如果您在默认接口上运行它,您将失去连接(测试程序会丢弃所有数据包)。

$ sudo ip link add veth1 type veth peer name veth0 $ sudo ifconfig veth1 up $ sudo ifconfig veth0 up

你可以像这样加载BPF对象:

$ sudo ip link set veth1 xdpgeneric obj xdp_drop.o sec xdp_drop

但是,此方法不支持更高级操作所需的类型映射(使用BTF格式)。要启用它,您可以使用xdp-loader实用程序。

这是使用xdp-loader在veth接口上加载对象的方法。-m sbk标志用于通用XDP加载,它不需要兼容的硬件设备。

$ sudo xdp-loader load -m skb -s xdp_drop veth1 xdp_drop.o

第5步:显示运行BPF程序的状态

根据您运行BPF对象的方式,将运行一个程序(如果您使用ip命令)或两个程序(如果您使用xdp-loader,它同时运行加载程序实用程序本身和您的自定义程序)。

以下是如何在您的虚拟以太网接口上显示正在运行的BPF程序和活动。

$ sudo bpftool prog show 367: xdp name xdp_drop_prog tag 57cd311f2e27366b gpl loaded_at 2022-07-07T22:04:03+0800 uid 0 xlated 16B jited 18B memlock 4096B btf_id 129 $ sudo ip link show veth1 5: veth1@veth0: mtu 1500 xdpgeneric qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether ea:44:54:a8:8d:62 brd ff:ff:ff:ff:ff:ff prog/xdp id 367 tag 57cd311f2e27366b jited

xdp-loader实用程序有自己的状态命令,可以显示当前运行的XDP程序。

$ sudo xdp-loader status

第6步:卸载XDP程序

如果您使用ip命令加载程序,请像这样卸载它。请注意,您应该使用加载程序时使用的相同标志。

$ sudo ip link set veth1 xdpgeneric off

如果您使用xdp-loader来卸载XDP程序,请使用以下命令:

$ sudo xdp-loader unload -a veth1

第 7 步:执行更高级的操作

现在您已了解如何创建和加载最小的XDP程序,请参阅下面的代码,该代码分析流量并仅丢弃IPv6数据包。

#include #include #include #include SEC("xdp_drop") int xdp_drop_prog(struct xdp_md* ctx) { void* data_end = (void*)(long)ctx->data_end; void* data = (void*)(long)ctx->data; struct ethhdr* eth = data; __u16 h_proto; if (data + sizeof(struct ethhdr) > data_end) return XDP_DROP; h_proto = eth->h_proto; if (h_proto == htons(ETH_P_IPV6)) return XDP_DROP; return XDP_PASS; } char _license[] SEC("license") = "GPL"; Calico eBPF数据平面

Calico提供对多个数据平面的支持,包括标准Linux、Windows HNS和Linux eBPF。与标准Linux网络数据平面相比,Calico的eBPF数据平面可扩展到更高的吞吐量,每GBit使用的CPU更少,并且对Kubernetes服务具有原生支持(无需kube-proxy)。

数据平面对Kubernetes服务的原生支持实现了以下目标:

减少数据包到服务的第一个数据包延迟 将外部客户端源IP地址一直保留到pod 支持直接服务器返回(DSR)以实现更高效的服务路由 使用比kube-proxy更少的CPU来保持数据平面同步

使用Calico,你可以轻松加载和卸载eBPF数据平面以满足您的需求。Calico使您能够根据需要利用eBPF,作为构建Kubernetes集群安全性的额外控制。

除了Calico目前支持的三个数据平面之外,还计划在不久的将来增加对更多数据平面的支持,包括矢量数据包处理 (VPP)。 Calico让用户决定什么最适合他们需要做的事情。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有