Добавить в корзинуПозвонить
Найти в Дзене

eBPF: программируемое ядро без перезагрузки

#devops #dev #it_design_architect
eBPF: программируемое ядро без перезагрузки
eBPF (extended Berkeley Packet Filter) — это технология, позволяющая выполнять безопасные программы прямо в ядре Linux в ответ на события (системные вызовы, сетевые пакеты, трассировка). Главное отличие от модулей ядра — программы проходят строгую проверку безопасности и не могут обрушить систему.
Как работает eBPF
1. Вы пишете программу на C (или Rust) и компилируете её в байт-код для виртуальной машины eBPF.
2. Программа загружается в ядро и проверяется верификатором (безопасность, отсутствие циклов, ограниченный доступ к памяти).
3. Программа привязывается к событию (например, к системному вызову `open`).
4. При наступлении события программа выполняется в ядре, собирает данные или принимает решение (пропустить пакет, изменить параметры).
```
| Область | Что делает eBPF | Традиционный аналог |
|---------|----------------|---------------------|
| **Наблюдаемость** | Сбор метрик в реальном времени (заде

#devops #dev #it_design_architect

(канал https://t.me/cybermerlin_pub - больше статей \ полезного)

eBPF: программируемое ядро без перезагрузки

eBPF (extended Berkeley Packet Filter) — это технология, позволяющая выполнять безопасные программы прямо в ядре Linux в ответ на события (системные вызовы, сетевые пакеты, трассировка). Главное отличие от модулей ядра — программы проходят строгую проверку безопасности и не могут обрушить систему.

Как работает eBPF

1. Вы пишете программу на C (или Rust) и компилируете её в байт-код для виртуальной машины eBPF.
2. Программа загружается в ядро и проверяется верификатором (безопасность, отсутствие циклов, ограниченный доступ к памяти).
3. Программа привязывается к событию (например, к системному вызову `open`).
4. При наступлении события программа выполняется в ядре, собирает данные или принимает решение (пропустить пакет, изменить параметры).

```
| Область | Что делает eBPF | Традиционный аналог |
|---------|----------------|---------------------|
| **Наблюдаемость** | Сбор метрик в реальном времени (задержки, ошибки) | `perf`, `strace` (замедляют систему) |
| **Сеть** | Маршрутизация, балансировка, DDoS-защита | `iptables` (линейный перебор правил) |
| **Безопасность** | Обнаружение атак в рантайме (Falco) | `auditd` (логирование после факта) |
| **Трассировка** | Отслеживание вызовов функций ядра и приложений | `ftrace` (ограниченная гибкость) |
```

Преимущества eBPF

- **Нулевой оверхед**: программы выполняются в ядре без копирования данных в userspace.
- **Безопасность**: верификатор не даёт повредить ядро.
- **Динамичность**: загрузка/выгрузка программ без перезагрузки.
- **Экосистема**: проекты Cilium (сеть), Falco (безопасность), Pixie (отладка) построены на eBPF.

Минимальный пример (BCC)

Утилита `trace` из набора BCC позволяет подключаться к системным вызовам:

```bash
# Отслеживать все вызовы open
sudo trace 'do_sys_open "%s", arg2'
```

Более сложная программа на Python (BCC) для подсчёта системных вызовов:

```python
from bcc import BPF

program = """
int count_syscalls(void *ctx) {
bpf_trace_printk("Syscall triggered\\n");
return 0;
}
"""
b = BPF(text=program)
b.attach_kprobe(event=b.get_syscall_fnname("open"), fn_name="count_syscalls")
b.trace_print()
```

Ограничения

- Программы не могут содержать циклы (кроме ограниченных) — верификатор требует гарантированного завершения.
- Размер программы ограничен (несколько тысяч инструкций).
- Требуется ядро 4.9+ (полная поддержка — 5.0+).