Сетевая отладка в Linux kernel — пара полезных инструментов для мониторинга отброшенных пакетов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Сегодня мы решили обсудить вопросы сетевого мониторинга и рассмотреть несколько утилит, позволяющих заглянуть под капот процессов обмена фреймами в ядре Linux. Далее, говорим про pwru, dropwatch и KGDBoE.

/ unsplash.com / Bohdan Orlov
/ unsplash.com / Bohdan Orlov

Зачем нужны такие решения

Проверка статуса отброшенных пакетов в ядре может вызывать сложности. Приходится отсматривать файл /proc/net/snmp, изучать вывод таких утилит, как netstat, tc и ethtools. Сисадмин должен знать каждый из этих инструментов, чтобы видеть связь между конкретными событиями.

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

pwru

Это — open source инструмент с продвинутыми механизмами фильтрации. Он помогает отслеживать проблемы подключений в Linux kernel. Утилита построена на базе технологии eBPF, позволяющей запускать произвольный код пользователя в рамках kernel. Так, можно безопасно расширить возможности ядра без необходимости вносить изменения в исходный код или загружать дополнительные модули.

Что касается конкретных настроек, то pwru умеет фильтровать по IP-адресу принимающей стороны, по портам отправителя и получателя, по протоколам L4 [tcp, udp, icmp, icmp6] и многим другим параметрам.

--filter-dst-ip string  // фильтрация по IP-адресу приёмника 
--filter-port uint16   // фильтрация по портам отправителя и получателя
--filter-proto string  // фильтрация по протоколам L4 (tcp, udp, icmp, icmp6)

Если установлены несколько фильтров, то пакет отслеживается, когда его параметры удовлетворяют каждому требованию. Так, gif-изображение в репозитории показывает, какие фреймы были отброшены после установки правил в IP tables.

/ unsplash.com / Trent Pickering
/ unsplash.com / Trent Pickering

Docker-образ pwru лежит в соответствующем репозитории. Развернуть его можно как на Kubernetes, так и Vagrant.

Сам по себе проект достаточно молодой и существует около двух лет. Но за это время он успел обрасти компактным сообществом энтузиастов, собрав более 1,6 тыс. звезд на GitHub. Разработчики продолжают поддерживать инструмент (в том числе с помощью комьюнити) и вносят изменения, улучшающие quality of life пользователей. Одно из последних обновлений связано с читабельностью ошибок. В Linux kernel десятки причин, по которым пакеты оказываются отброшены. И теперь pwru автоматически выводит причину из kfree_skb_reason в консоль. Так, пользователям не приходится возвращаться к релевантному куску исходного кода ядра.

dropwatch

Dropwatch — еще один проект, который помогает разработчикам и системным администраторам диагностировать проблемы в сетевом стеке Linux. Его даже использовали инженеры Google для детекции отброшенных DNS-пакетов.

Утилита записывает фреймы в файл пользовательского пространства с помощью одноименного протокола. В итоге для мониторинга можно применить tcpdump.

Автор dropwatch утверждает, что делал упор на производительности — например, он реализовал асинхронные нотификации об отброшенных пакетах. С другой стороны, резиденты HN в тематическом треде отмечают, что существуют и другие быстрые решения — например, perf и skb:kfree_skb tracepoint. Такой подход не требует специфической настройки конфигов ядра (NET_DROP_MONITOR).

KGDBoE

Это — инструмент, который позволяет производить отладку в Linux kernel по сети. Он достаточно старый [даже на GitHub можно найти репозитории с форками восьмилетней давности], так как существовал еще в виде набора патчей для дебаггера KGDB, когда тот не был интегрирован в kernel. Но эти патчи были несовместимы с новыми ядрами и плохо работали на multi-core системах.

Но обновленная версия инструмента вполне подходит для ядер 3.8.0–5.15.0, 5.19.0 и 6.3.x. Исходный код доступен по лицензии GPL, поэтому его можно подкорректировать под собственные нужды.

Что касается процесса настройки, то он довольно прост — даже адреса IP или MAC прописывать необязательно. На официальном сайте есть краткое руководство для быстрого старта. В то же время KGDBoE имеет несколько ограничений, связанных с брейкпоинтами. Их установка в сетевом коде или функции mod_timer() может приводить к дедлоку отладочной сессии.


О чем еще мы пишем в нашем корпоративном блоге:

  • Больше протоколов для шифрования DNS-запросов

  • Потенциальная уязвимость DHCP и rDNS — что нужно знать

  • Pest — компактный p2p-протокол

Источник: https://habr.com/ru/companies/vasexperts/articles/728134/


Интересные статьи

Интересные статьи

Она носит название bufferbloat, или «излишняя сетевая буферизация». Обсудим причины, а также механизмы, которые позволят разрешить ситуацию (по крайней мере, в теории).
Традиционно разработка требует от программиста внимательности и сосредоточения. Это утверждение справедливо и для процесса вёрстки. Переключаясь между макетом и проектом, нужно приложить максимум усил...
... а также 13 навыков, которыми надо овладеть, если хотите перейти из сисадминов в менеджеры – мы собрали для вас коротким дайджестом список полезных материалов, найденных нами в сети за последние дв...
В вопросах именно сетевой безопасности функционально выделяются два компонента:IDS - Intrusion Detection System, система обнаружения вторжений.IPS - Intrusion Prevention ...
Получив доступ к системе, важно его не потерять. Выключение узла, завершение процесса - все это разрывает бек-коннект. И приходится начинать сначала. Даже если вы успели ...