赞
踩
eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,其在内核中的实现为一个基于寄存器的虚拟机,使用自定义的 64 位 RISC 指令集,运行本地即时编译(JIT)的 “BPF 程序, 并能访问内核功能和内存的一个子集。
参考链接:探索eBPF:Linux内核的黑科技
eBPF 是一个在内核中运行的虚拟机,它所有的接口都是通过 BPF 系统调用来跟内核进行交互,eBPF 程序通过 LVM 和 Cline 进行编译,产生 eBPF 的字节码,通过 BPF 系统调用,加载到内核,验证代码的安全性,从而通过 JIT 实时的转化成 Native 的 X86 的指令。很多架构 (x86-64, SPARC, PowerPC, ARM, arm64, MIPS, and s390)已经支持即时(JIT)编译。
对eBPF来说,是通过特定的Hook点监听内核中的特定事件,进而执行用户定义的处理。这些Hook点包括:
针对主要是监控、跟踪使用的eBPF应用来说,主要通过这种方式取得内核运行时的一些参数和统计信息。
参考链接:
ebpf深入理解和应用介绍
Kernel调试追踪技术之 eBPF on ARM64
eBpf对内核配置的依赖:
CONFIG_DEBUG_INFO_BTF=y
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_CLS_ACT=y
CONFIG_BPF_JIT=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
kprobes Kretprobes是linux系统的一个动态调试机制,使用它可以向内核添加探针(Probe),在代码执行前或执行后触发一个回调函数。这个机制通常用于调试内核代码,跟踪应用程序执行或收集性能统计信息。通过使用kprobe,开发人员可以在不影响系统运行逻辑的情况下,对操作系统进行深入的分析和调试。
它的基本工作机制是:用户指定一个探測点。并把一个用户定义的处理函数关联到该探測点。当内核运行到该探測点时,对应的关联函数被运行。然后继续运行正常的代码路径。
参考链接:https://zhuanlan.zhihu.com/p/645909745
根据BPF程序的主要目的,可以将其分为两类。一类是跟踪,一类是网络。
BPF kprobe程序类型允许使用BPF程序作为kprobe的处理程序,当被检测内核函数触发时,执行BPF程序,程序类型被定义为BPF_PROG_TYPE_KPROBE。kprobe 是动态附加到内核调用点的函数,编写附加到kprobe模块上的BPF程序时,需要确定BPF程序的执行时机,也就是确定BPF程序是在内核函数调用开始时执行,还是内核函数调用结束返回时执行。
如果是在内核函数调用开始时执行BPF程序,我们可以设置BPF程序的SEC为:
SEC(“kprobe/内核函数”)
如果是在内核函数调用结束返回时执行BPF程序,我们可以设置BPF程序的SEC为:
SEC(“kretprobe/内核函数”)
参考链接:https://blog.csdn.net/qq_34258344/article/details/114522060
在 Linux 5.7 引入 BPF LSM 后,系统开发人员已经能够自由地实现函数粒度的安全检查能力,可通过SEC(“lsm/socket_connect”)的方式对lsm函数进行挂载。
程序主要功能为通过lsm的socket_connect接口,实现禁止链接IP:1.1.1.1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。