Хочу поделиться не сухой технической документацией, а заметками из моей работы с Wireshark. Это тот инструмент, который сначала кажется страшным и сложным, а потом становится продолжением твоих рук.

Помню свой первый запуск Wireshark много лет назад. Я увидел мелькающие строчки и подумал: "И что с этим делать?". Сейчас понимаю — это не просто "сниффер", это рентген для вашей сети. Когда приложение глючит, когда API отвечает странностями, когда сеть "тормозит" — здесь вы найдете ответы.

Выбор интерфейса. Здесь пока все просто:

Wi-Fi — для беспроводных соединений

Ethernet — проводные, очевидно

Loopback — локальные(но требует настроек)

Если не уверены, какой интерфейс выбрать — посмотрите на столбец "Packets". Тот, где число растет — ваш кандидат.

Фильтры — наше всё. Без них в Wireshark как без рук:

# Базовые:

http — только HTTP трафик

tcp.port == 443 — HTTPS порт

ip.addr == 192.168.1.1 — трафик конкретного IP

udp — только UDP пакеты

# Комбинации:

http and ip.addr == 10.0.0.5

tcp and tcp.port == 8080

# Только успешные HTTP ответы

http and http.response.code < 300

# Поиск пакетов с большими задержками

tcp.analysis.ack_rtt > 0.5

# Показать retransmission (повторные отправки)

tcp.analysis.retransmission

Смотрим на захваченный трафик:

Столбец "Info" — здесь видна суть. Видите [SYN], [ACK], [FIN]? Это handshake TCP:

SYN — "привет, можно поговорить?"

SYN-ACK — "да, можно"

ACK — "окей, начинаем"

Если видите много [RST] — где-то сбрасывают соединения. Проблема!

Еще несколько полезных фильтров:

# Найти все failed соединения

tcp.flags.reset == 1

# Показать только DNS запросы

dns

# Найти медленные ответы (больше 1 секунды)

http.time > 1

# Поиск по содержимому (например, ошибки)

http contains "error"

"Почему сайт грузится медленно?"

Захватываем трафик, заходим на сайт. Смотрим:

DNS запрос — сколько времени занял ответ?

TCP handshake — не было ли повторных SYN?

TLS handshake — не тормозит ли шифрование?

HTTP запросы — какие файлы долго грузятся?

"API возвращает 500 ошибку"

Фильтруем по IP сервера:

ip.addr == 10.0.0.10 and http

Смотрим цепочку запросов. Видим: клиент отправляет запрос, сервер сразу отвечает 500 Internal Server Error. Значит, проблема на сервере. Если бы был [RST] после запроса — проблема с сетью.

Разные полезные фишки, которые экономят время:

Follow TCP Stream — правая кнопка на пакете → Follow → TCP Stream. Видите весь диалог между клиентом и сервером. Незаменимо для отладки API.

Export Objects — File → Export Objects → HTTP. Можно вытащить все картинки, CSS, JS которые передавались. Полезно для анализа веб-страниц.

IO Graphs — Statistics → I/O Graph. Показывает график трафика. Ищем пики — обычно там проблемы.

Default настройки:

В Edit → Preferences:

Capture → Update list of packets in real time — ВКЛ

Appearance → Columns → добавляю Delta time — видим задержки между пакетами

Protocols → HTTP → TCP ports: 80, 8080, 8000 — добавляем свои порты

Список самых часто используемых фильтров:

## БАЗОВЫЕ — используются постоянно
http

// Весь веб-трафик для отладки API

tcp.port == 443

// HTTPS, проверяем ушёл ли запрос вообще

dns

// Первое что смотрим при "сайт не грузится"

ip.addr == 192.168.1.100

// Фокус на одной машине, отсекаем лишнее

tcp and tcp.port == 8080

// Тестирование на нестандартных портах

http.response.code >= 400

// Только ошибки, быстро находим проблемы

tcp.flags.syn == 1

// Кто пытается установить соединение

http.request.method == "POST"

// Формы и API отправка данных

udp.port == 53

// DNS трафик на стандартном порту

icmp

// Ping и сетевые диагностические пакеты

arp

// Поиск MAC-адресов в локальной сети

tcp.port == 80

// HTTP на стандартном порту

!arp and !dns

// Всё кроме ARP и DNS, чистый трафик приложений

ip.src == 10.0.0.0/16

// Трафик из конкретной подсети

tcp.dstport == 22

// SSH соединения, кто куда подключается

http.request

// Только HTTP запросы без ответов

http.response

// Только HTTP ответы сервера

tcp.analysis.flags

// Пакеты с анализом флагов TCP

tcp contains "error"

// Поиск ошибок в TCP payload

http.host contains "google"

// Фильтр по домену в HTTP хедере

## ХИТРЫЕ КОМБИНАЦИИ — экономят часы отладки
http and ip.src == 10.0.0.5 and http.response.code == 500

// Все 500 ошибки от конкретного сервера

tcp.analysis.retransmission and ip.dst == 192.168.1.1

// Ретрансмиссии к конкретному хосту, сетевые проблемы

dns and dns.flags.response == 0

// DNS запросы без ответов, где пропадают пакеты

http.request.uri contains "api" and http.time > 2.0

// Медленные API вызовы, что именно тормозит

tcp.stream eq 5

// Конкретный TCP поток, просматриваем весь диалог

http and (http.request.uri contains "login" or http.request.uri contains "auth")

// Все операции аутентификации

tcp.analysis.ack_rtt > 0.5

// Высокая задержка, проседающие соединения

http contains "password"

// Поиск паролей в открытом виде

tcp.port == 5432 and tcp.payload

// PostgreSQL трафик с данными

http.request.method == "GET" and http.response.code == 404

// Потерянные страницы, 404 ошибки

ip.addr == 192.168.1.1 and tcp.port == 23

// Telnet к конкретному хосту

udp.length > 1000

// Крупные UDP пакеты, возможно мультимедиа

tcp.window_size < 1460

// Маленькое TCP окно, признаки проблем

http.content_type contains "json"

// JSON API вызовы

tcp.flags.fin == 1 and tcp.seq == 1

// Ранние FIN пакеты, подозрительное поведение

http and http.request.version == "HTTP/1.1" and http.response.code == 302

// Редиректы в HTTP 1.1

dns.qry.type == 28

// AAAA запросы (IPv6)

tcp.analysis.duplicate_ack

// Дублирующие ACK, признаки потери пакетов

http and frame.time_delta > 1.0

// Долгие HTTP ответы, больше секунды это уже проблема

## ХАКЕРСКИЕ — для пентестов и безопасности
tcp.flags.reset == 1 and tcp.seq == 1

// Принудительные разрывы соединений, признаки сканирования

icmp and icmp.type == 8

// ICMP запросы, обнаружение сканирования сети

tcp.window_size < 100 and tcp.flags == 0x002

// Маленькое TCP окно с SYN, признаки старых ОС

http.request.method == "CONNECT" and tcp.port == 443

// CONNECT через 443, обход firewall

dns.qry.name contains "txt" or dns.qry.name contains "key"

// Подозрительные DNS запросы, возможный tunneling

tcp.payload contains "cmd.exe" or tcp.payload contains "/bin/bash"

// Шелл-команды в трафике, признак компрометации

http.user_agent contains "sqlmap" or http.user_agent contains "nmap"

// Автоматизированные инструменты сканирования

tcp.flags == 0x029

// Xmas сканирование (FIN, URG, PUSH)

bootp and bootp.hw.mac_addr == 00:11:22:33:44:55

// Конкретный MAC в DHCP, отслеживание устройства

http.request.uri matches "\\.\\./" or http.request.uri contains "../"

// Path traversal попытки

tcp.port == 22 and tcp.payload contains "ssh"

// SSH трафик без шифрования

http and http.request.version == "HTTP/1.0"

// HTTP 1.0 в современной сети, часто боты

tcp.port == 3389 and tcp.payload

// RDP трафик с данными

http.request.uri contains ".php" and http.request.method == "POST"

// POST запросы к PHP скриптам

ip.ttl < 10

// Маленький TTL, возможен traceroute или spoofing

tcp.port == 5900 and tcp.flags.syn == 1

// VNC сканирование

http.request.uri contains "etc/passwd"

// Попытки доступа к файлу паролей

tcp.port == 27017 and tcp.length > 0

// MongoDB трафик

udp.port == 5060 and sip

// SIP VoIP трафик

http.cookie contains "session"

// Поиск session cookie в трафике

## ПРОТОКОЛЫ — для специфичных задач
mysql and mysql.command == 3

// MySQL запросы, что спрашивают из базы

redis and redis.command == "SET"

// Redis команды SET, изменения в кэше

http2 and http2.headers.method == "POST"

// HTTP/2 POST запросы

websocket and websocket.opcode == 1

// WebSocket текстовые фреймы

ssh and ssh.version

// SSH версии и handshake

ftp and ftp.request.command == "USER"

// FTP авторизация

smtp and smtp.req.command == "MAIL"

// SMTP отправка почты

dhcp and dhcp.option.dhcp == 1

// DHCP discovery пакеты

ntp and ntp.version == 3

// NTP версия 3

tls and tls.handshake.type == 1

// TLS client hello

smb and smb.cmd == 0xa2

// SMB2 команды

rpc and rpc.type == 0

// RPC запросы

snmp and snmp.version == 1

// SNMP v1 трафик

telnet and telnet.data

// Telnet данные

irc and irc.request

// IRC запросы

ldap and ldap.protocolOp == 0x60

// LDAP bind запросы

## ПРОИЗВОДИТЕЛЬНОСТЬ — когда всё тормозит
tcp.analysis.window_update

// Изменения TCP window, сетевые проблемы

tcp.len == 0 and tcp.flags == 0x010

// Keep-alive пакеты, мусорный трафик

http and frame.time_delta > 1.0

// Долгие HTTP ответы, больше секунды это уже проблема

dns.time > 0.5

// Медленный DNS, частая причина тормозов

tcp.analysis.retransmission

// Ретрансмиссии TCP пакетов

tcp.analysis.fast_retransmission

// Быстрые ретрансмиссии

tcp.analysis.duplicate_ack

// Дублирующие ACK

tcp.analysis.ack_lost_segment

// Потерянные сегменты

tcp.analysis.zero_window

// Zero window, получатель не может принимать данные

tcp.analysis.window_full

// Window full, отправитель уперся в лимит

tcp.analysis.bytes_in_flight > 10000

// Много данных "в полете"

tcp.analysis.initial_rtt > 1.0

// Высокое начальное RTT

http.response.time > 3.0

// Очень медленные HTTP ответы

tcp.analysis.spurious_retransmission

// Ложные ретрансмиссии

tcp.analysis.out_of_order

// Пакеты не в порядке

tcp.analysis.keep_alive

// Keep-alive пакеты

tcp.analysis.keep_alive_ack

// Keep-alive ACK

icmp.type == 11

// ICMP Time Exceeded (traceroute)

tcp.analysis.rto

// Retransmission timeout

tcp.analysis.rto_frame

// Кадр с RTO

## WiFi и БЕСПРОВОДНЫЕ — для мобильной отладки
wlan and wlan.fc.type_subtype == 0x08

// Beacon фреймы WiFi

wlan and wlan.fc.retry == 1

// Ретрансмиссии в WiFi

eapol

// EAPOL пакеты (WPA auth)

wlan_mgt.tag.interpretation contains "SSID"

// SSID в управляющих фреймах

wlan.fc.type == 2 and wlan.fc.subtype == 4

// Null data фреймы

radius and radius.code == 4

// Radius accounting запросы

wlan and wlan.addr == 00:11:22:33:44:55

// Конкретный MAC в WiFi

wlan.fc.protected == 1

// Зашифрованные WiFi фреймы

wlan_mgt.fixed.capabilities.privacy == 1

// WEP включен

dot11 and dot11.type == 2

// Data фреймы 802.11

wlan and wlan.fc.ds == 1

// Фреймы от STA к AP

wlan and wlan.fc.moredata == 1

// Фреймы с more data флагом

wlan and wlan.duration > 1000

// Долгие WiFi фреймы

wlan and wlan.qos.ack.policy == 1

// QoS фреймы с политикой ACK

## VoIP и МУЛЬТИМЕДИА — для голосовой связи
sip and sip.Method == "INVITE"

// SIP приглашения на звонок

rtp

// RTP медиа трафик

rtcp

// RTCP контрольный трафик

sip and sip.CSeq.method == "BYE"

// SIP завершения звонка

sip and sip.Response-Code == 200

// SIP успешные ответы

rtp and rtp.p_type == 0

// RTP с PCM кодеком

sip and sip.From contains "1001"

// SIP от конкретного номера

rtp and rtp.ssrc == 0x12345678

// RTP с конкретным SSRC

sip and sip.To contains "1002"

// SIP к конкретному номеру

rtp and rtp.timestamp > 1000000

// RTP с большим timestamp

sip and sip.CSeq.method == "REGISTER"

// SIP регистрации

rtcp and rtcp.sender_ssrc == 0x87654321

// RTCP от конкретного источника

sip and sip.Via contains "UDP"

// SIP over UDP

rtp and rtp.marker == 1

// RTP marker пакеты

sip and sip.Contact contains "192.168.1.100"

// SIP contact с конкретным IP

Wireshark — это как микроскоп для сети. Сначала видишь просто клетки, потом учишься различать структуры, а потом начинаешь ставить диагнозы по мельчайшим деталям.

Не бойтесь начинать. Захватите трафик своего браузера, посмотрите как работает обычный сайт. Потом попробуйте найти "тормозящий" запрос. С каждым разом будет получаться лучше.

И помните — самая интересная находка всегда ждет в следующем пакете.