動態

詳情 返回 返回

ebpf--入門04(支持的各種鈎子以及同時使用多個ebpf 插件) - 動態 詳情

支持同時使用多個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 程序。

Add a new 評論

Some HTML is okay.