Компьютерные сети
eBPF: программируем ядро
Cloudflare блокирует DDoS атаки со скоростью 26 миллионов пакетов в секунду на одном CPU core. Секрет? Не iptables - а XDP с eBPF, обрабатывающий пакеты до того, как они попадут в ядро.
- **Facebook** использует eBPF для L4 load balancing (Katran) - 10M+ connections per server. Раньше это требовало дорогого hardware LB.
- **Netflix** применяет eBPF для deep observability: трейсинг каждого syscall, network flow, без overhead традиционного profiling.
- **Google** разработал gVisor с eBPF для container security - sandbox без overhead виртуализации.
Предварительные знания
Цели урока
- Понимать eBPF: безопасный bytecode в ядре, verifier, JIT компиляция, программа никогда не падает
- Различать hook points: XDP (driver), TC (qdisc), kprobe/uprobe, tracepoint, socket filter и где какой быстрее
- Объяснить почему XDP_DROP бьёт iptables в ~10x: пакет дропается до allocation sk_buff
- Знать кейсы: Cilium service mesh, Katran L4LB, Falco runtime security, bpftrace для observability
- Прочитать tools: bpftool prog, bpftrace one-liners, perf trace на eBPF backend
eBPF Fundamentals
**eBPF** (extended Berkeley Packet Filter) - технология, позволяющая запускать пользовательский код прямо в ядре Linux без написания kernel modules. Код компилируется в байткод, проверяется verifier'ом на безопасность и выполняется с скоростью ядра.
Изначально BPF (1992) создавался для фильтрации пакетов (tcpdump). eBPF (2014+) - это 'Linux kernel in a sandbox': можно хукаться на системные вызовы, сетевые события, tracepoints, и даже создавать свои типы сокетов.
**Verifier** - ключевой компонент безопасности. Статически анализирует код: нет бесконечных циклов, нет доступа за пределы памяти, нет kernel panic. Если verifier не одобрит - программа не загрузится.
Зачем нужен eBPF verifier?
XDP (eXpress Data Path)
**XDP** - самый низкоуровневый hook для eBPF в сетевом стеке. Код выполняется сразу при получении пакета на сетевой карте, до создания sk_buff (структуры ядра для пакетов). Это даёт максимальную производительность - миллионы пакетов в секунду на одном ядре CPU.
XDP actions (возвращаемые значения): **XDP_PASS** - передать в обычный сетевой стек, **XDP_DROP** - отбросить немедленно, **XDP_TX** - отправить обратно через тот же интерфейс, **XDP_REDIRECT** - перенаправить на другой интерфейс или CPU.
**Производительность**: XDP DROP может обработать 26M пакетов/сек на одном CPU core. Для сравнения: iptables DROP - около 3M pps. XDP в 8-10 раз быстрее для простых операций.
Почему XDP быстрее iptables для DDoS mitigation?
Cilium
**Cilium** - сетевой плагин (CNI) для Kubernetes, полностью построенный на eBPF. Заменяет iptables на eBPF программы для service mesh, network policies, load balancing. Это 'eBPF-native networking' для cloud-native.
Что Cilium делает через eBPF: **Networking** (pod-to-pod, service routing без iptables), **Security** (L3/L4/L7 network policies), **Load Balancing** (kube-proxy replacement), **Observability** (Hubble - network flows visibility).
**Cilium vs kube-proxy + Calico**: kube-proxy использует iptables (тысячи правил = медленно). Cilium с eBPF держит O(1) lookup в BPF maps. При 10000+ services разница в latency - в разы.
Какое преимущество Cilium перед традиционным kube-proxy?
Kernel Bypass
**Kernel Bypass** - техника обхода сетевого стека Linux для максимальной производительности. Пакеты идут напрямую из NIC в userspace, минуя ядро. Используется для high-frequency trading, телеком, CDN.
Технологии: **DPDK** (Data Plane Development Kit от Intel) - библиотека для работы с NIC из userspace. **AF_XDP** - сокеты, позволяющие получать пакеты напрямую из XDP в userspace. **RDMA** - direct memory access между machines.
**Trade-offs**: Kernel bypass даёт минимальную latency, но теряете: firewall (iptables), connection tracking, стандартный socket API. Подходит для специализированных приложений где важна каждая микросекунда.
eBPF может заменить весь сетевой стек Linux
eBPF дополняет стек для специфических задач, но не заменяет его полностью
eBPF программы ограничены: нет циклов произвольной длины, лимит на размер программы, нет доступа к файловой системе. Для full-featured networking (сокеты, congestion control, routing daemons) всё ещё нужен традиционный стек. eBPF - хирургический инструмент, не швейцарский нож.
Когда НЕ стоит использовать kernel bypass (DPDK/AF_XDP)?
Итоги
- **eBPF** - безопасное выполнение кода в ядре Linux. Verifier гарантирует отсутствие crash'ей
- **XDP** - самый быстрый hook на пути пакета (до sk_buff). 26M pps DROP vs 3M для iptables
- **Cilium** - Kubernetes networking на eBPF. O(1) service lookup, L7 policies, Hubble observability
- **Kernel Bypass** (DPDK, AF_XDP) - пакеты из NIC в userspace напрямую. ~1µs latency вместо ~50µs
- **Trade-off**: больше скорости = меньше features (firewall, connection tracking). Выбирай под задачу
Связанные темы
eBPF - мост между сетями и observability:
- Packet Analysis — eBPF программы анализируют пакеты на wire-speed, tcpdump использует классический BPF
- Service Mesh — Cilium как eBPF-native service mesh альтернатива Istio с sidecar proxies
Вопросы для размышления
- Какие задачи в вашей инфраструктуре могли бы выиграть от eBPF? DDoS protection? Observability?
- Почему eBPF становится стандартом в cloud-native, а не остаётся нишевой технологией?
- Как бы вы объяснили trade-off между iptables и XDP нетехническому менеджеру?