Home » Отслеживание пакетов с pwru: продвинутая отладка eBPF
Отслеживание пакетов с pwru: продвинутая отладка eBPF

Отслеживание пакетов с 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 или в профильные чаты, комьюнити реально помогает.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked