[Перевод] Кунг-фу стиля Linux: о повторении кое-каких событий сетевой истории

В наши дни во встроенных системах часто имеется поддержка сети. Это может значительно их усложнить. Сетевая нагрузка на системы обычно не отличается высоким уровнем детерминированности, существуют разные варианты таких нагрузок. Порой в сетях происходят довольно-таки странные события. Например, пусть у кого-то имеется монтажная машина (PNP), к которой может обратиться любой пользователь интернета. Про эту машину написали статью на Hackaday, после чего её владелец вдруг обнаружил, что объём данных, которыми она обменивается с интернетом, возрос в 50 раз. Как в такой ситуации ведёт себя сетевая подсистема этой машины? И хотя в задаче тестирования сетей нет универсального инструмента, способного устранить все проблемы, существуют приёмы работы, которые могут упростить решение этой задачи. Один из таких приёмов работы заключается в использовании утилит из набора tcpreplay, которые позволяют записывать совокупный сетевой трафик, а потом «воспроизводить» его различными способами. У применения этого приёма есть множество сильных сторон. Особенно — если удалось «изловить» именно то, что эпизодически приводит к возникновению ошибок. Возможность по желанию «воспроизводить» такой трафик способна значительно ускорить процесс диагностики сетевых проблем.

wj6dtrex1olfb9z9wkupy773wm4.jpeg

Основная идея


Вам, возможно, известно о том, что утилита tcpdump, работающая в командной строке, позволяет перехватывать пакеты, проходящие через сетевой интерфейс, и сохранять их в файл. Если вам ближе программы с графическим интерфейсом — то вы, возможно, используете для решения той же задачи Wireshark. В двух этих инструментах используется одна и та же базовая библиотека для захвата данных — libcap. На самом деле, трафик можно захватывать, пользуясь tcpdump, а просматривать захваченные данные можно с помощью Wireshark. Правда, работать с такими данными можно и с помощью других инструментов — вроде tcptrace и Ngrep.

Хотя результаты захвата трафика, если нет инструмента, чтобы их расшифровать, могут выглядеть довольно-таки таинственными, утилита tcpreplay может брать подобные данные, сохранённые в файле, и «воспроизводить» их различными способами. Конечно, данные, хранящиеся в подобных файлах можно, перед «воспроизведением», отредактировать. Есть инструменты, которые облегчают решение этой задачи. А если надо — можно, опять же, с помощью соответствующих инструментов, конструировать трафик для «воспроизведения» самостоятельно. Этот процесс часто называют «packet crafting» — «создание пакетов».

Захват данных


Иногда использование tcpdump — это пример того, что «слишком хорошо — тоже нехорошо». Если захватывать всё подряд с некоего сетевого устройства, в результате получатся просто огромные файлы с данными:

tcpdump -i eth0


Обычно диапазон захватываемых данных как-то ограничивают. Например:

tcpdump src 192.168.1.111   # данные, идущие от адреса .111
tcpdump dst 192.168.1.111   # данные, идущие на адрес .111
tcpdump host 192.168.1.111  # данные, идущие от адреса .111 или на этот адрес


Ещё один распространённый способ фильтрации сетевых данных предусматривает использование ключевого слова net для выбора данных, имеющих отношение к конкретной подсети, или слова port. Данные даже фильтруют по используемому протоколу, вроде arp или ip6. Эти механизмы фильтрации данных можно и комбинировать:

tcpdump port 8088      # трафик, имеющий отношение к порту 8088
tcpdump dst port 8080  # трафик, идущий на порт 8088


Тут можно использовать и диапазоны портов (например — 80–89), имеется и множество других фильтров, например — учитывающих размеры пакетов. Условия фильтрации можно объединять, пользуясь операторами or и and. На самом деле, tcpdump — это большая тема, для изучения которой можно прибегнуть к справке по этой утилите.

То, что именно захватит tcpdump, зависит от используемого протокола. Для отображения данных в шестнадцатеричном формате можно пользоваться опциями -X или -XX.

Итак, после применения tcpdump в нашем распоряжении будет файл, содержащий некие интересные сетевые данные. Как «воспроизвести» эти данные в отладочных целях?

Операция «Воспроизведение»


Именно сейчас в игру вступает tcpreplay. Если не вдаваться в детали, то пользоваться этой утилитой очень просто:

tcpreplay -i eth0 traffic.pcap


Но у того, кто применяет эту утилиту, может возникнуть потребность в том, чтобы управлять разными аспектами её работы. Например, без дополнительных настроек она «воспроизводит» трафик на той же скорости, на которой он изначально передавался. А с помощью опции --mbps можно задать желаемую скорость потока данных. Можно даже воспользоваться настройкой вида --mbps=0 для того чтобы между пакетами вообще не было бы задержек.

Утилита поддерживает и другие опции, влияющие на её производительность. Так, опция -K позволяет, если это возможно, считать весь файл с захваченными данными в память, что улучшает производительность. Сильно улучшить производительность способна опция --loop, позволяющая повторить воспроизведение захваченных данных несколько раз.

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

Редактирование захваченных данных


Иногда нужно внести какие-то небольшие изменения в сетевые данные, хранящиеся в файле, не меняя при этом сам файл. Базовая утилита поддерживает некоторые способы такого воздействия на данные. Например, опция --unique-ip позволяет менять IP-адреса пакетов в каждой итерации цикла так, чтобы все пакеты выглядели бы уникальными.

Но иногда нужно вносить в данные более серьёзные изменения. В таком случае стоит взглянуть на утилиту tcpreplay-edit. Например, с её помощью можно осуществить переназначение TCP- или UDP-портов. Ещё она умеет рандомизировать IP-адреса, убирать широковещательные сообщения и позволяет, что называется, «на лету», вносить в трафик другие изменения.

Вот практический пример. Можно записать сессию обмена данными между клиентом и сервером. Для того чтобы воспроизвести поведение сервера, понадобится убрать из файла с захваченными сетевыми данными ответы сервера и переписать MAC-адреса, в результате роль клиента будет выполнять компьютер, на котором работает tcpreplay.

Итоги


Утилиты, о которых мы говорили, представляют собой мощные инструменты. Их, как и любые другие подобные инструменты, можно использовать во благо или во зло. У них имеется очень много параметров. Но тот, кто с ними, так сказать, «поиграется», тот, кто хотя бы бегло почитает справку по ним, обнаружит, что способен найти подходы к мониторингу и «воспроизведению» сетевого трафика своих систем. Это поможет ему в решении очередной вставшей перед ним заковыристой сетевой проблемы.

Пользуетесь ли вы утилитами для захвата и «воспроизведения» сетевого трафика?

image-loader.svg

© Habrahabr.ru