
eBPF: Quán Trị Hệ Thống Linux Cấp Kernel Không Cần Module
eBPF (extended Berkeley Packet Filter) là công nghệ cho phép chạy chương trình sandboxed trong kernel Linux mà không cần sửa đổi source code kernel hay load kernel module. Từ công cụ lọc gói tin mạng, eBPF đã tiến hóa thành nền tảng programmable kernel chung, powering các công cụ observability, security, networking hàng đầu như Cilium, bpftrace, Tetragon, Falco.

Từ cBPF Đến eBPF: Lịch Sử Phát Triển
Berkeley Packet Filter (BPF) ra đời năm 1992 (McCanne & Van Jacobson) để lọc gói tin trong tcpdump. Kiến trúc cBPF (classic BPF) có tập lệnh 32-bit, 2 thanh ghi, chỉ hỗ trợ network filtering. Năm 2014, Alexei Starovoitov (Facebook) redesign hoàn toàn thành eBPF: tập lệnh 64-bit, 10 thanh ghi, hỗ trợ gọi helper function, map chia sẻ dữ liệu user-kernel. Linux 3.18 (2014) merge eBPF đầu tiên, Linux 4.4+ hỗ trợ đầy đủ.
Kiến Trúc Cốt Lõi
1. eBPF Verifier – “Người Gác Cổng” An Toàn
Mọi chương trình eBPF phải qua verifier trước khi nạp vào kernel. Verifier thực hiện phân tích tĩnh (static analysis):
- Kiểm tra chương trình luôn kết thúc (không vòng lặp vô tận – bounded loops từ kernel 5.3+).
- Kiểm tra truy cập bộ nhớ an toàn (bounds checking, pointer arithmetic validation).
- Kiểm tra không gọi hàm kernel tùy ý (chỉ dùng helper function được phép).
- Kiểm tra stack size không vượt giới hạn (512 bytes).
- Mô phỏng thực thi (abstract interpretation) để chứng minh an toàn cho mọi đường đi mã.
Nếu verifier reject, chương trình không được nạp – kernel vẫn an toàn tuyệt đối.
2. eBPF Maps – Chia Sẻ Dữ Liệu User-Kernel
Maps là cấu trúc dữ liệu key-value trong kernel, accessible từ cả eBPF program và user space qua syscall bpf(). Các loại map chính:
BPF_MAP_TYPE_HASH,ARRAY,LRU_HASH,LRU_ARRAY: lưu trữ key-value.BPF_MAP_TYPE_PERCPU_ARRAY: mỗi CPU core có bản copy riêng – lock-free counter.BPF_MAP_TYPE_RINGBUF,PERF_EVENT_ARRAY: high-throughput event streaming đến user space.BPF_MAP_TYPE_PROG_ARRAY: tail call – gọi chương trình eBPF khác (chaining).
3. Helper Functions – API Kernel An Toàn
eBPF không thể gọi kernel function trực tiếp. Thay vào đó, dùng helper functions – API ổn định, được verifier kiểm soát: bpf_map_lookup_elem, bpf_ktime_get_ns, bpf_get_current_pid_tgid, bpf_trace_printk, bpf_send_signal, bpf_override_return (fuzzing/testing).
4. JIT Compilation – Hiệu Suất Gần Native
eBPF bytecode được JIT-compile thành machine code native (x86_64, ARM64, RISC-V, s390x) tại runtime. Hiệu suất ngang ngửa code kernel hand-written. JIT compiler cũng áp dụng tối ưu hóa: dead code elimination, loop unrolling, register allocation.
Điểm Gắn (Attach Points) – Nơi eBPF Chạy
| Loại | Attach Point | Use Case |
|---|---|---|
| Tracing | kprobe / kretprobe | Trace hàm kernel bất kỳ (entry/exit) |
| Tracing | uprobe / uretprobe | Trace hàm user-space (libc, app binary) |
| Tracing | tracepoint | Static instrumentation points trong kernel |
| Networking | XDP (eXpress Data Path) | Xử lý gói tin tại driver NIC, trước network stack |
| Networking | TC (Traffic Control) clsact | Ingress/egress shaping, filtering, load balancing |
| Networking | cgroup-bpf | Network policy per cgroup (Kubernetes CNI) |
| Security | LSM (Linux Security Module) | Mandatory access control, syscall filtering |
| Scheduler | struct_ops (sched_ext) | Custom CPU scheduler policy (kernel 6.12+) |
Công Cụ Và Hệ Sinh Thái (Ecosystem)
- bpftrace: High-level tracing language (DTrace-like), one-liner cho observability.
- BCC (BPF Compiler Collection): Python/C++ library, toolbox sẵn (opensnoop, execsnoop, tcplife…).
- libbpf / libbpf-rs / aya-rs: Modern library cho C/Rust, CO-RE (Compile Once, Run Everywhere) – binary portable across kernel versions.
- Cilium: eBPF-based CNI, service mesh, network policy cho Kubernetes.
- Tetragon: Security observability, runtime enforcement (Isovalent).
- Falco: Runtime threat detection (sysdig), rule-based.
- Parca: Continuous profiling dùng eBPF (frozenstack, sampling).

So Sánh eBPF Với Kernel Module
| Tiêu Chí | Kernel Module | eBPF |
|---|---|---|
| An toàn | Crash kernel = panic | Verifier chặn code không an toàn |
| Triển khai | Compile per kernel version, sign, load | CO-RE: compile once, run everywhere |
| Cập nhật | Reload module, downtime | Hot reload, atomic replace |
| Quyền truy cập | Full kernel access | Chỉ helper function cho phép |
| Hiệu suất | Native | JIT ~ native |
| Phát triển | C, kernel API phức tạp | C/Rust/Go, tooling hiện đại |
Use Case Thực Tế
Observability: Zero-Overhead Tracing
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %sn", comm, str(args->filename)); }' – trace mọi file open system-wide với overhead < 1%. Không cần recompile kernel, không cần reboot.
Networking: XDP DDoS Mitigation
XDP chạy tại NIC driver (hoặc SmartNIC), drop gói tin độc hại trước khi vào network stack Linux. Cloudflare dùng XDP mitigate DDoS 10M+ pps/core. Cilium dùng eBPF thay thế iptables/kube-proxy: service load balancing, network policy, L7 visibility.
Security: Runtime Enforcement
Tetragon/Falco dùng LSM BPF + tracepoint theo dõi execve, open, connect, ptrace. Phát hiện container escape, privilege escalation, crypto miner real-time. Có thể block syscall (bpf_override_return) chứ không chỉ alert.
Thách Thức Và Hạn Chế
- Verifier complexity: Viết code pass verifier đòi hỏi hiểu sâu về abstract interpretation, bounded loops, pointer safety.
- Kernel version dependency: Feature mới cần kernel mới (CO-RE giảm thiểu nhưng không loại bỏ).
- Stack limit 512B: Không đệ quy sâu, không large local array.
- Không floating point: eBPF ISA không có FPU instruction.
- Debugging khó: Không có gdb trong kernel, dùng bpf_printk/bpf_trace_printk.
Tương Lai: sched_ext, BPF Struct Ops, Userspace eBPF
Kernel 6.12+ giới thiệu sched_ext – pluggable CPU scheduler viết bằng eBPF (Meta, Google đã dùng production). Struct ops cho phép implement kernel subsystem (TCP congestion control, scheduler) bằng eBPF. Userspace eBPF (ubpf, rbpf) mang model eBPF ra ngoài kernel cho embedded, database, plugin system.
eBPF đang trở thành “kernel extension language” chuẩn cho Linux – từ networking, security đến scheduling, storage. Hiểu eBPF là kỹ năng bắt buộc cho platform engineer, SRE, kernel developer hiện đại.
Nguồn tham khảo: eBPF – Wikipedia | Cilium eBPF Documentation | BPF Compiler Collection (BCC) | ebpf.io – eBPF Foundation
