Wireshark — основні можливості та як ним користуватись. Частина 1
Всім привіт! Я Олександр, QA Engineer і хочу розповісти про популярний аналізатор трафіку, який особисто мені допомогає в роботі для локалізації помилок програмного забезпечення, пов’язаних з обміном даними, в embedded-системах, а також desktop-застосунках.
Доволі часто під час роботи інженери, розробники, тестувальники зіштовхуються з проблемами, для швидкого аналізу яких корисно переглянути трафік між клієнтом і сервером. Наприклад, чи робить взагалі клієнт TCP-з’єднання, чому не встановлюється TLS handshake, чи правильно відправляємо запит/відповідь (по протоколу), хто клієнт або сервер передчасно закриває з’єднання і т.д.? Якщо у Вас теж виникала необхідність вирішити такі питання, то, можливо, дана стаття буде цікавою читачу.
Для цього корисними інструментами є сніфери (sniffer). Популярними інструментами є Wireshark (Windows, Linux, macOS), tcpdump (Linux). В цій статті розглянемо Wireshark. Якщо буде цікаво (бо це моя перша публікація на DOU), то в наступних частинах розглянемо, як зняти трафік з embedded пристрою (пропустити через PC), як вирішити проблему TLS.
В основному даний інструмент, як правило, корисний для не-HTTP-трафіку. Для HTTP є вже дуже багато програм і проксі-серверів, які гарно і все по поличках розкладають (Charles, Fiddler тощо). Хоча я часто і для HTTP-протоколу користуюсь Wireshark.
Власне Wireshark дозволяє захоплювати і аналізувати трафік на всіх рівнях Інтернет-моделі TCP/IP (канальний, мережевий, транспортний і прикладний) для великої кількості протоколів (мультимедіа, мобільні мережі і т.д.). Це дозволяє локалізувати проблему: проблема з мережею, конфігурацією ПЗ чи помилка ПЗ.
Захоплення трафіку з мережевого інтерфейсу
Після запуску Wireshark в головному вікні програми буде список мережевих інтерфейсів (Ethernet, Wi-Fi, VPN мають теж окремий інтерфейс). Необхідно обрати потрібний інтерфейс, через який проходить ваш трафік. Можна користуватись графіком активності, який є поблизу.
Окремо хочу звернути увагу на Adapter for loopback traffic capture. Цей інтерфейс дозволяє зняти трафік між клієнтом і сервером, які розміщені на одному ПК та зв’язані через localhost (127.0.0.1).
Фільтрація трафіку
Є два види фільтрів. Фільтри захоплення (Сapture filter) та фільтри відображення (Display filter). Фільтр відображення захоплює весь трафік з мережевої карти і вже потім відображає/ фільтрує, що потрібно. Це означає, що буде використовуватись багато пам’яті і якщо зберегти дані у файл, то туди потрапить весь трафік, що пройшов через інтерфейс.
Фільтр захоплення захоплює і зберігає лише той трафік, який прописаний у фільтрі.
Фільтр захоплення можна прописати відразу при виборі інтерфейсу (див. вище на малюнку Сapture ...using this filter).
Найпопулярніші фільтри:
- host www.nbuv.gov.ua;
- tcp port 35170.
Список всіх фільтрів можна переглянути тут CaptureFilters.
Фільтри відображення можна змінювати по ходу захоплення трафіку:
- список фільтрів DisplayFilters;
- можливі оператори: ==, !=, <, >, <=, >=, contains, matches;
- приклади основних фільтрів: ip.addr == 10.20.8.9 або tcp.port == 7100;
- також можна об’єднувати фільтри за допомогою логічних операцій: && , ||. Наприклад, ip.addr == 10.20.8.194 && tcp.port == 1250.
Протокол TCP
Далі для детального аналізу та розуміння необхідно трошки згадати основні властивості протоколу TCP:
- необхідно встановити і завершувати з’єднання;
- отримувач повинен підтверджувати, що він отримав пакет (ACK — Acknowledgement), інакше відправник буде повторно відправляти пакет по таймауту;
- є керування потоком даних (коли отримувач не встигає обробити інформацію від відправника).
Встановлення TCP-з’єднання
Вище наведений приклад встановлення TCP-з’єднання. При коректному встановленні має пройти 3 пакети з характерним прапорцем SYN.
- встановлення відбувається в три етапи, тому що обидві сторони мають впевнитись, що існує канал в обидва боки;
- ініціалізуються початкові номери пакетів. В майбутньому вони використовуються для підтвердження отримання даних;
- ініціалізуються також додаткові параметри (розмір вікна — кількість пакетів, які можна передавати без підтвердження і т.д.).
Передача даних
- після встановлення з’єднання сторони можуть обмінюватись даними;
- пакети повинні підтверджуватись звітами про доставку (АСК);
- якщо пакет має ознаку PSH (PUSH), то це команда для отримувача проштовхнути дані з буфера мережевої карти чи ОС в застосунок;
- для оптимізації каналу зв’язку не всі пакети можуть підтверджуватись АСК. Розмір такого вікна (кількість пакетів без підтвердження) встановлюється на початку та може змінюватись в залежності від якості каналу зв’язку.
Перегляд даних в пакеті
Детальну інформацію про дані та заголовки кожного рівня (не лише прикладного) можна переглянути внизу, а також скопіювати для подальшого аналізу при необхідності.
Завершення TCP-з’єднання
З’єднання закривається теж з обох боків. Якщо сторона хоче закрити з’єднання, то вона відправляє пакет FIN. По Source IP можна визначити, хто є ініціатором закриття TCP-з’єднання (інколи через помилку ПЗ розриває передчасно з’єднання).
Пара додаткових прикладів
Приклад перенадсилання пакета. Я таке дуже часто зустрічаю на мобільних мережах. Хост відправив пакет, але довго не отримував підтвердження (АСК), а тому по таймауту відбулось перенадсилання пакету.
Мінімальна довжина навантаження (payload) для Ethernet-фрейму (пакет канального рівня) дорівнює 46 байтам. Тому, якщо ми передаємо мало байтів (на картинці вище всього 1 байт 0×04) і в сумі з заголовками транспортного і мережевого рівня довжина менше 46 байтів, то необхідно доповнити фрейм байтами (padding 5 байт в кінці 0×00).
На малюнку пунктиром виділені дані канального рівня.
Для інших мереж мінімальна довжина пакета може мати інше значення. В прикладі Ethernet.
В даному прикладі можна спостерігати передачу декількох пакетів (8, 9, 10, 11, 12, 13) від сервера (192.168.3.5) клієнту без очікування підтвердження (АСК) на кожен пакет. Підтвердження приходять пізніше (14,15,16,17). Також в даному пакеті є перепосилка FIN-сегмента через таймаут (пакет було втрачено в мережі).
Що далі
В наступній частині планую детальніше розібрати практичні приклади вирішення проблем за допомогою Wireshark. Також, яким чином пропустити трафік від стороннього пристрою через комп’ютер. Якщо буде час, то розгляну TLS і як переглянути шифрований трафік. Якщо цікавлять якісь конкретні приклади — пишіть. Це моя перша стаття і я не певен, що вийде нормально :)
30 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів