支持同時使用多個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支持多少種類型的鈎子呢?
網絡相關鈎子
- XDP(eXpress Data Path)
用途:用於高速數據包處理,適合過濾和轉發。
場景:DDOS 防護、負載均衡、數據包過濾。 - tc(Traffic Control)
用途:用於複雜的流量控制和 QoS。
場景:流量整形、帶寬管理、流量監控。 - Socket Filter
用途:用於過濾和監控 socket 層的數據。
場景:網絡防火牆、網絡監控、數據包捕獲。
內核跟蹤和性能監控鈎子 - kprobe/kretprobe
用途:用於跟蹤內核函數調用。
場景:內核調試、性能分析、故障排除。 - Tracepoint
用途:用於跟蹤內核事件。
場景:系統性能監控、事件記錄、故障診斷。 - Perf Event
用途:用於性能事件的監控。
場景:CPU 使用率監控、硬件性能計數器、內存分配跟蹤。
用户空間和其他鈎子 - Uprobe/uretprobe
用途:用於跟蹤用户空間應用程序函數調用。
場景:應用程序調試、性能分析、故障排除。 - cgroup
用途:用於控制和監控 cgroup(控制組)內的資源使用。
場景:容器資源限制、進程隔離、資源監控。 - LSM(Linux Security Modules)
用途:用於安全相關的鈎子點。
場景:訪問控制、安全審計、入侵檢測。
文件系統相關鈎子 - BPF Type Format (BTF)
用途:用於增強 eBPF 程序的調試和可視化。
場景:調試和可視化 eBPF 程序。