- Home »

Отслеживание пакетов с pwru: продвинутая отладка eBPF
Если ты когда-нибудь ловил себя на мысли, что tcpdump и wireshark — это, конечно, круто, но иногда хочется чего-то поядренее для отладки сетевого стека в ядре Linux, то эта статья для тебя. Сегодня разберёмся, как pwru (Packet Watch and Redirect Utility) помогает не просто “смотреть пакеты”, а реально видеть, как они проходят через все кишки ядра, где теряются, где тормозят, и почему твой прокси, контейнер или виртуалка вдруг перестал видеть мир. Всё это — с помощью eBPF, без ребута, без пересборки ядра и без лишних плясок с бубном.
О чём эта статья и зачем она нужна
Тут не будет занудных лекций про сетевые стеки и внутренности ядра (ну, почти). Вместо этого — разберёмся, как pwru реально облегчает жизнь сисадминам, девопсам и просто любителям покопаться в сетевых дебрях. Будут примеры, грабли, которые я сам собрал, и советы, как не наступить на них снова.
- Покажу, как pwru помогает находить “невидимые” потери пакетов и баги сетевого стека Linux.
- Дам пошаговую инструкцию по установке и запуску — быстро и без лишней теории.
- Разберём кейсы, когда pwru реально спасает время и нервы (и когда — нет).
- Покажу, как pwru автоматизирует рутину и облегчает жизнь тем, кто настраивает облака, VPS, Docker и выделенные сервера.
Почему это важно: проблема, которую решает pwru
Всё просто: стандартные tcpdump и iptables-логирование видят только то, что пролетает по интерфейсам или цепочкам фильтрации. Но что, если пакет “умирает” где-то внутри ядра — например, на этапе маршрутизации, после netfilter, в драйвере сетевой карты или в каком-нибудь хитром eBPF-хуке? Вот тут и начинается магия pwru.
pwru — это инструмент, который позволяет видеть, как пакет проходит через все этапы обработки в ядре Linux, в реальном времени, с минимальным оверхедом. Ты реально видишь, на каком этапе пакет “падает”, какие поля у него были изменены, и почему он не дошёл до нужного приложения.
Как это работает: немного магии eBPF
pwru — это не просто “ещё один сниффер”. Он использует eBPF (extended Berkeley Packet Filter) — технологию, которая позволяет динамически внедрять код в ядро Linux, не пересобирая его. eBPF — это как плагины для ядра: ты можешь писать свои фильтры, анализаторы и даже мини-файрволы, которые работают на уровне ядра, но не требуют модификации исходников.
pwru “втыкает” свои eBPF-программы в ключевые точки (tracepoints и kprobes) сетевого стека: ingress, egress, netfilter, routing, socket, драйверы сетевых карт и т.д. Каждый раз, когда пакет проходит через такую точку, pwru получает его копию, анализирует и выводит инфу в удобном виде.
- Ты видишь путь пакета по ядру — от входа в интерфейс до выхода или дропа.
- Можно фильтровать пакеты по интерфейсу, адресу, порту, PID процесса и даже по конкретной функции ядра.
- Получаешь максимум информации: stack trace, поля пакета, причину дропа, имя процесса, который его обработал.
Архитектура pwru
- CLI-утилита (pwru) — запускает и управляет eBPF-программами.
- eBPF-программы — динамически компилируются и загружаются в ядро.
- Коммуникация через netlink или perf buffer — минимальная задержка, низкий overhead.
- Работает на современных ядрах Linux (5.x и выше), не требует спец. модулей.
Как быстро настроить pwru: пошаговая инструкция
Сразу к делу — никакой воды, только практические шаги. Для примера — Ubuntu 22.04, но на CentOS/RHEL 8+ всё аналогично.
1. Проверка ядра и зависимостей
- Нужен kernel >= 5.3 (идеально — свежее 5.10)
- Обязательно: установлен пакет
clang
иllvm
(для компиляции eBPF) - Желательно:
libbpf
иbpftool
uname -r
apt update && apt install clang llvm libbpf-dev bpftool git build-essential -y
2. Установка pwru
Официальный репозиторий: https://github.com/cilium/pwru
git clone https://github.com/cilium/pwru.git
cd pwru
make
sudo make install
Появился бинарник /usr/local/bin/pwru
. Всё, можно стартовать!
3. Первый запуск и базовые фильтры
sudo pwru
Ты увидишь поток событий — это все пакеты, которые проходят через ключевые точки ядра. Можно фильтровать:
sudo pwru -i eth0 --src-ip 192.168.1.100
sudo pwru --dport 80 --proto tcp
sudo pwru --pid 1234
Можно смотреть только дропнутые пакеты:
sudo pwru --drop
4. Продвинутые фильтры и вывод
- По функции ядра:
--func ip_rcv
- По cgroup:
--cgroup-path /sys/fs/cgroup/...
- С выводом stack trace:
--trace
- JSON-вывод для парсинга скриптами:
--json
Всё это можно комбинировать!
5. Примеры кейсов (таблица)
Кейс | Что делаем | Результат | Рекомендация |
---|---|---|---|
Пакеты не доходят до контейнера в Docker | sudo pwru --pid $(docker inspect --format '{{.State.Pid}}' mycontainer) |
Видим, где пакет дропается (например, на iptables или bridge) | Проверить правила NAT/bridge, пересоздать сеть |
Потеря пакетов на VPS | sudo pwru --drop --src-ip X.X.X.X |
Видим точку дропа (например, rp_filter) | Отключить rp_filter или скорректировать маршруты |
Дебаг ingress eBPF-программы | sudo pwru --func bpf_prog_run_pin_on_cpu |
Видим, как eBPF фильтрует пакеты | Исправить логику eBPF-программы |
Ошибки новичков и мифы
- pwru — это не просто tcpdump для ядра. Он не покажет тебе “сырые” пакеты с полезной нагрузкой, а только метаданные на этапах обработки.
- pwru не требует пересборки ядра, но старые ядра (<5.3) поддерживаются плохо.
- pwru не заменяет полностью wireshark, но отлично дополняет его для анализа проблем внутри ядра.
- pwru не “тормозит” сервер, если фильтры выставлены адекватно. Но если запустить без фильтров на production — можно словить лаги.
Похожие решения и сравнение
Инструмент | Что умеет | Плюсы | Минусы |
---|---|---|---|
tcpdump | Снимок пакетов на интерфейсе | Просто, быстро, привычно | Не видит, что происходит в ядре после приема пакета |
wireshark | Графика, анализ, фильтры | Отлично для приложений и протоколов | Не видит внутренности ядра |
bpftool, bpftrace | eBPF-трейсинг, скрипты | Гибко, мощно | Сложно для новичка, требует знаний eBPF |
pwru | Трассировка пакетов по ядру | Видно, где и почему пакет “умирает” | Не видит полезную нагрузку, нужен свежий kernel |
Интересные факты и нестандартные сценарии
- pwru можно запускать в контейнере (если дать доступ к /proc/kcore и /sys/kernel/debug/tracing).
- Можно использовать pwru для дебага DDoS-фильтров, балансировщиков, iptables и nftables одновременно.
- pwru отлично ложится в пайплайн CI/CD: автоматическая проверка сетевых политик в k8s, тестирование eBPF-программ.
- Можно писать свои eBPF-программы и подгружать их через pwru для кастомных задач.
Автоматизация и новые возможности
pwru идеально подходит для автоматизации дебага сетевых проблем. Например:
- Скрипты, которые автоматически запускают pwru при обнаружении потерь пакетов (например, через zabbix или prometheus-алерты).
- Интеграция с ansible/terraform: автоматическая проверка сетевой связности после деплоя.
- Парсинг вывода pwru в JSON и построение графов прохождения пакетов через ядро (например, с помощью grafana или kibana).
- Расширение функционала: можно реализовать свои алерты на дропы пакетов по определённым причинам (например, rp_filter, iptables, eBPF drop и т.д.).
Выводы и рекомендации
- Если ты занимаешься настройкой серверов, VPS, контейнеров или облачных решений — pwru должен быть в твоём арсенале.
- pwru — это инструмент для продвинутого дебага сетевого стека Linux, который позволяет видеть, где и почему пакет теряется внутри ядра.
- Установка простая, работает на большинстве современных дистрибутивов, не требует пересборки ядра.
- pwru отлично дополняет tcpdump, wireshark и bpftrace, но не заменяет их полностью.
- Для автоматизации и CI/CD — это must-have: можно быстро находить и устранять сетевые баги, экономить часы на дебаге.
Хочешь попробовать pwru на своём сервере? Закажи себе VPS или выделенный сервер — и экспериментируй без страха за production!
Официальная дока и свежие релизы: https://github.com/cilium/pwru
Вопросы, баги, лайфхаки — пишите в issues на github или в профильные чаты, комьюнити реально помогает.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.