Джулия Эванс, автор материала, перевод которого мы сегодня публикуем, решила рассказать об одном из своих любимых сетевых инструментов, который называется Wireshark. Это — мощная и сложная программа, оснащённая графическим интерфейсом, предназначенная для анализа трафика в компьютерных сетях. Джулия говорит, что на практике пользуется лишь немногими возможностями Wireshark, но они обычно оказываются очень кстати. Здесь она хочет поделиться со всеми желающими рассказом о самых полезных приёмах работы с программой и надеется, что они пригодятся не только ей, но и всем, кому приходится решать сетевые проблемы.
![](https://habrastorage.org/r/w780q1/webt/rz/ag/uw/rzaguwsi5logcjjqkre-sglko0o.jpeg)
Дистрибутивы Wireshark для различных операционных систем можно найти здесь. Для инсталляции программы можно скачать и установить соответствующий файл. Кроме того, если вы пользуетесь дистрибутивами Linux, основанными на Debian, можете воспользоваться командой
Вот как выглядит интерфейс программы.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/485/d33/40c/485d3340cca2688b2d8460c7263b1d31.png)
Интерфейс Wireshark
На первый взгляд всё это может показаться слишком сложным: длинный список пакетов, таинственное поле для ввода каких-то запросов… Как же работать с Wireshark?
Обычно я использую Wireshark для выяснения причин сетевых неполадок. Последовательность действий, выполняемая в ходе решения подобных задач, выглядит так:
Как видите, всё очень просто. Однако, после того, как pcap-файл открыт в программе, у вас может возникнуть закономерный вопрос о том, что со всем этим делать. Поговорим об этом.
Часто, когда я анализирую в Wireshark некую ситуацию, мне нужно проверить какое-то конкретное TCP-соединение, с которым, по какой-то причине, что-то не так. Благодаря Wireshark можно проанализировать весь жизненный цикл отдельного TCP-соединения и выяснить причины неправильного поведения системы.
Сделать это можно, щёлкнув правой кнопкой мыши по интересующему вас пакету и выбрав в контекстном меню команду
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/a9a/1ce/e15/a9a1cee15deb7869196dc71cee5800af.png)
Начало анализа TCP-соединения
После этого Wireshark покажет другие пакеты из того же TCP-соединения, к которому принадлежит тот пакет, по которому вы щёлкнули. На рисунке ниже можно видеть пример успешного SSL-соединения — тут присутствуют пакеты
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/53e/bfc/ae9/53ebfcae9417574c6423124725e6a373.png)
Анализ TCP-соединения
Рассматриваемую здесь методику анализа TCP-пакетов мне пришлось использовать в день написания этой статьи, на работе. Некоторые соединения сбрасывались, и я заметила, что после отправки пакета
Выше описана весьма типичная для меня схема работы с Wireshark. Обычно в соединении участвуют клиент и сервер, и что-то идёт не так либо на клиенте, либо на сервере. Это может быть, например, какой-нибудь сбой или ошибка в настройках системы. В результате Wireshark оказывает мне просто бесценную помощь в деле определения виновника проблем, помогая выяснить — клиент это или сервер.
Для того чтобы понять, чем именно является конкретный пакет, Wireshark использует номера портов, и обычно этот подход срабатывает. Например, если программа видит некий трафик на порте 80, она решает, что это HTTP-трафик и обычно так оно и есть.
Однако иногда HTTP-соединения используют необычные порты, в результате, для того, чтобы их распознать, Wireshark нуждается в подсказках. Такие подсказки можно давать программе, вызывая контекстное меню пакета и выбирая там команду
В Wireshark имеется просто восхитительный режим просмотра подробных сведений о пакете, с помощью которого можно разобраться в содержимом любого пакета. Возьмём, например, пакет с сообщением
Wireshark даёт сетевому администратору два невероятно полезных инструмента для исследования содержимого пакетов. Первый — это режим просмотра, в котором можно раскрывать заголовки, имеющиеся у пакета (например — Ethernet-заголовок, IP-заголовок, TCP-заголовок) и просматривать их содержимое.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/a2f/990/77a/a2f99077a2e3cdb10652ad3a387103f0.png)
Анализ заголовков пакета
Второй режим просмотра пакетов — это настоящее чудо. Здесь можно видеть необработанные данные пакета в виде последовательности байтов. И, что особенно приятно, если навести мышь на какой-нибудь байт (например, на рисунке ниже указатель наведён на байт, входящий в
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/d50/6e8/b35/d506e8b3512c273fd66a94796230f4e5.png)
Анализ необработанных данных пакета
Wireshark поддерживает мощный язык запросов. Это значительно упрощает поиск конкретных пакетов в списках. Обычно я, при работе с программой, использую очень простые запросы. Вот несколько примеров:
Язык запросов Wireshark обладает гораздо большими возможностями, нежели язык запросов
Иногда мне нужно обратить особое внимание на исследование медленных TCP-соединений. Как это сделать, при условии, что в имеющемся у меня файле есть записи о тысячах пакетов? Как найти медленные TCP-соединения?
Если выбрать в главном меню программы пункт
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/e1a/477/968/e1a477968ed8e4473600709d927efe58.png)
Статистические сведения
В частности здесь, в колонке
Если вы давно не обновляли Wireshark — это стоит сделать. Например, недавно я, на рабочем ноутбуке, занималась исследованием HTTP/2-пакетов. Мне тогда пришлось нелегко, и я решила посмотреть документацию. Как оказалось, у меня была старая версия программы. В установленном мной обновлении была серьёзно улучшена поддержка HTTP/2, то есть, там было как раз то, что мне было тогда нужно.
В этом материале встречаются некоторые термины, которые можно отнести к чему-то вроде жаргона сетевых специалистов. Например — кадр (frame), TCP-порт (TCP port), DNS-ответ (DNS response), IP-адрес источника (source IP address), пакет
У такой ориентированности Wireshark на низкоуровневые сетевые механизмы, однако, есть серьёзный плюс. Дело в том, что работая с этой программой, можно узнать что-то новое о сетевых протоколах. Например, я не особенно много знаю о внутренних механизмах протокола TLS/SSL. Однако, анализируя трафик в Wireshark, я обратила внимание на то, что первые два пакета SSL-соединения — это
Wireshark имеет огромнейшие возможности. Здесь мы рассказали лишь о некоторых из них. Однако, те приёмы работы, которые здесь рассмотрены, по словам автора материала, используются примерно в 95% ситуаций, когда возникает необходимость в Wireshark. Поэтому мы надеемся, что даже то немногое, о чём вы сегодня узнали, вам пригодится.
Уважаемые читатели! Пользуетесь ли вы Wireshark?
![](https://habrastorage.org/r/w1560/files/1ba/550/d25/1ba550d25e8846ce8805de564da6aa63.png)
![](https://habrastorage.org/webt/rz/ag/uw/rzaguwsi5logcjjqkre-sglko0o.jpeg)
Установка Wireshark
Дистрибутивы Wireshark для различных операционных систем можно найти здесь. Для инсталляции программы можно скачать и установить соответствующий файл. Кроме того, если вы пользуетесь дистрибутивами Linux, основанными на Debian, можете воспользоваться командой
sudo apt install wireshark
. При желании, для того, чтобы найти самую свежую версию программы, вы можете обратиться к персональному архиву пакетов wireshark-dev.Вот как выглядит интерфейс программы.
![](https://habrastorage.org/getpro/habr/post_images/485/d33/40c/485d3340cca2688b2d8460c7263b1d31.png)
Интерфейс Wireshark
На первый взгляд всё это может показаться слишком сложным: длинный список пакетов, таинственное поле для ввода каких-то запросов… Как же работать с Wireshark?
Анализ pcap-файлов
Обычно я использую Wireshark для выяснения причин сетевых неполадок. Последовательность действий, выполняемая в ходе решения подобных задач, выглядит так:
- Захват пакетов с помощью
tcpdump
(обычно — с помощью команды наподобиеsudo tcpdump port 443 -w output.pcap
). - Копирование pcap-файла на рабочий ноутбук (
scp host:~/output.pcap .
). - Открытие pcap-файла с помощью Wireshark (
wireshark output.pcap
).
Как видите, всё очень просто. Однако, после того, как pcap-файл открыт в программе, у вас может возникнуть закономерный вопрос о том, что со всем этим делать. Поговорим об этом.
Анализ TCP-соединений
Часто, когда я анализирую в Wireshark некую ситуацию, мне нужно проверить какое-то конкретное TCP-соединение, с которым, по какой-то причине, что-то не так. Благодаря Wireshark можно проанализировать весь жизненный цикл отдельного TCP-соединения и выяснить причины неправильного поведения системы.
Сделать это можно, щёлкнув правой кнопкой мыши по интересующему вас пакету и выбрав в контекстном меню команду
Conversation filter > TCP
.![](https://habrastorage.org/getpro/habr/post_images/a9a/1ce/e15/a9a1cee15deb7869196dc71cee5800af.png)
Начало анализа TCP-соединения
После этого Wireshark покажет другие пакеты из того же TCP-соединения, к которому принадлежит тот пакет, по которому вы щёлкнули. На рисунке ниже можно видеть пример успешного SSL-соединения — тут присутствуют пакеты
client hello
, service hello
, certificate
, server key exchange
, которые используются для установления SSL-соединений.![](https://habrastorage.org/getpro/habr/post_images/53e/bfc/ae9/53ebfcae9417574c6423124725e6a373.png)
Анализ TCP-соединения
Рассматриваемую здесь методику анализа TCP-пакетов мне пришлось использовать в день написания этой статьи, на работе. Некоторые соединения сбрасывались, и я заметила, что после отправки пакета
client hello
клиент отправлял пакет FIN ACK
, который завершал TLS-соединение. То, что мне удалось выяснить, оказалось полезным, так как стало ясно, что соединения завершает клиент, а не сервер. В результате я тут же узнала, что проблема кроется на клиенте, и мне нужно обратить внимание именно на него.Выше описана весьма типичная для меня схема работы с Wireshark. Обычно в соединении участвуют клиент и сервер, и что-то идёт не так либо на клиенте, либо на сервере. Это может быть, например, какой-нибудь сбой или ошибка в настройках системы. В результате Wireshark оказывает мне просто бесценную помощь в деле определения виновника проблем, помогая выяснить — клиент это или сервер.
Команда Decode as
Для того чтобы понять, чем именно является конкретный пакет, Wireshark использует номера портов, и обычно этот подход срабатывает. Например, если программа видит некий трафик на порте 80, она решает, что это HTTP-трафик и обычно так оно и есть.
Однако иногда HTTP-соединения используют необычные порты, в результате, для того, чтобы их распознать, Wireshark нуждается в подсказках. Такие подсказки можно давать программе, вызывая контекстное меню пакета и выбирая там команду
Decode as
. Далее, можно сообщить Wireshark о том, какой протокол используется для передачи пакетов с использованием некоего порта. Подобные подсказки упрощают анализ данных.Просмотр содержимого пакетов
В Wireshark имеется просто восхитительный режим просмотра подробных сведений о пакете, с помощью которого можно разобраться в содержимом любого пакета. Возьмём, например, пакет с сообщением
client hello
из предыдущего примера. Это — первый пакет SSL-соединения, клиент с его помощью как бы говорит: «Привет! Вот он я!».Wireshark даёт сетевому администратору два невероятно полезных инструмента для исследования содержимого пакетов. Первый — это режим просмотра, в котором можно раскрывать заголовки, имеющиеся у пакета (например — Ethernet-заголовок, IP-заголовок, TCP-заголовок) и просматривать их содержимое.
![](https://habrastorage.org/getpro/habr/post_images/a2f/990/77a/a2f99077a2e3cdb10652ad3a387103f0.png)
Анализ заголовков пакета
Второй режим просмотра пакетов — это настоящее чудо. Здесь можно видеть необработанные данные пакета в виде последовательности байтов. И, что особенно приятно, если навести мышь на какой-нибудь байт (например, на рисунке ниже указатель наведён на байт, входящий в
tiles.services.mozilla.com
), программа, в строке состояния, сообщит о том, к какому полю относится этот байт (в данном случае это — поле Server Name
), и о кодовом имени, используемом Wireshark для этого поля (в данном случае — ssl.handshake.extensions_server_name
)![](https://habrastorage.org/getpro/habr/post_images/d50/6e8/b35/d506e8b3512c273fd66a94796230f4e5.png)
Анализ необработанных данных пакета
Поиск пакетов
Wireshark поддерживает мощный язык запросов. Это значительно упрощает поиск конкретных пакетов в списках. Обычно я, при работе с программой, использую очень простые запросы. Вот несколько примеров:
- Запрос
frame contains "mozilla"
позволяет выполнить поиск строкиmozilla
в любом месте пакета и вывести список найденных пакетов. - Запрос
tcp.port == 443
выводит пакеты, использующие TCP-порт 443. - Запрос
dns.resp.len > 0
выводит все DNS-ответы - Запрос
ip.addr == 52.7.23.87
выводит пакеты, IP-адрес источника или получателя которых равен 52.7.23.87.
Язык запросов Wireshark обладает гораздо большими возможностями, нежели язык запросов
tcpdump
(и, кроме того, поддерживает автозавершение по нажатию клавиши TAB). В результате часто я применяю следующую последовательность действий: захватываю большой объём пакетов с помощью tcpdump
(скажем, нечто вроде всех пакетов с 443-го порта), а затем тщательно изучаю их с использованием Wireshark.Просмотр сведений о продолжительности TCP-соединений
Иногда мне нужно обратить особое внимание на исследование медленных TCP-соединений. Как это сделать, при условии, что в имеющемся у меня файле есть записи о тысячах пакетов? Как найти медленные TCP-соединения?
Если выбрать в главном меню программы пункт
Statistics
, а в нём — команду Conversations
, Wireshark предоставит нам замечательный набор статистических сведений.![](https://habrastorage.org/getpro/habr/post_images/e1a/477/968/e1a477968ed8e4473600709d927efe58.png)
Статистические сведения
В частности здесь, в колонке
Duration
, можно увидеть длительность TCP-соединений, выявить самые длительные из них и внимательно их изучить. Это весьма полезная возможность.Обновление Wireshark
Если вы давно не обновляли Wireshark — это стоит сделать. Например, недавно я, на рабочем ноутбуке, занималась исследованием HTTP/2-пакетов. Мне тогда пришлось нелегко, и я решила посмотреть документацию. Как оказалось, у меня была старая версия программы. В установленном мной обновлении была серьёзно улучшена поддержка HTTP/2, то есть, там было как раз то, что мне было тогда нужно.
Использование Wireshark для изучения сетевых протоколов
В этом материале встречаются некоторые термины, которые можно отнести к чему-то вроде жаргона сетевых специалистов. Например — кадр (frame), TCP-порт (TCP port), DNS-ответ (DNS response), IP-адрес источника (source IP address), пакет
client hello
SSL-соединения (SSL client hello). Одной из причин их использования является тот факт, что Wireshark, определённо, не пытается оградить пользователя от тонкостей внутреннего устройства сетевых технологий. Новичка такое положение дел может, поначалу, заставить задуматься о том, что Wireshark — это программа не для него, а лишь для опытных сетевых специалистов.У такой ориентированности Wireshark на низкоуровневые сетевые механизмы, однако, есть серьёзный плюс. Дело в том, что работая с этой программой, можно узнать что-то новое о сетевых протоколах. Например, я не особенно много знаю о внутренних механизмах протокола TLS/SSL. Однако, анализируя трафик в Wireshark, я обратила внимание на то, что первые два пакета SSL-соединения — это
client hello
и server hello
. В результате протокол, который, если не вникать в детали его работы, кажется чем-то таинственным и недоступным для понимания, начинает обретать более понятную форму, превращается в нечто такое, что можно понять и проанализировать.Итоги
Wireshark имеет огромнейшие возможности. Здесь мы рассказали лишь о некоторых из них. Однако, те приёмы работы, которые здесь рассмотрены, по словам автора материала, используются примерно в 95% ситуаций, когда возникает необходимость в Wireshark. Поэтому мы надеемся, что даже то немногое, о чём вы сегодня узнали, вам пригодится.
Уважаемые читатели! Пользуетесь ли вы Wireshark?
![](https://habrastorage.org/files/1ba/550/d25/1ba550d25e8846ce8805de564da6aa63.png)