Мобильные устройства на базе Linux (Termux, Ubuntu Touch, Alpine Linux и пр.) становятся полноценными платформами для разработки и эксплуатации сетевых сервисов. Одним из самых мощных инструментов, позволяющих получать глубокие наблюдения за сетью без существенного накладного расхода, является eBPF (extended Berkeley Packet Filter). В этой статье мы разберём, как установить и использовать eBPF в Termux для мониторинга сетевого трафика, какие возможности открывает XDP и какие подводные камни следует учитывать.
Что такое eBPF?
eBPF – это виртуальная машина внутри ядра Linux, позволяющая загружать небольшие программы (байткод) в пространство ядра без необходимости писать модули. Программы eBPF могут:
- Отслеживать события (syscalls, сетевые пакеты, трассировку функций).
- Фильтровать и модифицировать пакеты в реальном времени (XDP – eXpress Data Path).
- Собирать метрики с минимальными задержками.
Благодаря JIT‑компиляции и строгой проверке безопасности, eBPF работает почти так же быстро, как нативный код ядра, но остаётся полностью контролируемым пользователем.
Почему eBPF актуален для мобильных Linux‑дистрибутивов?
Мобильные устройства обладают ограниченными ресурсами, однако часто требуют:
- Тонкого контроля сетевого трафика (например, для VPN‑клиентов, прокси‑серверов).
- Отладки приложений в реальном времени.
- Сборки телеметрии без установки тяжёлых пользовательских агентов.
eBPF позволяет решить эти задачи без значительного потребления CPU и памяти, что особенно ценно в окружении Termux, где каждый мегабайт на счету.
Подготовка окружения в Termux
Для работы с eBPF необходимо, чтобы ядро Android поддерживало нужные возможности (BPF syscalls, JIT, XDP). Современные версии Android 10+ обычно включают базовую поддержку. Выполните следующие шаги:
# Обновляем репозитории и пакеты
pkg update && pkg upgrade -y
# Устанавливаем необходимые инструменты
pkg install clang llvm make git python -y
# Клонируем репозиторий с BPF‑утилитами
git clone https://github.com/iovisor/bcc.git
cd bcc
# Устанавливаем зависимости (в Termux используется libelf, zlib и др.)
pkg install libelf-dev zlib-dev libbpf-dev -y
# Сборка BCC (часть toolkit для eBPF)
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
make install
После успешной сборки в системе появятся такие утилиты, как bpftool, bpftrace и набор скриптов Python для работы с BPF‑карта.
Базовый мониторинг сети с bpftrace
Самый быстрый способ получить представление о сетевом трафике – написать небольшую программу на bpftrace. Пример ниже выводит количество TCP‑соединений, открытых процессом curl:
# bpftrace -e 'tracepoint:tcp:tcp_probe /comm == "curl"/ { @cnt[pid] = count(); }'
Команда запускает трассировку точки входа tcp_probe и агрегирует количество вызовов по PID. Вывод будет выглядеть так:
@cnt[1234]: 42
Для более детального анализа пакетов можно использовать socketreceive и socketsend:
# bpftrace -e '
tracepoint:syscalls:sys_enter_recvfrom /comm == "wget"/ {
@bytes[pid] += args->size;
}
tracepoint:syscalls:sys_enter_sendto /comm == "wget"/ {
@bytes[pid] += args->size;
}'
Эти скрипты позволяют в реальном времени видеть, сколько данных отправляет и получает конкретное приложение.
Сниффинг пакетов с XDP
XDP – это механизм, позволяющий выполнять eBPF‑программы ещё до того, как пакет попадёт в сетевой стек. Он идеален для реализации фильтрации DDoS‑атак, подсчёта метрик или даже простого firewall‑правила. Пример загрузки простой XDP‑программы, которая считает все входящие IPv4‑пакеты:
# cat xdp_count.c
#include
#include
struct {
uint(type, BPF_MAP_TYPE_ARRAY);
type(key, u32);
type(value, u64);
uint(max_entries, 1);
} pkt_cnt SEC("maps");
SEC("xdp")
int xdp_prog(struct xdp_md ctx) {
u32 key = 0;
u64 cnt = bpf_map_lookup_elem(&pkt_cnt, &key);
if (cnt) sync_fetch_and_add(cnt, 1);
return XDP_PASS; // пропускаем пакет дальше в стек
}
char _license[] SEC("license") = "GPL";
Скомпилируйте и загрузите программу:
# clang -O2 -target bpf -c xdp_count.c -o xdp_count.o
# sudo ip link set dev wlan0 xdp obj xdp_count.o sec xdp
После загрузки можно запросить текущий счётчик:
# bpftool map dump pinned /sys/fs/bpf/pkt_cnt
Обратите внимание, что в Termux привилегии «root» могут потребоваться. На Android без root‑доступа XDP обычно недоступен, однако в средах, где ядро работает в режиме «user‑land», можно использовать eBPF‑программы типа tc (Traffic Control) без XDP.
Сбор метрик с помощью BCC (Python)
Если вам удобнее работать в Python, библиотека bcc предоставляет готовый набор скриптов. Ниже – пример скрипта, собирающего статистику по TCP‑соединениям в реальном времени:
#!/usr/bin/env python3
from bcc import BPF
import time
bpf_text = """
int kprobetcp_v4_connect(struct pt_regs ctx, struct sock sk) {
u64 pid = bpf_get_current_pid_tgid();
u64 cnt = connections.lookup(&pid);
if (cnt) {
(cnt)++;
} else {
u64 zero = 1;
connections.update(&pid, &zero);
}
return 0;
}
BPF_HASH(connections, u64, u64);
"""
b = BPF(text=bpf_text)
print("Слежу за TCP‑соединениями … Ctrl‑C для выхода")
try:
while True:
time.sleep(5)
print("--- Счётчики ---")
for k, v in b["connections"].items():
print(f"PID {k.value}: {v.value} соединений")
b["connections"].clear()
except KeyboardInterrupt:
pass
Скрипт использует kprobe на функцию tcp_v4_connect и выводит количество соединений, инициированных каждым процессом.
Оптимизация и ограничения
- JIT‑компиляция: убедитесь, что в ядре включён
CONFIG_BPF_JIT. Без JIT‑поддержки eBPF‑программы исполняются интерпретатором, что повышает нагрузку. - Размер карт: в мобильных устройствах память ограничена, поэтому используйте карты с небольшим числом элементов (например, массивы из 1‑10 записей).
- Безопасность: eBPF‑программы проходят верификацию, но пользователь всё равно может написать «тяжёлый» скрипт, который будет генерировать большое количество событий. Ограничьте максимальное количество записей в BPF‑картой и используйте фильтры.
- Root‑привилегии: большинство функций (XDP, tc‑bpf) требуют root‑доступа. На не‑root‑устройствах ограничены только пользовательские трассировки (tracepoint, kprobe).
Практические рекомендации
- Перед запуском проверяйте поддержку BPF через
bpftool feature. - Для отладки используйте
bpftool prog dumpиbpftool map dump. - Размещайте BPF‑программы в
/data/data/com.termux/files/usr/lib/bpf/и фиксируйте их черезbpftool prog load– так они сохранятся между перезагрузками Termux. - Если нужен постоянный мониторинг, создайте systemd‑unit (Termux‑boot) или скрипт init.d, который будет автоматически загружать программы при старте.
Заключение
eBPF открывает новые возможности для мониторинга сети в мобильных дистрибутивах Linux. В Termux вы получаете полноценный набор инструментов (bpftool, bpftrace, bcc), позволяющих собирать детализированные метрики, фильтровать пакеты и реализовывать лёгкие firewall‑решения без существенного расхода ресурсов. При правильной настройке eBPF помогает держать под контролем сетевой трафик, отлаживать приложения и повышать общую безопасность мобильного устройства.
Если вам нужен профессиональный аудит сетевой инфраструктуры, разработка кастомных eBPF‑решений под Android/Termux, или обучение персонала – обратитесь в RybinskLab. Мы предоставляем консалтинговые услуги, пишем специализированные eBPF‑модули, помогаем интегрировать мониторинг в CI/CD и обеспечиваем поддержку на всех этапах проекта.