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

48次阅读

共计 2965 个字符,预计需要花费 8 分钟才能阅读完成。

引言

随着网络应用的一直倒退,在 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 的应用层网络管控计划呈现,用于实现弱小的应用层流量剖析、智能的流量调度、自动化的平安进攻和灵便的网络管控。这将为网络管理人员和开发人员提供更多的工具和技术,以应答一直增长的网络挑战和需要。

正文完
 0