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