В наши дни во встроенных системах часто имеется поддержка сети. Это может значительно их усложнить. Сетевая нагрузка на системы обычно не отличается высоким уровнем детерминированности, существуют разные варианты таких нагрузок. Порой в сетях происходят довольно-таки странные события. Например, пусть у кого-то имеется монтажная машина (PNP), к которой может обратиться любой пользователь интернета. Про эту машину написали статью на Hackaday, после чего её владелец вдруг обнаружил, что объём данных, которыми она обменивается с интернетом, возрос в 50 раз. Как в такой ситуации ведёт себя сетевая подсистема этой машины? И хотя в задаче тестирования сетей нет универсального инструмента, способного устранить все проблемы, существуют приёмы работы, которые могут упростить решение этой задачи. Один из таких приёмов работы заключается в использовании утилит из набора tcpreplay, которые позволяют записывать совокупный сетевой трафик, а потом «воспроизводить» его различными способами. У применения этого приёма есть множество сильных сторон. Особенно — если удалось «изловить» именно то, что эпизодически приводит к возникновению ошибок. Возможность по желанию «воспроизводить» такой трафик способна значительно ускорить процесс диагностики сетевых проблем.
Вам, возможно, известно о том, что утилита 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.
Утилиты, о которых мы говорили, представляют собой мощные инструменты. Их, как и любые другие подобные инструменты, можно использовать во благо или во зло. У них имеется очень много параметров. Но тот, кто с ними, так сказать, «поиграется», тот, кто хотя бы бегло почитает справку по ним, обнаружит, что способен найти подходы к мониторингу и «воспроизведению» сетевого трафика своих систем. Это поможет ему в решении очередной вставшей перед ним заковыристой сетевой проблемы.
Источник статьи: https://habr.com/ru/company/ruvds/blog/568308/
Основная идея
Вам, возможно, известно о том, что утилита 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.
Итоги
Утилиты, о которых мы говорили, представляют собой мощные инструменты. Их, как и любые другие подобные инструменты, можно использовать во благо или во зло. У них имеется очень много параметров. Но тот, кто с ними, так сказать, «поиграется», тот, кто хотя бы бегло почитает справку по ним, обнаружит, что способен найти подходы к мониторингу и «воспроизведению» сетевого трафика своих систем. Это поможет ему в решении очередной вставшей перед ним заковыристой сетевой проблемы.
Источник статьи: https://habr.com/ru/company/ruvds/blog/568308/