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

引言

随着网络应用的不断发展,在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.mzph.cn/news/38718.shtml

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

相关文章

【CSS】禁用元素鼠标事件(例如实现元素禁用效果)

文章目录 基本用法 基本用法 pointer-events 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件。实际运用中可以通过对auto 和none动态控制,来动态实现元素的禁用效果。 属性描述auto与pointer-events属性未指定时的表现效果相同,对…

【笔试题心得】排序算法总结整理

排序算法汇总 常用十大排序算法_calm_G的博客-CSDN博客 以下动图参考 十大经典排序算法 Python 版实现(附动图演示) - 知乎 冒泡排序 排序过程如下图所示: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻…

【LeetCode-简单】剑指 Offer 29. 顺时针打印矩阵(详解)

题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:matrix [[1,2,3,4],[5,6,7,8],[9,10,1…

互联网发展历程:速度与效率,交换机的登场

互联网的演进就像一场追求速度与效率的竞赛,每一次的技术升级都为我们带来更快、更高效的网络体验。然而,在网络的初期阶段,人们面临着数据传输速度不够快的问题。一项关键的技术应运而生,那就是“交换机”。 速度不足的困境&…

规划性和可扩展性,助力企业全面预算管理的推进

对于当今社会经济市场的不稳定状况和不断变化的消费者行为,企业业务也从未像今天这样不可预测过。面对变化和变革,企业需要具备规划性的预测能力,才能使得自身在竞争中保持领先地位。那些具备前瞻性的企业都尝试在现阶段通过更好的规划不断提…

基于Mysqlrouter+MHA+keepalived实现高可用半同步 MySQL Cluster项目

目录 项目名称: 基于Mysqlrouter MHA keepalived实现半同步主从复制MySQL Cluster MySQL Cluster: 项目架构图: 项目环境: 项目环境安装包: 项目描述: 项目IP地址规划: 项目步骤: 一…

windows11下配置vscode中c/c++环境

本文默认已经下载且安装好vscode,主要是解决环境变量配置以及编译task、launch文件的问题。 自己尝试过许多博客,最后还是通过这种方法配置成功了。 Linux(ubuntu 20.04)配置vscode可以直接跳转到配置task、launch文件,不需要下载mingw与配…

localhost:8080 is already in use

报错原因:本机的8080端口号已经被占用。因为机器的空闲端口号是随机分配的,而idea默认启动的端口号是8080,所以是存在这种情况。 对于这个问题,我们只需要重启idea或者修改项目的启动端口号即可。 更推荐第二种。对于修改项目启动端口号&…

ZDH-wemock模块

本次介绍基于版本v5.1.1 目录 项目源码 预览地址 安装包下载地址 wemock模块 wemock模块前端 配置首页 配置mock wemock服务 下载地址 打包 运行 效果展示 项目源码 zdh_web: https://github.com/zhaoyachao/zdh_web zdh_mock: https://github.com/zhaoyachao/z…

TCGA数据下载推荐:R语言easyTCGA包

#使用easyTCGA获取数据 #清空 rm(listls()) gc() # 安装bioconductor上面的R包 options(BioC_mirror"https://mirrors.tuna.tsinghua.edu.cn/bioconductor") if(!require("BiocManager")) install.packages("BiocManager") if(!require("TC…

怎样让音频速度变慢?请跟随以下方法进行操作

怎样让音频速度变慢?在会议录音过程中,经常会遇到主讲人语速过快,导致我们无法清晰听到对方说的内容。如果我们能够减慢音频速度,就能更好地记录对方的讲话内容。此外,在听到快速播放的外语或方言时,我们也…

机器人的运动范围

声明 该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油! 原题链接 机器人的运动范围https://leetcode.c…

高等数学教材重难点题型总结(二)导数与微分

本章重点题目较少,除了*标题页没什么特别难的,本帖出于总结性的角度考虑并未囊概全部的*标,最后会出一期*标题的全部内容整理,在攻克重难点的基础上更上一层楼。 1.根据定义求某点处的导数值 2.通过定义证明导数 3.左右导数的相关…

【数据库】P4 过滤数据 WHERE

过滤数据 WHERE 简介WHERE 子句操作符检测单个值案例范围值检查 BETWEEN AND空值检查 NULL 简介 数据库表一般包含大量的数据,很少需要检索表中的所有行。我们只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter conditio…

完全备份、增量备份、差异备份、binlog日志

Top NSD DBA DAY06 案例1:完全备份与恢复案例2:增量备份与恢复案例3:差异备份与恢复案例4:binlog日志 1 案例1:完全备份与恢复 1.1 问题 练习物理备份与恢复练习mysqldump备份与恢复 1.2 方案 在数据库服务器192…

问AI一个严肃的问题

chatgpt的问世再一次掀起了AI的浪潮,其实我一直在想,AI和人类的关系未来会怎样发展,我们未来会怎样和AI相处,AI真的会完全取代人类吗,带着这个问题,我问了下chatgpt,看一看它是怎么看待这个问题…

Modbus工业RFID设备在自动化生产线中的应用

传统半自动化生产线在运作的过程,因为技工的熟练程度,专业素养的不同,在制造过程中过多的人为干预,工厂将很难对每条生产线的产能进行标准化管理和优化。如果半自动化生产线系统是通过前道工序的作业结果和检测结果来决定产品在下…

react实现模拟弹框遮罩的自定义hook

需求描述 点击按钮用于检测鼠标是否命中按钮 代码实现 import React from react; import {useState, useEffect, useRef} from react;// 封装一个hook用来检测当前点击事件是否在某个元素之外 function useClickOutSide(ref,cb) {useEffect(()>{const handleClickOutside…

JMeter接口自动化测试实例—JMeter引用javaScript

Jmeter提供了JSR223 PreProcessor前置处理器,通过该工具融合了Java 8 Nashorn 脚本引擎,可以执行js脚本以便对脚本进行前置处理。其中比较典型的应用就是通过执行js脚本对前端数据进行rsa加密,如登录密码加密。但在这里我就简单的应用javaScr…

PyTorch翻译官网教程-NLP FROM SCRATCH: GENERATING NAMES WITH A CHARACTER-LEVEL RNN

官网链接 NLP From Scratch: Generating Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用字符级RNN生成名字 这是我们关于“NLP From Scratch”的三篇教程中的第二篇。在第一个教程中</intermediate/char_rnn_classification_tutor…