为什么要学习eBPF
网络抓包工具tcpdump相信大家都用过,通过tcpdump可以定位网络传输问题,但是要控制包的传输,tcpdump就无能为力了。但是借助bcc、bpftrace工具可以解决很多网络问题, tcpdump/bcc都是基于BPF/eBPF技术实现的。
eBPF简介
eBPF全称是扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter),是一种数据包过滤技术。BPF提供一种安全注入代码的机制来实现对内核的控制,eBPF是扩展后的BPF, 默认现在内核运行的都是eBPF,即我们所说的BPF就是eBPF;eBPF借助即时编译器,在内核中运行了一个虚拟机,保证被安全编译过的eBPF指令才会被内核执行。基于内核社区提供的libbpf可以开发新的eBPF程序,屏蔽 直接调用内核函数。
eBPF发展
1992年,Steven McCanne和Van Jacobson发布的论文为BSD操作系统带来BPF包过滤技术 1997年,Linux 2.1.75 引入BPF技术 2011年,Linux 3.0增加BPF即时编译器(JIT),优化了BPF指令运行效率 2014年,Alexei Starovoitov将BPF扩展为一个通用虚拟机,即eBPF;在4.x内核中进行了数据包过滤事件扩展 2015年,BCC提供大量基于eBPF的工具和库,简化eBPF程序的开发。Linux 4.1支持kprobe和cls_bpf 2016年,Linux 4.7-4.10,丰富了eBPF事件源,支持跟踪点、XDP;第一个支持eBPF的k8s cni项目Cilium发布 2017年,BPF成为内核独立子模块,支持kTLS、bpftool、libbpf等,大公司将eBPF用于实战 2018年,BPF增加调试信息支持;Cilium发布1.0版本,bpftrace、bpffiler项目发布 2019年,BPF支持尾调用和热更新,GCC也支持BPF编译。Cilium 1.6发布基于BPF的kube-proxy实现,取代iptables 2020年,Google、Facebook为BPF增加LSM、TCP拥塞控制支持;微软基于eBPF为windows监控工具Sysmon增加linux支持 2021年,BPF开始支持内核函数调用,eBPF生态非常活跃;微软发布Window eBPF,与Facebook、Google、Lsovalent、Netfilx等一起成立eBPF基金会; Cilium发布基于eBPF的Server Mesh(将Sidecar proxy模型替换成了Kernel模型)
eBPF工作原理
eBPF不像进程、线程启动后一直运行在后台,它需要事件触发后才能运行。事件包括:系统调用、内核跟踪点、内核函数/用户函数的调用退出、网络事件等,通过内核态 插桩(kprobe)、用户态插桩(uprobe),eBPF程序可以在内核和应用的任意位置点插桩。如此强大的能力,内核如何保证eBPF程序是安全稳定的呢?来看下eBPF程序的执行过程
环境搭建
内核升级(Centos 7系统)
导入仓库源,提供ml与lt两种内核类型
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
kernel-ml中的ml是英文[mainline stable]的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本 kernel-lt中的lt是英文[long term support]的缩写,elrepo-kernel中罗列出来的长期支持版本
查看ml软件包
yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml
安装ML版本
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
查看现有内核启动顺序
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (6.0.3-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-cab9605edaa5484da7c2f02b8fd10762) 7 (Core)
修改默认启动顺序,再次查看内核启动顺序
grub2-set-default 0
重启,检查内核版本
# reboot -f
# uname -r
参考链接
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付