Хочу поделиться не сухой технической документацией, а заметками из моей работы с 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 — это как микроскоп для сети. Сначала видишь просто клетки, потом учишься различать структуры, а потом начинаешь ставить диагнозы по мельчайшим деталям.
Не бойтесь начинать. Захватите трафик своего браузера, посмотрите как работает обычный сайт. Потом попробуйте найти "тормозящий" запрос. С каждым разом будет получаться лучше.
И помните — самая интересная находка всегда ждет в следующем пакете.
Комментарии (4)
iostat
another test _ io
https://hackware.ru/?p=7008 - здесь инфа по акуле хорошая
first