支持同时使用多个eBPF程序?

可以将多个 eBPF 程序加载到不同的钩子点,或者在同一个钩子点上串联多个 eBPF 程序。例如,可以在 XDP 层同时加载 URL 过滤、IPv6 过滤和 Cookie 过滤程序。
场景01:

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>

#define MAX_URL_LEN 256

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 256);
    __type(key, char[MAX_URL_LEN]);
    __type(value, __u8);
} blocked_urls SEC(".maps");

SEC("xdp")
int url_filter(struct xdp_md *ctx) {
    // 解析数据包,检查 HTTP 请求中的 URL
    // 如果 URL 在被阻止列表中,则丢弃数据包
    return XDP_PASS;
}

char _license[] SEC("license") = "GPL";

场景02:

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <linux/if_ether.h>
#include <linux/ipv6.h>

SEC("xdp")
int ipv6_filter(struct xdp_md *ctx) {
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;
    struct ethhdr *eth = data;

    if (data + sizeof(*eth) > data_end) {
        return XDP_PASS;
    }

    if (eth->h_proto == __constant_htons(ETH_P_IPV6)) {
        return XDP_DROP;
    }

    return XDP_PASS;
}

char _license[] SEC("license") = "GPL";

场景03:

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>

#define MAX_COOKIE_LEN 256

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 256);
    __type(key, char[MAX_COOKIE_LEN]);
    __type(value, __u8);
} blocked_cookies SEC(".maps");

SEC("xdp")
int cookie_filter(struct xdp_md *ctx) {
    // 解析数据包,检查 HTTP 请求中的 Cookie
    // 如果 Cookie 在被阻止列表中,则丢弃数据包
    return XDP_PASS;
}

char _license[] SEC("license") = "GPL";

可以使用 iproute2 工具或 bpftool 来加载和管理 eBPF 程序。例如:

# 加载 URL 过滤程序
ip link set dev eth0 xdp obj url_filter.o sec xdp
# 加载 IPv6 过滤程序
ip link set dev eth0 xdp obj ipv6_filter.o sec xdp
# 加载 Cookie 过滤程序
ip link set dev eth0 xdp obj cookie_filter.o sec xdp

ebpf支持多少种类型的钩子呢?
网络相关钩子

  1. XDP(eXpress Data Path)
    用途:用于高速数据包处理,适合过滤和转发。
    场景:DDOS 防护、负载均衡、数据包过滤。
  2. tc(Traffic Control)
    用途:用于复杂的流量控制和 QoS。
    场景:流量整形、带宽管理、流量监控。
  3. Socket Filter
    用途:用于过滤和监控 socket 层的数据。
    场景:网络防火墙、网络监控、数据包捕获。
    内核跟踪和性能监控钩子
  4. kprobe/kretprobe
    用途:用于跟踪内核函数调用。
    场景:内核调试、性能分析、故障排除。
  5. Tracepoint
    用途:用于跟踪内核事件。
    场景:系统性能监控、事件记录、故障诊断。
  6. Perf Event
    用途:用于性能事件的监控。
    场景:CPU 使用率监控、硬件性能计数器、内存分配跟踪。
    用户空间和其他钩子
  7. Uprobe/uretprobe
    用途:用于跟踪用户空间应用程序函数调用。
    场景:应用程序调试、性能分析、故障排除。
  8. cgroup
    用途:用于控制和监控 cgroup(控制组)内的资源使用。
    场景:容器资源限制、进程隔离、资源监控。
  9. LSM(Linux Security Modules)
    用途:用于安全相关的钩子点。
    场景:访问控制、安全审计、入侵检测。
    文件系统相关钩子
  10. BPF Type Format (BTF)
    用途:用于增强 eBPF 程序的调试和可视化。
    场景:调试和可视化 eBPF 程序。


putao
8 声望1 粉丝

推动世界向前发展,改善民生。