基于eBPF技术构建一种应用层网络管控解决方案

news2024/11/24 2:42:17

引言

随着网络应用的不断发展,在linux系统中对应用层网络管控的需求也日益增加,而传统的iptables、firewalld等工具难以针对应用层进行网络管控。因此需要一种创新的解决方案来提升网络应用的可管理性。

本文将探讨如何使用eBPF技术构建一种应用层网络管控解决方案,为linux系统上的网络管控带来一种新的可能。

相关技术介绍

eBPF

eBPF(Extended Berkeley Packet Filter)是一种在Linux内核中执行安全、可编程的字节码的技术。它最初是作为传统的Berkeley Packet Filter(BPF)的扩展而引入的,用于网络数据包过滤和分析。然而,随着时间的推移,eBPF已经演变成一种通用的可编程框架,不仅可以用于网络管控,还可以应用于系统跟踪、安全监控、性能分析等领域。

eBPF具有灵活性和可扩展性,通过编写自定义的eBPF程序,开发人员可以根据特定的需求实现各种功能。同时,eBPF还支持动态加载和卸载,使得运行时可以根据需要加载不同的eBPF程序,而无需重新编译内核。

eBPF的另一个重要特点,那就是它的安全性。eBPF的字节码在内核中执行之前,会经过严格的验证和限制,以确保它不会对系统的稳定性和安全性造成破坏。这种安全性保证了BPF的可编程性不会成为潜在的安全漏洞。

由于eBPF的这些特性,使其成为现在Linux系统上最炙手可热的一项技术。例如,开源容器网络方案Cilium、开源Linux动态跟踪程序BCC、熟知的bpftrace等,都是基于eBPF技术实现的。换句话说,通过对eBPF字节码进行验证和限制,系统能够保持稳定和安全,同时还能实现BPF的灵活编程能力。

下图展示了eBPF所支持的所有追踪点,可以发现eBPF可以探测几乎所有的子系统:

KProbes

Kprobes是Linux内核中的一种动态跟踪机制,它允许用户在内核的关键代码路径上插入探针,以便在运行时捕获和分析内核事件。Kprobes可以在内核函数的入口和出口处插入探针,以便观察函数的调用和返回情况。通过在关键代码路径上插入探针,就可以收集各种内核事件的信息,如函数调用次数、参数值、返回值等。

eBPF程序可由Kprobes事件驱动,eBPF与Kprobes的结合可以实现内核级别的事件跟踪和分析。

eBPF Maps

eBPF Maps是一种键值对数据结构,类似于传统编程语言中的字典或哈希表。它由键(key)和值(value)组成,程序员可以根据需要定义键和值的类型,并在eBPF程序中进行读取、写入和更新操作。它可以在用户空间和内核空间之间进行安全的数据传输,避免了传统用户空间和内核空间之间的数据拷贝和安全隐患。

NFQUEUE

NFQUEUE利用Netfilter框架中的hook机制,将选定的网络数据包从内核空间传递到用户空间进行处理。具体的工作流程如下:

配置规则:使用iptables或nftables等工具配置规则,将特定的网络流量匹配到NFQUEUE。

注册队列:在用户态程序中,通过libnetfilter_queue库注册一个NFQUEUE队列,并指定一个唯一的队列ID。

数据包传递:当匹配到与规则相符的网络数据包时,内核将其放入相应的NFQUEUE队列,并将队列ID与网络数据包相关联。

用户态处理:用户态程序通过监听注册的NFQUEUE队列,可以接收到内核传递的网络数据包。程序可以对网络数据包进行处理、修改、过滤或记录等操作。

决策:在用户态处理完网络数据包后,可以根据需要决定是否接受、丢弃、修改或重定向网络数据包。

有固应用层网络管控实现

上面介绍了eBPF和NFQUEUE的基本概念,可以发现,eBPF和NFQUEUE都可以将内核中网络协议栈的网络数据包转发到用户态,下面说明在UOS系统有固中网络管控方案的具体实现步骤:

使用iptables配置NFQUEUE规则,将系统中的网络数据包转发到NFQUEUE队列,用户态程序从队列中获取数据包,并对这些数据包进行研判,是ACCEPT 还是DROP。但是NFQUEUE队列中的数据包并不包含应用层信息,无法针对应用层信息进行研判,那么就需要将每个网络数据包与具体的应用关联起来。

通过eBPF程序在内核网络协议栈相关函数的入口和出口处插入Kprobes探针,这里将hook点设为tcp_v4_connect、tcp_v6_connect、security_socket_sendmsg。

每当系统中有网络流量产生的时候,就可以截获其中的网络数据包送入eBPF程序处理。eBPF程序同时可以获取此时的进程ID(PID),并将PID与数据包进行绑定,在之后处理数据包的时候就可以清晰的知道每个数据包是由哪个进程产生的了。通过eBPF Maps将绑定好PID的网络流量包送入用户空间,至此,eBPF程序完成了它的一次任务。当然,对于监控的每个数据包,eBPF程序都需要进行一次这样的处理。

在用户空间中,通过PID可以获取到进程的相关信息,例如启动时间、文件路径、进程状态等,将这些信息收集起来保存供后续使用。

用户态程序通过数据包的 IP、端口、协议类型等信息将NFQUEUE队列中的数据包与eBPF模块捕获的数据包关联起来,这样就知道NFQUEUE队列中每个数据包对应的进程信息。

将NFQUEUE队列中的数据包送入规则引擎,对比配置好的流量规则,对数据包作出研判。

优势

传统的linux网络管控方案如iptables、firewalld等都只能工作在网络层和传输层,而该网络方案可以将网络管控扩展到应用层。对比firewalld的XML模版,该方案在真正意义上实现了对应用层的网络管控。

规则配置、网络管控方式更加灵活,该方案可以针对单个应用进行规则配置,由于最后的处理过程是在应用态,而非内核中的netfilter,所以可以实现定制化的管控方式。

不足

由于NFQUEUE会将数据包转发到用户态处理,这牺牲了一部分的性能。

在linux的网络协议栈中,并非所有的网络流量都可以通过eBPF获取到对应的进程信息,当前测试比较稳定的是应用程序的出口流量。

展望

eBPF是一项创新且强大技术,在过去的 eBPF summit 2022中,《The future of eBPF in the Linux Kernel》展望了 eBPF 的发展方向,其中包括:

更完备的编程能力:当前 eBPF 的编程能力存在一些局限性(比如不支持变量边界的循环,指令数量受限等),演进目标提供图灵完备的编程能力。

更强的安全性:支持类型安全,增强运行时 Verifier,演进目标是提供媲美 Rust 的安全编程能力。

更广泛的移植能力:增强 CO-RE,加强 Helper 接口可移植能力,实现跨体系、平台的移植能力。

更强的可编程能力:支持访问/修改内核任意参数、返回值,实现更强的内核编程能力。

结合以上eBPF即将会实现的新特性,应用层的网络管控可以在eBPF模块中直接实现,这样一来在降低性能开销的同时,也提升了网络管控的灵活性。未来,可以期待更多基于eBPF的应用层网络管控方案出现,用于实现强大的应用层流量分析、智能的流量调度、自动化的安全防御和灵活的网络管控。这将为网络管理人员和开发人员提供更多的工具和技术,以应对不断增长的网络挑战和需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/882937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

观察者模式 Observer Pattern 《游戏编程模式》学习笔记

定义 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 这是定义,看不懂就看不懂吧,我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…

软件确认测试报告的作用,第三方测试机构进行确认测试的好处

近年来,随着软件产品的不断发展和普及,软件确认测试作为一项重要的质量保障手段也越来越受到关注,主要是为了检测软件产品是否符合需求规格和预期功能,以及是否存在缺陷和问题。对于软件产品开发商来说,进行确认测试是…

未济卦-物不可穷

前言:学无止境,人生没有终点,虽说是六十四卦的最后一卦,仍是“未济”,今天学习未济卦的卦辞和爻辞。 卦辞 亨;小狐汔济,濡其尾,无攸利。 序卦:无不可穷也,故…

计蒜客T1122——最长最短单词

又是一道水题&#xff0c;基本思路是从目标串中根据空格分离出来每一个单词&#xff0c;然后分别找出最大值与最小值&#xff0c;输出即可~ #include <iostream> #include <string> #include <vector> using namespace std;int main(int argc, char** argv)…

车辆维修保养记录接口:数据对接,价格明细表精准展示

随着人们生活水平的提高&#xff0c;私家车越来越多&#xff0c;对车辆的维修保养需求也越来越高。车辆维修保养记录是车主和维修人员都需要关注的重要信息。然而&#xff0c;由于维修保养记录的复杂性和数据量大&#xff0c;人工管理难以胜任&#xff0c;这就需要开发一种接口…

Python源码05:使用Pyecharts画词云图图

**Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库&#xff0c;提供了丰富的图表类型和交互功能。**通过 Pyecharts&#xff0c;你可以使用 Python 代码生成各种类型的 Echarts 图表&#xff0c;例如折线图、柱状图、饼图、散…

jstat -gcutil 命令使用

jstat -gcutil命令用于监视Java应用程序的垃圾回收情况。它提供了有关堆内存使用情况、垃圾回收器的活动以及垃圾回收的效率的信息。 目录 一、基本语法 二、执行结果 一、基本语法 jstat -gcutil <pid> <interval> <count> 参数解释&#xff1a; <p…

C++11实用技术(四)for循环该怎么写

普通用法 在C遍历stl容器的方法通常是&#xff1a; #include <iostream> #include <vector>int main() {std::vector<int> arr {1, 2, 3};for (auto it arr.begin(); it ! arr.end(); it){std::cout << *it << std::endl;}return 0; }上述代…

科东软件受邀参加第五届国产嵌入式操作系统技术与产业发展论坛

8月12日&#xff0c;第五届国产嵌入式操作系统技术与产业发展论坛暨嵌入式系统联谊会主题讨论会&#xff08;总第29次&#xff09;在杭州成功举行。这次论坛的主题是“面向异构多核智能芯片的混合关键系统研究与应用”&#xff0c;上午是“嵌入式异构多核智能芯片产业发展”的主…

kubernetes企业级高可用部署

目录 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 2.3、项目实施思路 3、项目实施过程 3.1、系统初始化 3.2、配置部署keepalived服务 3.3、…

【Redis基础篇】浅谈分布式系统(一)

一、浅谈分布式系统 1. 单机架构&#xff1a;只有一台服务器&#xff0c;这个服务器负责所有的工作。 如果遇到了服务器不够的场景怎么处理? 开源&#xff1a;增加更多的硬件资源节流&#xff1a;软件上的优化&#xff0c;优化代码等…一台服务器资源使用有限&#xff0c;就…

使用Mix-in类组合功能

为什么需要Mix-in? 在学习面向对象时我们知道&#xff0c;类可以通过继承类获得属性和方法&#xff0c;通过继承可以减少重复代码、提高复用率。Python支持多继承&#xff0c;一个类可以通过继承多个类来得到它们的功能。但多继承会带来一些问题&#xff0c;比如属性冲突。那…

AS报错:错误: 无效的源发行版:12

背景&#xff1a;今天用Android Studio 编译以前的demo,运行报错&#xff1a;错误: 无效的源发行版&#xff1a;12 截图如下&#xff1a; 解决办法&#xff1a;将jdk版本由11升级到13,解决了。 路径&#xff1a;Setting/Build,Execution,Deployment/Build Tools/Gradle/Gradl…

Python多线程与线程池(python线程池ThreadPoolExecutor)concurrent.futures高级别异步执行封装

文章目录 Python多线程与线程池一、Python多线程1.1 线程简介1.2 Python中的多线程1.3 GIL限制 二、线程池2.1 Python中的线程池 三、代码分析四、参考资料 Python多线程与线程池 一、Python多线程 在进行复杂的计算或处理大量数据时&#xff0c;可以通过创建多个线程来同时执…

MySQL卸载并重装指定版本

MySQL卸载并重装制定版本 学习新的项目&#xff0c;发现之前的Navicat已经失去了与现有MySQL的链接&#xff0c;而且版本也不适合&#xff0c;为了少走弯路&#xff0c;准备直接重装相应版本的MySQL 卸载现有MySQL 停止windows的MySQL服务&#xff0c;【windowsR】打开运行框…

电脑提示vcomp140.dll丢失怎样修复?vcomp140.dll的三种修复方法

vcomp140.dll是Microsoft Visual C所需的一个动态链接库文件&#xff0c;用于支持C并行编程。为了更好地理解为什么vcomp140.dll会丢失&#xff0c;并对其进行详细介绍&#xff0c;下面将详细解释以下几个方面&#xff1a; 动态链接库&#xff08;DLL&#xff09;的作用和原理…

SpringBoot系列之集成Resteasy实现RESTFul接口

JAX-RS&#xff1a;JavaAPI for RESTful Web Services&#xff0c;JAX-RS是可以用可以用于实现RESTFul应用程序的JAVA API&#xff0c;给开发者提供了一系列的RESTFul注解 EasyRest&#xff1a;这是Jboss开源的&#xff0c;一款用来定义实现RESTFul应用程序的框架&#xff0c;…

判断推理 -- 图形推理 -- 样式规律

上述题可以挑一两条线来看。 横着没规律可以竖着看&#xff0c;从上往下没规律可以从下往上。 黑白运算 从0点开始找&#xff0c;排除选项后找剩下选项不同的地方。 求异技巧很重要。

springcloud3 使用openfegin实现getpost请求调用

一 项目介绍 1.1 工程介绍 1.consumer9008 2.provider9009 二 get请求 2.1 消费端 1.controller 2.service 2.2 提供者 1.提供者 2.3 测试请求 地址&#xff1a; http://localhost:9008/consumer/payment/nacos/2223 三 post请求 3.1 消费者 3.2 提供者 3.3 测试请求…

前端打开后端返回的HTML格式的数据

前端打开后端返回的 HTML格式 的数据&#xff1a; 后端返回的数据格式如下示例&#xff1a; 前端通过 js 方式处理&#xff08;核心代码如下&#xff09; console.log(回调, path); // path 是后端返回的 HTML 格式数据// 必须要存进localstorage&#xff0c;否则会报错&am…