Wireshark. Первое знакомство с сетевой акулой.
Уже довольно давно я услышал про эту сетевую утилиту, но почему-то всё не доходили руки с ней познакомиться. Для начала отвечу на вопрос, что это вообще за зверь такой. Итак, Wireshark - это программа для захвата и анализа сетевого трафика. С помощью вайршарка можно произвести и знакомство с сетевым трафиком как с явлением, и находить/исправлять какие-либо проблемы, возникающие при работе сетевых протоколов. В частности, это мощный инструмент для траблшутинга, который часто использует техническая поддержка провайдеров.
Wireshark умеет работать практически со всеми известными протоколами, имеет довольно понятный GUI (если в таких программах интерфейс вообще можно назвать понятным), и где-то даже логичный. Тут еще стоит отметить мощнейшую систему фильтров, которой данная программа обладает. Вайршарк у нас кроссплатформенный, работает на большинстве популярных и не очень ОСей - Lunux, Solaris, FreeBSD, NetBSD, OpenBSD, всякие там Mac OS X и, конечно, Windows. Распространяется прога по лицензии GNU GPL v2, и доступна совершенно бесплатно на сайте wireshark.org
Устанавливается она из-под винды просто и быстро - жмякаем себе "Далее" и всё.
Актуальная на момент написания статьи версия - 2.2.5, в обзоре будет участвовать она, а некоторые моменты из практики из версий 1.0.2 и 1.10.3
Пока у вас скачивается и устанавливается программа ответим на вопрос, который у вас, думаю, уже появился. Зачем вообще нужны анализаторы пакетов?
Всё просто и сложно одновременно. Без подобных утилит невозможно проводить исследования различных сетевых протоколов и работающих с ними приложений. И, конечно, быстро и эффективно находить проблемы в работе сети без такого вот анализатора вы тоже не сможете (не говоря уже о причинах этих проблем).
Само собой разумеется, что для использования снифферов и анализаторов вам нужно иметь хотя бы общее понимание работы сетей и сетевых протоколов. А еще есть скользкий момент - во многих странах использование сниффера без явного на то разрешения приравнивается к преступлению. Минутка юмора закончилась, спасибо.
- Вы готовы, дети?
- Да, капитан!
Для начала выберем интерфейс, с которого нужно захватить трафик. В нашем примере имеется только один активный интерфейс "Ethernet 2" (оно же "Подключение по локальной сети 2" в соответсвующем разделе панели управления). Выбираем и нажимает на "Start".
После этого начинается процесс захвата, при этом все прилетевшие пакеты будут отображаться у вас в реальном времени. Когда вы будете разбираться с пакетами вам однозначно потребуется вернуться к предыдущему или перейти к следующему пакету. Для этого в меню у вас имеются две кнопки:
Рядом приютилась кнопка, позволяющая перейти к пакету с соответствующим номером:
Если колонки наползли друг на друга, их размеры можно поменять как в любой другой табличке. Или можете тыкнуть на кнопку "Resize all Columns" в меню View.
Также важный момент - отсчет времени. Можно настроить его в абсолютном формате, или начинать отсчет с первого пакета (читай, с момента начала захвата)/момента получения предыдущего пакета (Since Previous Captured Packet)... Вариантов масса. Ищем в View - Time Display Format:
Еще один момент. Мы привыкли обычно видеть в меню Help - About... версию программы и список авторов, но в вайршарке там есть специальная вкладка Folders, где указаны пути размещения каталогов с конфигами утилиты.
Но мы с вами продолжим изучение интерфейса. Выберем, домустим самый обычный http-пакет, и увидим, что HTTP (вот же новость!) инкапсулируется у нас в TCP (транспортный уровень), TCP же инкапсулируется в IP (уже сетевой уровень), а IP в свою очередь инкапсулируется в Ethernet (перед этим мелькает даже 802.1q).
А на самом верху идет общая информация о кадре.
Дальше уже мы поговорим о таком инструменте как фильтры, а пока на данном этапе нам достаточно сделать правый клик на пакете, и выбрать меню Apply as Filter – Not selected.
Если потребуется еще что-то убрать, то в следующий раз выбираем "and not Selected", и новое правило просто добавится к фильтру.
Фильтруем поток
Wireshark содержит два вида фильтров – захвата (Capture Filters) и отображения (Display Filters).
Вначале рассмотрим Capture Filters.
Как можно догадаться по названию, они служат для фильтрации еще на этапе захвата трафика.
Но в таком случае, безусловно, можно безвозвратно потерять часть нужного трафика.
Фильтр представляет собой выражение, состоящее из встроенных значений, которые при необходимости могут объединяться логическими функциями (and, or, not).
Для того, чтобы его задействовать, нужно зайти в меню Сapture, затем Options, и в поле Capture Filter набрать, например, host 8.8.8.8 (или, например, net 192.168.0.0./24)
Так же, конечно, можно выбрать и заранее созданный фильтр (за это отвечает кнопка Capture Filter).
В любом из вариантов фильтр появится возле интерфейса, можно жать Start.
Теперь перейдем к Display Filters.
Они фильтруют исключительно уже захваченный трафик.
Что можно фильтровать?
— Практически все — протоколы, адреса, специфические поля в протоколах.
Операции, которые можно использовать при построении фильтров:
Как вы, наверное, заметили, в таблице в качестве примеров были разнообразные выражения, достаточно понятные и зачастую говорящие сами за себя.
Например, ip.dst – это поле протокола IP.
Чтобы увидеть это поле, можно просто посмотреть на пакет, и в нижней части окна можно увидеть его значение, которое потом можно применять в любом фильтре.
Например, нас интересует, как создать фильтр, где будет проверяться значение TTL.
Для этого раскрываем L3 часть и становимся на соответствующее поле:
А теперь переводим взгляд в самый низ окна программы:
И видим, что для построения фильтра, нужно использовать выражение ip.ttl.
Если начать набирать фильтр, то после точки автоматически появится список возможных значений:
Чтобы применить фильтр, достаточно нажать enter или кнопку Apply.
Само поле для ввода фильтра может менять цвет в зависимости от того, что было набрано.
Зеленый цвет означает, что все в порядке. Красный — допущена ошибка, желтый — получен неожиданный результат, потому что существуют другие варианты написания фильтра (например можно написать ip.dst != 8.8.8.8 или же !ip.dst == 8.8.8.8, именно второй вариант более предпочтительный).
Фильтры можно сохранять для дальнейшего использования, нажав кнопку Save, затем ввести произвольное название
И после нажатия на кнопку ОК фильтр будет доступен в меню Manage Display Filters.
А если кликнуть на расположенную неподалеку кнопку «Expression…», то откроется достаточно мощный конструктор выражений, по которому можно чуть ли не изучать сетевые протоколы. Количество поддерживаемых протоколов постоянно увеличивается.
Как уже упоминалось ранее, можно выделить любой пакет и в контекстном меню выбрать Apply as Filter и в подменю выбрать режим — selected или not selected и соответственно сразу же появится фильтр, который будет показывать только выбранное или наоборот уберет выбранное с экрана.
Таким образом можно гибко выбирать, что видеть на экране, а что — нет.
Это может быть определенный ip-адрес, ttl, порт, dns ответ и многое другое.
Кроме того, есть два варианта для таких быстрых фильтров — Prepare as Filter и Apply as Filter.
Как можно догадаться по названию — разница заключается в том, что в первом случае только появится в поле для ввода Display Filter, но не применится (удобно, если например, добавлять таким способом несколько фильтров, а затем сразу применить готовый результат), а во втором — сразу же и применится.
Фильтры можно объединять, используя знакомые по булевой алгебре логические операции:
(dns) && (http) логическое и
(dns) || (http) это логическое или
Таким образом можно строить большие и сложные фильтры вроде:
(tcp.flags.syn==1) && (ip.src == 172.16.10.2) && (ip.dst == 172.16.10.1)
Здесь видим, что выбираются только TCP SYN сегменты, только с определенным адресом отправителя и получателя. При составлении больших фильтров нужно помнить, что фильтр по сути — логическое выражение, и если оно истинно, то пакет отобразится на экране, если ложно — нет.
Ныряем глубже
Достаточно частая ситуация, когда возникают жалобы на медленную работу сети, причин этого может быть множество.
Попробуем разобраться, в чем может быть причина, и рассмотрим два способа.
Первый состоит в добавлении колонки TCP delta.
Открываем пакет (TCP-пакет!), находим поле Time since previous frame in this TCP frame, правый клик и выбираем Apply as Column. Появится новая колонка.
На ней можно кликнуть правой кнопкой мыши и выбрать режим сортировки, например, Sort Descending. Данный параметр присутствует в старой версии вайршарка. В новых вы увидите следующее:
Ну и, соответственно, выбираем время с предыдущего displayed/captured фрейма.
И сразу же рассмотрим второй способ.
Достаточно давно (еще в версии 1.10.0) появился фильтр tcp.time_delta, который, собственно, учитывает время с момента последнего запроса.
Если клиент делает запрос и получает ответ через 10 миллисекунд, и клиент говорит, что у него все медленно работает, то, возможно, проблема у самого клиента.
Если же клиент делает запрос и получает ответ через 2-3 секунды, тут уже, возможно, проблема кроется в сети.
Еще глубже
Если посмотреть в TCP пакет (или сегмент если быть точным), то можно увидеть там Stream index, который начинается обычно с нуля.
Само поле будет называться tcp.stream.
По нему можно сделать правый клик и создать фильтр.
Таким образом можно фильтровать нужные соединения.
Еще один способ – сделать правый клик на самом пакете, выбрать Conversation Filter и создать фильтр для l2 l3 l4 уровня соответственно.
В итоге мы опять увидим взаимодействие двух хостов.
И третий вариант — это одна из самых интересных фич — Follow TCP Stream.
Для того чтобы его задействовать, нужно опять таки кликнуть правой кнопкой мыши на пакете и выбрать “Follow TCP Stream”. Появится окно, где будет наглядно продемонстрирован весь обмен между двумя узлами.
Если же зайти в меню Statistics – Conversations, то, выбирая закладки, можно увидеть статистику по таким “разговорам” и различные сессии, при этом можно отсортировать их по различным колонкам, например, по количеству переданных данных.
И прямо в этом окне можно правой кнопкой взывать контекстное меню и опять же применить как фильтр.
[center]Со временем приходит опыт
[/center]После некоторого времени, проведенного за захватом разнообразного трафика, можно заметить какую-то шарообразную кнопку в нижнем левом углу, которая еще иногда меняет цвет.
Нажатие на эту кнопку приведет к открытию окна Expert Infos.
Того же результата можно добиться, пройдя в меню Analyze – Expert Info.
В этом окне будет содержаться информация по найденным пакетам, разбитая на группы Errors, Warnings, Notes и Chats.
Цветовая раскраска для этих групп выглядит следующим образом:
Ошибки — красный цвет
Предупреждения — желтый
Примечания — сине-зелёный (cyan)
Чат — серый
Wireshark содержит в себе мощный анализатор и умеет автоматически обнаруживать большое количество проблем, возникающих в сети.
Как вы уже могли заметить, буквально везде можно использовать фильтры и Expert Info не является исключением.
Для того чтобы создать такой фильтр, нужно использовать конструкцию expert.severity.
Например, expert.severity==error.
Грабим трафик!
Можно ли с помощью Wireshark узнать, что было скачано?
Да, можно. И сейчас это увидим.
Вначале возьмем HTTP трафик.
Сделаем правый клик по HTTP пакету — Protocol Preferences – и видим тут массу опций, которые непосредственно влияют на извлечение файлов из веб трафика.
Для того чтобы увидеть, что можно извлечь из текущего дампа нужно перейти в меню File – Export Objects – HTTP.
Появится окно, которое покажет все захваченные http объекты — текстовые файлы, картинки и т.д. Для того чтобы вытащить любой файл из этого списка, достаточно просто выделить его и нажать Save As.
Как можно заметить, рисунки были извлечены без каких-либо проблем.
Таким же способом, можно извлекать и потоковое видео/аудио.
Но на этом возможности Wireshark не заканчиваются!
Он умеет вытаскивать файлы и с протокола FTP.
Для этого можно использовать знакомый уже Follow TCP Stream.
В итоге отобразится только обмен по протоколу FTP, в котором нужно будет найти строку RETR, что собственно и будет означать передачу файла.
Затем опускаемся дальше, находим пакеты уже непосредственно с файлом (FTP-DATA) и опять выбираем Follow TCP Stream, видим содержимое файла, жмем Save As и сохраняем.
VoIP
Wireshark имеет несколько встроенных функций для работы с этой технологией.
Он поддерживает массу голосовых протоколов — SIP, SDP, RTSP, H.323, RTCP, SRTP и другие.
И, конечно же, умеет перехватывать и сохранять голосовой трафик для дальнейшего прослушивания.
Этот функционал как нельзя лучше подойдет для траблшутинга в сетях Voice over IP.
Меню Statistics — Flow Graph покажет наглядную картину, как происходил весь обмен пакетами.
А вообще целое меню Telephony отведено для работы с голосовым трафиком.
Например, Telephony – RTP – Show All Streams покажет подробно, что происходило с RTP, в частности jitter (параметр, который, вероятно, самый важный в голосе), что иногда сразу скажет о наличии проблем.
[К сожалению, для статьи не удалось поймать нужный трафик, поэтому привожу скрин из старой версии программы]
Нажав на кнопку “Analyze”, можно открыть окно RTP stream Analysis – и, выбрав там поток, можно его даже проиграть, используя кнопку player.
Сначала отроется окно проигрывателя, в котором вначале нужно установить подходящее значение jitter и использовать кнопку decode.
Появится нечто похожее на анализатор спектра, в котором можно отметить требуемый разговор, и после этого кнопка Play станет активной.
Так же существует еще один способ прослушивания голосовых звонков — можно зайти в меню Telephony – VoIP Calls.
Откроется окно со списком совершенных звонков, где опять же можно нажать кнопку player, отменить нужные разговоры флажками и нажать play.
Для того чтобы добиться приемлемого качества звучания, потребуется проиграться со значением поля jitter buffer, меняя его значение.
К слову
Это тот самый сниффер Wireshark, но реализованный в виде онлайн-сервиса. Очевидно, что с его помощью не удастся захватывать сетевой трафик, но выполнять анализ дампа трафика – вполне. Загрузив туда через форму PCAP-файл на анализ, можно будет получить четкую последовательность пакетов, в которой всё данные будут разбиты на понятные поля в зависимости от протокола. В общем, тот же Wireshark, но немного облегченный и доступный из любого браузера.
Финальная битва
Напоследок рассмотрим как выглядит сканирование портов.
Смотрим на дамп и видим, что вначале происходит ARP запрос и затем непосредственно начинается сканирование. Адрес нашего маршрутизатора 192.168.10.11, сканирование идет с адреса 192.168.10.101
Это, так называемое, SYN сканирование, когда идут SYN-пакеты на указанный диапазон портов. Так как большинство портов закрыто, маршрутизатор отвечает пакетами RST, ACK.
Пролистав чуть ниже видим, что открыт telnet (tcp 23).
На это указывает то, что маршрутизатор ответил пакетом SYN, ACK.
К слову, для фильтрации портов в сниффере можно использовать конструкции вида: tcp.srcport, tcp.dstport и tcp.port. Для протокола UDP всё аналогично — udp.srcport, udp.dstport, udp.port.
Итоги
Мы пробежались по самым основным частям функционала лучшего анализатора пакетов.
Получилось несколько сумбурно, вероятно, потому что хотелось затронуть как можно больше его возможностей и не упустить ничего важного.
Оказалось, что анализатор пакетов, как отладчик и дизассемблер, демонстрирует мельчайшие подробности работы сети и сетевых протоколов.
Используя Wireshark и обладая необходимыми знаниями (которые можно почерпнуть изучив серию Сетей для Самых Маленьких на сайте linkmeup.ru) можно достаточно эффективно находить и диагностировать разнообразные проблемы, возникающие в сети.
В процессе написания использовались материалы сайта wiki.wireshark.org и habrahabr.ru
Дампы с трафиком брались из разных источников, больше всего с сайта packetlife.net
Дампы с трафиком брались из разных источников, больше всего с сайта packetlife.net
Комментариев 2