xdp-ebpf 简介
根据众多博客资料,言简意赅的介绍xdp-ebpf. 小白一个,个人理解。勿喷!
1、bfp:
Berkeley Packet Filter, 用于过滤filter 网络报文packet的架构。
是tcpdump(linux)和wireshark(windows)乃至网络监控(network monitoring)领域的基石。
其背后的思想是:“与其把数据包复制到用户空间执行用户态程序过滤,不如把过滤程序灌进内核去”
简单来讲,BPF是一套完整的计算机体系结构 。和x86,ARM这些类似,BPF包含自己的指令集和运行时逻辑,同理,就像在x86平台编程,
最终要落实到x86汇编指令一样,BPF字节码也可以看成是汇编指令的序列。我们通过tcpdump的-d/-dd参数可见一斑:
[root@localhost ~]# tcpdump -i any tcp and host 1.1.1.1 -d
(000) ldh [14]
(001) jeq #0x86dd jt 10 jf 2
(002) jeq #0x800 jt 3 jf 10
(003) ldb [25]
(004) jeq #0x6 jt 5 jf 10
(005) ld [28]
(006) jeq #0x1010101 jt 9 jf 7
(007) ld [32]
(008) jeq #0x1010101 jt 9 jf 10
(009) ret #262144
(010) ret #0
[root@localhost ~]#
bpf的核心功能包括:
a)过滤filter:根据外界输入的规则过滤报文;
b) 复制copy:将符合条件的报文由内核空间复制到用户空间
以tcpdump为例:
位于内核之中的 BPF 模块是整个流程之中最核心的一环:
它一方面接受 tcpdump 经由 libpcap 转码而来的滤包条件(Pseudo Machine Language) ,
另一方面也将符合条件的报文复制到用户空间最终经由 libpcap 发送给 tcpdump。
bpf设计
途经网卡驱动层的报文在上报给协议栈的同时会多出一路来传送给BPF,再经后者过滤后最终拷贝给用户态的应用。
2、eBPF
eBPF是最新加入linux内核模块,源于bpf,后来加入了JIT, 使得它实际上成了一个虚拟机。
eBPF 程序支持自己的字节码语言,基于该字节码语言编译成内核原生代码,就像 BPF 程序一样。
eBPF在内核中运行。
eBPF 程序对内核内存访问是有限制的。只能通过内核提供的函数去获取严格限制的必须的内存。
eBPF可以和User空间的程序通过 BPF Map进行通讯。
eBPF 必须编译成字节码才能使用。
3、bcc
直接手写ebpf字节码显得非常笨拙又低效,于是人们开始使用c语言直接编写ebpf程序,然后使用编译器将其编译成为eBPF字节码。
目前支持eBPF字节码的编译器只有llvm,即使是gcc编译过的内核bpf范例调用也要通过llvm编译后才能执行。直接对ebpf编程还是非常困难,
为了便于使用,出现了很多ebpf框架便于我们使用,如bcc和bpftrace。
4、xdp
如何用eBPF实现一个学习型网桥: https://www.hy-print.com/licai/69858.html
XDP, eXpress Data Path, 它其实是位于网卡驱动程序里的一个快速处理包的HOOK点。
为什么快?
--数据包处理位于非常底层(在网卡的驱动程序处),避免了很多内核skb处理开销(socket buffer, 数据包的管理结构);可以将很多处理逻辑offload到网卡硬件。
--显而,在XDP这个HOOK点灌进来一点eBPF字节码,将是一件令人愉快的事情。
5、流程图
XDP_DROP:使用XDP进行丢弃的速度很快,缓冲区只是回收到rx环形队列
XDP_PASS:可能在修改后传递到普通网络堆栈
XDP_TX:修改包后,发送相同的NIC包
XDP_REDIRECT:使用XDP程序中的XDP_REDIRECT操作,该程序可以将入口帧重定向到其他启用XDP的netdev
注:用户态的程序通过响应 perf-event 事件进行收包,即使是在XDP_DROP动作下。
通常就是设置xdp_drop 动作下,来进行高速抓包。其他动作会影响性能。
推荐>
【超全】深入理解 BPF:一个阅读清单 https://linux.cn/article-9507-1.html
github 源码:
https://github.com/cloudflare/xdpcap
https://github.com/xdp-project/xdp-tutorial/
xdp-ebpf 简介相关推荐
- XDP/eBPF — eBPF
目录 文章目录 目录 eBPF 诞生的背景 eBPF eBPF 与 cBPF 的区别 eBPF 与 Kernel 的区别 eBPF 的逻辑框架 eBPF 的运行原理 eBPF 的整体设计 eBPF J ...
- XDP/eBPF — 架构设计
目录 文章目录 目录 XDP 的架构设计 XDP 的包处理 XDP 程序示例 XDP 的架构设计 XDP 总体设计包括以下几个部分: XDP 驱动:是网卡驱动中的一个 XDP 程序的挂载点,每当网卡接 ...
- 实现基于XDP/eBPF的快速路由转发功能
周末用eBPF实现了学习型网桥的XDP快速转发路径之后,再来用eBPF实现一个快速路由转发.同样很有意思. 关于eBPF和XDP的前置基础知识,我在前面实现网桥转发路径前已经概览过了,所以本文不再赘述 ...
- XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性
目录 文章目录 目录 eBPF 的可观测性架构 版本支持 BCC 60s 系列 BPF 版本 生成火焰图 排查网络调用来源 eBPF 的可观测性架构 BPF 观测技术相关的程序程序类型可能是 kpro ...
- XDP/eBPF — Overview
目录 文章目录 目录 XDP XDP 设计原则 XDP技术优势 XDP 的工作模式 XDP 的适用场景 XDP v.s. DPDK XDP XDP(eXpress Data Path,快速数据面)是 ...
- XDP/eBPF — BPF
目录 文章目录 目录 BPF 的诞生背景 BPF BPF 的运行架构 BPF 的诞生背景 在没有 BPF(Berkeley Packet Filter,伯克利包过滤器)之前,当 Userspace 的 ...
- Linux eBPF和XDP高速处理数据包;使用EBPF编写XDP网络过滤器;高性能ACL
目录 eBPF和XDP以裸机速度处理数据包 通过网络堆栈的入口数据包流 XDP构造 在Go中编程XDP 结论 使用EBPF编写XDP网络过滤器 01.简介 02.什么是XDP 03.示例问题 04. ...
- DPDK and XDP and ebpf
另外除了以下文章还有个ebpf https://qiita.com/sg-matsumoto/items/8194320db32d4d8f7a16 图片上传有问题,原文参考 https://cloud ...
- eBPF.io eBPF文档:扩展的数据包过滤器(BPF)
目录 什么是eBPF? 安全 跟踪和分析 联网 可观察性与监控 什么是eBPF.io? eBPF简介 挂钩概述 eBPF程序如何编写? 加载程序和验证架构 地图 辅助呼叫 尾部和函数调用 eBP ...
- 云原生安全攻防|使用eBPF逃逸容器技术分析与实践
作者:pass.neargle @ 腾讯安全平台部 前言 容器安全是一个庞大且牵涉极广的话题,而容器的安全隔离往往是一套纵深防御的体系,牵扯到AppArmor.Namespace.Capabiliti ...
最新文章
- 结合项目实例 回顾传统设计模式(九)迭代器模式
- centos6 安装 mantisbt-1.2.8 —— (3)Linux系统下yum源配置(Centos 6)
- m叉树的叶子节点数量
- OPA 21 - enter test case by testNumber
- opencv中的imwrite如何保存_如何把公众号的文章用文档保存到电脑中?
- Neo4j Java Rest绑定入门(Heroku部署)
- Docker制作镜像(四)
- QT中使用全局变量在多个源程序中传递变量
- 20. PHP 表单验证 - 验证 E-mail 和 URL
- 互联网大厂与编程语言
- Python贪吃蛇小游戏
- java script特效_javascript 常用特效(40种)
- 【leetcode刷题】[简单]427. 建立四叉树(construct quad tree)-java
- 卫星定轨理论、GPS信号与卫星星历
- qc快充协议2.0/3.0
- TCP AIMD Algorithm (copy)
- 携程后台开发笔试第二题
- 【python与数据分析】实验十三 北京市空气质量
- 武汉市征集人工智能领域技术成果等通知-2022年申请时间及条件
- 杰理之上下文件夹播放上文件夹从最后一首播放【篇】