zoukankan      html  css  js  c++  java
  • eBPF初探

    本文主要参考eBPF的简史

    BPF是什么

    BPF是一个用于过滤(filter)网络报文(packet)的架构,BPF是tcpdump 抑或 wireshark 乃至网络监控(Network Monitoring)领域的基石。

    BPF 的两大核心功能

    • 过滤(Filter): 根据外界输入的规则过滤报文

    • 复制(Copy):将符合条件的报文由内核空间复制到用户空间

    • Tcpdump 工作流程

    可见tcpdump使用的libpcap是基于BPF的,在使用tcpdump或者libpcap时传入的“host 192.168.1.1”、“tcp and port 80”等是过滤表达式。
    位于内核之中的 BPF 一方面接受 tcpdump 经由 libpcap 转码而来的滤包条件(Pseudo Machine Language) ,另一方面也将符合条件的报文复制到用户空间最终经由 libpcap 发送给 tcpdump。过滤表达式会被编译成BPF指令,在tcpdump命令后面加上-d参数可以看到,这些BPF指令是在内核中被BPF解释执行的。

    BPF的缺点

    BPF 采用的报文过滤设计的全称是 CFG(Computation Flow Graph),顾名思义是将过滤器构筑于一套基于 if-else 的控制流(flow graph)之上,基于伪代码的设计却也增加了系统的复杂性:一方面伪指令集已经足够让人眼花缭乱的了;另一方面为了执行伪代码,内核中还需要专门实现一个虚拟机(pseudo-machine),这也在一定程度上提高了开发和维护的门槛。

    BPF的优点

    BPF的设计者在tcpdump中设计了现在常见的过滤表达式,提升了易用性。另一方面,由于设计目标只是过滤字节流形式的报文,虚拟机及其伪指令集的设计相对会简单不少:整个虚拟机只实现了两个 32 位的寄存器,分别是用于运算的累加器 A 和通用寄存器 X;且指令集也只有 20 来个

    eBPF是什么

    • eBPF全称:extended Berkeley Packet Filter,是BPF 的进化。
    • eBPF是kernel 3.15中引入的全新设计,将原先的BPF发展成一个指令集更复杂、应用范围更广的“内核虚拟机”
    • BPF 提供了强大的网络包过滤规则,可以确定应该检查哪些流量、忽略哪些流量等,而内核近几年发展的 Extended BPF, eBPF 实际上将应用范围,处理效率进行了更新。

    eBPF的革新

    • 原先的BPF依然支持,用cBPF指代。eBPF全新设计了更丰富的指令集、增加了寄存器,性能大幅提高
    • 用 C 写成的 BPF 代码;
    • 基于 map 的内核与用户空间的交互方式;
    • 全新的开发接口;
      除此之外,还有一些不那么明显的改进隐藏在内核之中:
    • 全新的伪指令集设计;
    • In-kernel verifier;

    eBPF的功能

    • 通过一个内核内置的字节码虚拟机,完成数据包过滤、调用栈跟踪、耗时统计、热点分析等等高级功能。

    eBPF的优点

    • 告别了纯汇编开发的方式,利用C一类高级语言书写
    • eBPF适合编写网络程序,将该网络程序附加到网络socket,进行流量过滤,流量分类以及执行网络分类器的动作。eBPF程序甚至可以修改一个已建链的网络socket的配置。XDP工程会在网络栈的底层运行eBPF程序,高性能地进行处理接收到的报文。
    • 在加载eBPF程序前会进行大量的校验,以避免一些安全性和稳定性的风险。例如,程序不允许包含控制循环;程序不会尝试执行超过内核允许的最大指令数的指令;程序不包含任何无法访问的指令,如从未执行过的条件或功能,以防止在VM中加载无效代码;程序也不会尝试越界

    基于eBPF的项目

    • bcc
      BCC是用于创建基于eBPF的高效内核跟踪和操作程序的工具包,其中包括一些有用的命令行工具和示例。 BCC简化了用C进行内核检测的eBPF程序的编写,包括LLVM的包装器以及Python和Lua的前端。它还提供了用于直接集成到应用程序中的高级库。

    • bpftrace

    bpftrace是Linux eBPF的高级跟踪语言。它的语言受awk和C以及DTrace和SystemTap等以前的跟踪程序的启发。 bpftrace使用LLVM作为后端将脚本编译为eBPF字节码,并利用BCC作为与Linux eBPF子系统以及现有Linux跟踪功能和连接点进行交互的库。

    • Cilium

    Cilium是一个开源项目,提供基于eBPF的联网,安全性和可观察性。它是从头开始专门设计的,旨在将eBPF的优势带入Kubernetes的世界,并满足容器工作负载的新可伸缩性,安全性和可见性要求。

    • Falco

    Falco是一种行为活动监视器,旨在检测应用程序中的异常活动。 Falco在eBPF的帮助下审核Linux内核层的系统。它使用其他输入流(例如容器运行时度量标准和Kubernetes度量标准)丰富了收集的数据,并允许连续监视和检测容器,应用程序,主机和网络活动。

    • Katran

    Katran是一个C ++库和eBPF程序,用于构建高性能的第4层负载平衡转发平面。 Katran利用Linux内核中的XDP基础结构来提供用于快速数据包处理的内核功能。它的性能与NIC接收队列的数量成线性比例,并且使用RSS友好的封装转发到L7负载平衡器。

    还有很多内容在参考文献中不一一摘抄了,具体操作还未实践,已查找到相关资料ebpf 学习梳理和测试使用

    参考文献

    eBPF的简史
    Linux内核功能eBPF入门学习(一)
    eBPF
    ebpf 学习梳理和测试使用

  • 相关阅读:
    2dsphere索引
    geoNear查询 near查询的升级版
    geoWithin查询 多边形查询
    [TJOI2013]最长上升子序列
    「bzoj3956: Count」
    「bzoj3687: 简单题」
    「SDOI2008沙拉公主的困惑」
    郑州Day6
    「Luogu-U18201」分析矿洞
    【[COCI2011-2012#5] POPLOCAVANJE】
  • 原文地址:https://www.cnblogs.com/2002ljy/p/13950316.html
Copyright © 2011-2022 走看看