- Home »

Продвинутая отладка сети с помощью pwru в 2025 году
О чём этот пост и зачем он нужен?
Если ты когда-нибудь ловил себя на мысли, что стандартные инструменты для отладки сети типа tcpdump
или wireshark
уже не вывозят, а в ядре крутится целый зоопарк современных фич вроде eBPF, nftables, tc, XDP и прочих страшных аббревиатур — добро пожаловать в клуб. Сегодня расскажу про pwru — свежий и реально продвинутый инструмент для сетевой отладки, который в 2025 году стал чуть ли не стандартом для тех, кто хочет видеть, что происходит с пакетами на всех этапах их пути через ядро Linux.
В статье разберём, как pwru работает, зачем он вообще нужен, как быстро его прикрутить к своему серверу (будь то VPS, Docker, bare metal — не важно), какие проблемы решает, а где может подставить. Примеры, грабли, лайфхаки, сравнения с другими тулзами — всё будет. Ну и конечно, как его автоматизировать и встраивать в свои скрипты.
Почему pwru стал важен именно сейчас?
С каждым годом сетевой стек Linux становится всё сложнее. eBPF, XDP, контейнеризация, overlay-сети, всякие mesh-сети, ingress/egress фильтрация, DDoS mitigation на уровне ядра — всё это не просто buzzwords, а реальный рабочий инструментарий. Но вот беда: когда что-то ломается, стандартные тулзы показывают только вершину айсберга. Пакет может быть отброшен или модифицирован на любом уровне — и понять, где именно, часто почти невозможно.
Вот тут и выстреливает pwru (Packet Walkthrough), который позволяет видеть путь пакета прямо через все слои ядра, с точными точками входа-выхода и даже аргументами функций ядра. Это не просто sniffer, а настоящий traceroute для ядра.
Как работает pwru? Алгоритмы и структура
pwru — это инструмент, построенный на базе eBPF (extended Berkeley Packet Filter). Он внедряет eBPF-программы в ключевые точки сетевого стека ядра Linux, чтобы отслеживать, как каждый пакет проходит через функции ядра.
Кратко, архитектура pwru выглядит так:
- Находит точки (tracepoints, kprobes) в сетевом стеке, куда можно повесить eBPF-программу.
- Вешает eBPF-программы, которые собирают информацию о каждом пакете: где он был, что с ним сделали, какие параметры были у функции и т.д.
- Собирает логи и выводит их в удобочитаемом виде (терминал, JSON, Prometheus и т.д.).
В отличие от классических снифферов, pwru не просто показывает пакеты на интерфейсах, а реально трекает судьбу каждого пакета в ядре: где он был принят, где отброшен, где изменён, какой фильтр его зацепил и т.д.
Что можно отследить с помощью pwru?
- В какой функции ядра пакет был отброшен (например, iptables, nftables, XDP, eBPF-программы, routing).
- Какие параметры были у этой функции (например, IP-адреса, порты, флаги TCP, состояние соединения).
- Какой путь прошёл пакет: входящий, локальный, форвардинг, выходящий.
- Как работают ваши eBPF-программы, если они есть.
- Почему не работает DNAT/SNAT, где теряются пакеты при контейнеризации, почему не работает overlay-сеть и т.д.
Как быстро и просто всё настроить?
Сразу к делу. Для работы pwru нужен современный Linux (ядро 5.10+), поддержка eBPF и clang/llvm для компиляции. В большинстве свежих дистрибутивов всё это уже есть.
Установка pwru
Самый простой способ — использовать официальный репозиторий:
https://github.com/cilium/pwru
# Установим зависимости (пример для Ubuntu / Debian)
sudo apt update
sudo apt install clang llvm libelf-dev gcc make git
# Клонируем репозиторий
git clone https://github.com/cilium/pwru.git
cd pwru
# Собираем
make
# Устанавливаем бинарник (по желанию)
sudo cp pwru /usr/local/bin/
Минимальная настройка и запуск
# Запустить pwru для отслеживания всего трафика на интерфейсе eth0
sudo pwru -i eth0
# Фильтровать по IP и порту (например, только пакеты на 10.0.0.5:80)
sudo pwru -i eth0 --src-ip 10.0.0.5 --src-port 80
# Смотреть только дропнутые пакеты (очень полезно!)
sudo pwru --drop
# Выводить в JSON для последующего анализа
sudo pwru --json > packets.json
pwru по умолчанию показывает огромный поток событий — фильтруйте по интерфейсу, IP, порту, дропам, чтобы не утонуть в логе.
Схема работы pwru
[Входящий пакет] ↓ [eBPF hook в точке netif_receive_skb] ↓ [Маршрутизация, firewall, eBPF, XDP, nftables, iptables ...] ↓ [eBPF hook на каждом этапе] ↓ [Выходной интерфейс или drop]
pwru позволяет видеть, на каком этапе и по какой причине пакет был дропнут или изменён.
Примеры и кейсы: что может пойти не так и как pwru это решает
Ситуация | Что видит tcpdump | Что видит pwru | Рекомендация |
---|---|---|---|
Пакеты не доходят до приложения | Пакеты приходят на интерфейс, дальше — тишина | Показывает, что пакет дропнут на уровне nftables с деталями | Проверь правила nftables/iptables, исправь ошибку |
DNAT/SNAT не работает в Docker | Пакеты видно на внешнем интерфейсе, но не в контейнере | Показывает, где происходит NAT, где пакет теряется | Проверь настройки iptables, bridge и Docker network |
eBPF/XDP фильтрует пакеты | tcpdump ничего не показывает — пакет не дошёл до стека | pwru показывает, что пакет отброшен на уровне XDP/eBPF | Проверь eBPF-программы, убери или исправь фильтр |
Реальный пример: почему не работает overlay-сеть в Kubernetes
- В кластере K8s overlay-сеть (например, Cilium или Calico) — пакеты между подами не проходят.
- tcpdump видит пакеты на физическом интерфейсе, но не в поде.
- pwru показывает, что пакет дропается на eBPF-программе Cilium с ошибкой из-за неправильной маркировки.
- Исправляем конфиг Cilium — всё работает.
Ошибки новичков и мифы
- Миф: pwru — это просто продвинутый tcpdump.
Факт: pwru работает на уровне ядра, а не только на интерфейсах, и показывает события, которые tcpdump не увидит никогда. - Ошибка: Запускать pwru без фильтров на продакшене.
Факт: Можно получить гигабайты логов и нагрузить ядро. Фильтруйте по интерфейсу, IP, порту, дропам! - Миф: pwru нужен только для eBPF.
Факт: Он помогает и с классическим routing, iptables, nftables, bridge, Docker и т.д. - Ошибка: Использовать старое ядро (<5.10) — не работает или работает криво.
Похожие решения и сравнение
Инструмент | Что делает | Плюсы | Минусы |
---|---|---|---|
tcpdump | Сниффит пакеты на интерфейсах | Просто, быстро, везде есть | Не видит, что происходит в ядре, не показывает дроп/фильтрацию |
wireshark | Графический анализатор трафика | Удобно для анализа протоколов | То же, что tcpdump, не видит ядро |
trace-cmd, perf | Трассировка функций ядра | Глубокий анализ, но сложно | Не заточено под сеть, много ручной работы |
bpftool | Управление eBPF-программами | Гибко, мощно | Сложно для новичков, нет сетевого фокуса |
pwru | Трассировка пакетов на всех этапах ядра | Видит всё, что происходит с пакетами, удобен для сетевой отладки | Нужно новое ядро, нагрузка при больших потоках |
Интересные факты и нестандартные способы использования
- pwru можно интегрировать с Prometheus/Grafana — строить графики по дропам, задержкам, трассировке пакетов.
- Можно запускать pwru в контейнере, если дать ему доступ к /proc/kcore и BPF — удобно для временной отладки.
- Используется для анализа DDoS-атак: показывает, где именно ядро дропает пакеты, и какие фильтры срабатывают.
- Можно подключить pwru к CI/CD пайплайнам — ловить регрессии в сетевой логике сразу при деплое.
- В режиме JSON pwru отлично дружит с jq, ELK, Loki и любыми log-агрегаторами.
Новые возможности для автоматизации и скриптов
- pwru поддерживает вывод в JSON — можно парсить события в скриптах на bash, python, go, что угодно.
- Можно автоматически запускать pwru при возникновении ошибки (например, через systemd или cron) и сохранять логи для последующего анализа.
- В связке с ansible/terraform можно автоматизировать сетевую диагностику в облаке или на выделенных серверах.
- Можно строить алерты: если выросло количество дропов на определённом этапе ядра — шлём уведомление в Slack/Telegram.
Выводы и рекомендации
pwru — это must-have для тех, кто работает с современными Linux-серверами, контейнерами, облаками и хочет реально понимать, что происходит с трафиком в ядре. Если ты держишь VPS, выделенный сервер или облачную инфраструктуру, pwru поможет быстро найти и пофиксить сетевые баги, которые раньше были почти неуловимыми.
Рекомендации:
- Используй pwru для сложных случаев: когда tcpdump уже не помогает, а баг явно где-то в ядре.
- Не запускай без фильтров на продакшене — фильтруй по нужным IP, портам, дропам.
- Интегрируй pwru с лог-агрегаторами и мониторингом для автоматизации.
- Следи за обновлениями: инструмент активно развивается, появляются новые фичи и точки трассировки.
Если ты ещё не пробовал pwru — самое время начать. Это реально экономит часы (а иногда и дни) на поиске сетевых проблем.
Официальный репозиторий: https://github.com/cilium/pwru
Ну а если ищешь, где всё это развернуть — VPS или выделенный сервер — как всегда к твоим услугам.
Удачной отладки и пусть пакеты всегда доходят до цели!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.