Когда сеть начинает вести себя как старый паровой котёл — то задержки появляются, то DNS внезапно перестаёт отвечать, то приложение жалуется на «сетевые проблемы», — администратору нужны не догадки, а факты.
Wireshark — один из главных инструментов для такой работы. Он позволяет посмотреть на сетевой обмен практически на уровне отдельных пакетов: кто с кем разговаривал, по какому протоколу, сколько длился диалог, где появились retransmission, RST, ICMP-ошибки или подозрительные последовательности.
В этой статье разберём рабочий подход: захват → фильтрация → поиск проблемы → анализ потока → подтверждение гипотезы.
Как думать о захвате трафика
Главная ошибка начинающего сетевого следопыта — сразу открыть огромный .pcapng и начать прокручивать тысячи пакетов.
Так работать можно, но это примерно как искать одну неисправную шестерёнку, высыпав весь механизм паровой машины на стол.
Лучше идти от вопроса:
Какое сетевое утверждение я хочу проверить?
Например:
- сервер
10.10.20.15действительно не отвечает? - DNS-запросы уходят, но ответы не возвращаются?
- TCP-соединение устанавливается слишком долго?
- есть ли retransmission?
- кто отправляет TCP RST?
- какой клиент создаёт аномальный объём трафика?
- куда обращается неизвестный процесс?
- действительно ли проблема находится в сети, а не в приложении?
От ответа зависит и точка захвата, и фильтр.
Где снимать трафик
На Linux сначала определим интерфейсы:
ip -br addrили:
tshark -DПоследняя команда покажет интерфейсы, доступные TShark. Сам TShark использует -f для capture filter и -Y для display filter — синтаксис этих фильтров различается.
Например:
sudo tshark -i eth0Для быстрого сохранения полного захвата:
sudo tshark -i eth0 -w incident.pcapngДля ограниченного захвата DNS:
sudo tshark -i eth0 -f "port 53" -w dns.pcapngCapture filter применяется до сохранения пакетов. Это удобно, когда трафика много и заранее известно, что именно требуется поймать. Wireshark использует для capture filters синтаксис libpcap/BPF.

Capture filter и Display filter — не перепутать
Это фундаментальная вещь.
Capture filter
Определяет, какие пакеты вообще попадут в захват.
Примеры:
- host 10.10.20.15
- tcp port 443
- udp port 53
- host 10.10.20.15 and tcp port 443
- src host 10.10.20.15
Например:
sudo tshark -i eth0 -f "host 10.10.20.15 and tcp port 443" -w web.pcapngDisplay filter
Работает уже с захваченными пакетами и позволяет гораздо глубже исследовать их содержимое.
Например:
- ip.addr == 10.10.20.15
- tcp
- dns
- http.request
- tcp.analysis.retransmission
Официальная документация описывает display filters как механизм выбора пакетов по протоколу, наличию поля, значению поля и сравнению нескольких полей.
💡 Совет
Не ограничивайте capture filter без необходимости. Если место на диске позволяет, лучше получить более полный захват и потом использовать display filters.
Иначе можно обнаружить, что нужного пакета просто нет в котле с доказательствами.
Первый запуск: что смотреть в интерфейсе
Открываем файл:
wireshark incident.pcapngТипичный интерфейс состоит из трёх основных областей:
- список пакетов;
- дерево протоколов выбранного пакета;
- необработанные байты пакета.
Особенно полезна строка Display Filter. Wireshark проверяет синтаксис фильтра непосредственно при вводе и показывает, является ли выражение корректным.

Базовые display filters, которые стоит помнить
Начнём с простых.
По протоколу:
- tcp
- udp
- dns
- icmp
- arp
- tls
По IP
ip.addr == 192.168.1.100Трафик только от источника:
ip.src == 192.168.1.100Только к адресу назначения:
ip.dst == 192.168.1.100По порту
- tcp.port == 443
- tcp.dstport == 22
- udp.port == 53
Комбинации
ip.addr == 10.10.20.15 && tcp.port == 443или:
ip.addr == 10.10.20.15 && (tcp.port == 80 || tcp.port == 443)Для сложных выражений используйте скобки — это избавляет от неоднозначности и делает фильтр читаемым.
HTTP: что реально отправляет клиент
Если трафик не зашифрован и Wireshark распознал HTTP, можно искать запросы:
http.requestТолько GET:
http.request.method == "GET"POST:
http.request.method == "POST"Определённый Host:
http.host == "example.com"Определённый URI:
http.request.uri contains "/api/"Поиск подозрительного User-Agent:
http.user_agent contains "curl"А если нужно увидеть конкретный разговор, удобнее выбрать пакет и использовать Follow → TCP Stream. Это позволяет восстановить последовательность TCP-обмена, а не рассматривать каждый пакет как независимую шестерёнку.
HTTPS: почему «посмотреть URL» уже не всегда получится
Современный HTTPS шифрует содержимое HTTP-сессии. Поэтому фильтр:
http.requestдля обычного TLS-трафика, как правило, ничего полезного не покажет. Но это не означает, что HTTPS полностью невидим. Можно исследовать:
tlsНапример, искать TLS ClientHello:
tls.handshake.type == 1В зависимости от версии протокольного анализатора и конкретного TLS-стека можно исследовать поля ClientHello, включая SNI:
tls.handshake.extensions_server_nameТакже полезно посмотреть TLS-ошибки, версии протокола и параметры handshake.
Для актуальных имён полей лучше пользоваться встроенным справочником Wireshark: список полей огромен и зависит от версии dissector’ов. Официальный Display Filter Reference предоставляет актуальную таблицу полей и протоколов.
Поиск TCP retransmission
Один из самых полезных фильтров при диагностике медленной сети:
tcp.analysis.retransmissionТакже стоит проверить:
tcp.analysis.fast_retransmissionи:
tcp.analysis.duplicate_ackЕсли retransmission много, это повод исследовать:
- потерю пакетов;
- перегрузку канала;
- проблемы Wi-Fi;
- ошибки физического интерфейса;
- MTU;
- перегруженный firewall;
- перегрузку виртуального коммутатора;
- асимметричную маршрутизацию;
- проблемы на промежуточном оборудовании.
Но retransmission сам по себе ещё не доказывает неисправность сети. Нужно посмотреть:
- где именно возникает потеря;
- сколько retransmission относительно общего количества пакетов;
- есть ли burst-поведение;
- растёт ли RTT;
- есть ли корреляция с нагрузкой;
- видны ли ошибки интерфейса на сетевом оборудовании.
TCP RST: кто оборвал разговор
Фильтр:
tcp.flags.reset == 1показывает TCP RST. RST может быть нормальным явлением, а может указывать на проблему. Например:
Client → Server: SYN
Server → Client: SYN,
ACK Client → Server: ACK
Client → Server: HTTP request
Server → Client: RST
Такое поведение уже интересно. Но причина может находиться на разных уровнях:
- приложение закрыло сокет;
- сервис не принимает запрос;
- firewall вмешался в соединение;
- балансировщик оборвал сессию;
- сервер аварийно закрыл соединение;
- пакет был сформирован промежуточным устройством.
Поэтому следующий шаг — определить MAC/IP-адрес отправителя RST и контекст TCP-сессии.
TCP handshake и диагностика установления соединения
Для SYN:
tcp.flags.syn == 1 && tcp.flags.ack == 0Для SYN/ACK:
tcp.flags.syn == 1 && tcp.flags.ack == 1Это позволяет быстро увидеть, кто начинает соединения и кто на них отвечает.
Если клиент постоянно отправляет:
SYN
SYN
SYN
SYNа SYN/ACK не появляется, ищем проблему между клиентом и сервером. Если SYN/ACK приходит, но финальный ACK не возвращается — уже появляется другой набор гипотез:
- обратный маршрут;
- firewall;
- NAT;
- асимметрия;
- фильтрация;
- проблемы на хосте клиента.
DNS: быстро ищем проблемы разрешения имён
Для DNS:
dnsТолько запросы:
dns.flags.response == 0Только ответы:
dns.flags.response == 1Поиск NXDOMAIN:
dns.flags.rcode == 3Поиск конкретного имени:
dns.qry.name == "example.com"Или:
dns.qry.name contains "example"Что искать в DNS
Если пользователь говорит: «Сайт иногда не открывается». можно проверить:
- DNS-запрос действительно уходит?
- Есть ли ответ?
- Какой RCODE?
- Сколько времени проходит между запросом и ответом?
- Какой DNS-сервер отвечает?
- Не идут ли повторные запросы?
- Нет ли огромного количества NXDOMAIN?
Например, если запросы уходят на DNS-сервер, но ответов нет, проблема может находиться ещё до HTTP и TCP.
ICMP: сеть сама рассказывает, где ей больно
Начнём с:
icmpОсобенно интересны ICMP Destination Unreachable:
icmp.type == 3Например, можно увидеть:
- Network Unreachable;
- Host Unreachable;
- Port Unreachable;
- Fragmentation Needed.
Последний вариант особенно интересен при диагностике MTU.
Для IPv6 используйте:
icmpv6Поиск аномалий: не существует одной волшебной кнопки
Wireshark не является автоматическим детектором компрометации, который посмотрел на pcap и объявил: «Виноват злой хакер, котёл №3». Аномалии нужно искать по признакам.
Признак №1 — неожиданный внешний адрес
Например:
ip.dst == 203.0.113.50Если неизвестны направления трафика, сначала исследуйте:
Statistics → Conversations
Там удобно посмотреть, какие IP-адреса и порты действительно участвовали в обмене.
Признак №2 — необычные порты
Можно искать:
tcpи сортировать пакеты по TCP-порту. Необычный порт сам по себе не означает атаку. Администратор должен сначала установить:
- какое приложение использует порт;
- принадлежит ли адрес серверу;
- соответствует ли это штатной архитектуре.
Признак №3 — огромный объём одного направления
Проверьте:
Statistics → Conversations → IPv4 / IPv6
и:
Statistics → Endpoints
Это помогает найти хосты, которые внезапно стали сетевыми паровозами.

Expert Information — автоматические подсказки
Wireshark умеет формировать Expert Information по некоторым обнаруженным состояниям. Обычно это хороший первый ориентир, но не окончательный диагноз. Идея проста: Expert Information говорит, куда посмотреть, а не кто виноват. Если Wireshark показывает retransmission, нужно проверить последовательность пакетов. Если виден malformed packet — проверить, действительно ли пакет повреждён, а не просто не полностью разобран конкретным dissector’ом. Если присутствует warning — проверить контекст.
Цвета пакетов: полезная автоматика
Coloring Rules позволяют визуально выделять интересующие типы трафика. Например, можно сделать отдельные правила для:
- TCP retransmission;
- TCP RST;
- DNS;
- HTTP;
- ICMP;
- подозрительных адресов.
Сохранённые display filters также можно создавать через интерфейс Wireshark, чтобы не вводить сложные выражения заново.
Для постоянной работы администратора это особенно полезно: собственная коллекция фильтров превращается в персональный набор гаечных ключей для сетевого котла.
Практический сценарий: «сервер стал медленным»
Предположим:
- клиент:
10.10.10.50; - сервер:
10.10.20.15; - приложение работает на TCP/443;
- пользователь жалуется на задержки.
Шаг 1. Отбираем трафик
ip.addr == 10.10.20.15 && tcp.port == 443Шаг 2. Ищем retransmission
ip.addr == 10.10.20.15 && tcp.port == 443 && tcp.analysis.retransmissionШаг 3. Проверяем RST
ip.addr == 10.10.20.15 && tcp.port == 443 && tcp.flags.reset == 1Шаг 4. Смотрим handshake
ip.addr == 10.10.20.15 && tcp.port == 443 && tcp.flags.syn == 1Шаг 5. Смотрим конкретный TCP stream
Выбираем пакет → Follow → TCP Stream.
Шаг 6. Проверяем статистику
Открываем:
Statistics → Conversations
и смотрим объём и длительность соединений.
Шаг 7. Формируем гипотезу
Например:
В захвате видно большое количество retransmission между клиентом и сервером, причём они группируются в моменты высокой нагрузки.
Но это ещё не вывод:
«сломался коммутатор».
Нужно подтвердить гипотезу другими источниками:
ip -s link show eth0
ethtool -S eth0
ss -s
ss -tiИ, если есть доступ к сетевому оборудованию, проверить counters интерфейсов.
Анализ через TShark без GUI
Wireshark особенно хорош, когда нужно расследовать инцидент на рабочей станции. Но на сервере без графического интерфейса пригодится TShark. Например:
tshark -r incident.pcapng -Y 'tcp.analysis.retransmission'Получить DNS-запросы:
tshark -r incident.pcapng -Y 'dns.flags.response == 0'Показать HTTP-запросы:
tshark -r incident.pcapng -Y 'http.request'Применить фильтр и вывести подробности:
tshark -r incident.pcapng -Y 'ip.addr == 10.10.20.15' -VTShark поддерживает -Y для display filter, а -f — для capture filter. Это различие сохраняется и в CLI-инструменте. Узнать доступные поля можно через:
tshark -G fieldsА доступные протоколы:
tshark -G protocolsКак искать неизвестное соединение
Допустим, IDS или EDR сообщает:
Хост
10.10.10.25устанавливает подозрительное внешнее соединение.
Первый фильтр:
ip.addr == 10.10.10.25Далее:
ip.src == 10.10.10.25Смотрим:
- destination IP;
- destination port;
- протокол;
- частоту соединений;
- DNS перед соединением;
- TLS ClientHello;
- длительность TCP-сессии;
- объём переданных данных.
Если есть DNS:
ip.addr == 10.10.10.25 && dnsЕсли есть TLS:
ip.addr == 10.10.10.25 && tlsЕсли обнаружен SNI:
tls.handshake.extensions_server_nameТак постепенно строится цепочка:

Фильтр для аномального поведения: пример
Допустим, нужно посмотреть TCP-пакеты, которые могут быть интересны с точки зрения неисправности:
tcp.analysis.retransmission ||
tcp.analysis.fast_retransmission ||
tcp.analysis.duplicate_ack ||
tcp.flags.reset == 1Получается своеобразный «аварийный клапан» для TCP.
Дальше нельзя просто сказать: «Вот оно, всё красное — сеть сломана». Нужно разбить поток по хостам и соединениям. Например:
ip.src == 10.10.10.25 &&
(
tcp.analysis.retransmission ||
tcp.flags.reset == 1
)Так мы уже задаём конкретный вопрос: Какие подозрительные TCP-события генерирует именно этот клиент?
Поиск конкретного текста в пакетах
Wireshark позволяет искать данные в захвате. Это может пригодиться при работе с незашифрованными протоколами или тестовыми стендами. Например, ищем:
passwordили:
errorОднако важно понимать разницу между поиском текста и display filter. Display filter обращается к разобранным полям протокола. Поиск текста может работать с содержимым пакета. На production-трафике будьте осторожны: дамп может содержать пароли, токены, cookies, персональные данные и другую чувствительную информацию.
Что делать после обнаружения проблемы
Хороший сетевой анализ заканчивается не фразой: «Wireshark показал retransmission». А цепочкой доказательств, например:
- Клиент отправляет TCP-сегмент.
- Сервер его не подтверждает.
- Клиент повторяет передачу.
- Возникает retransmission.
- Через некоторое время сервер отвечает.
- На интерфейсе клиента одновременно растёт RX/TX error counter.
- После замены проблемного интерфейса retransmission исчезают.
Вот это уже расследование. Wireshark дал наблюдение, а системные и сетевые метрики позволили превратить его в диагноз.
Типичные ошибки при работе с Wireshark
Ошибка №1. Снимать всё подряд
Огромный capture быстро превращается в цифровой угольный склад. Лучше заранее определить:
- интерфейс;
- направление;
- время;
- хосты;
- протокол.
Ошибка №2. Путать capture и display filters
tcp port 443и:
tcp.port == 443выглядят похоже, но относятся к разным языкам фильтрации. Первый вариант характерен для capture filter, второй — для display filter.
Ошибка №3. Делать вывод по одному пакету
Один RST ничего не доказывает. Одна retransmission тоже. Ищите последовательность событий.
Ошибка №4. Игнорировать временную шкалу
Сетевые проблемы часто видны именно по времени:
request → 1 ms → ответ
против:
request → 1 ms → retransmission → 1 s → ответ
Ошибка №5. Смотреть только на IP
Иногда проблема очевидна на уровне Ethernet:
- ошибки интерфейса;
- MAC-flapping;
- ARP;
- VLAN;
- duplex;
- MTU.
Поэтому при необходимости начинайте с нижнего уровня модели и поднимайтесь вверх.
Мини-шпаргалка администратора
| Задача | Display filter |
|---|---|
| TCP | tcp |
| UDP | udp |
| DNS | dns |
| ICMP | icmp |
| ARP | arp |
| TLS | tls |
| Хост | ip.addr == 10.0.0.10 |
| Источник | ip.src == 10.0.0.10 |
| Назначение | ip.dst == 10.0.0.10 |
| TCP/443 | tcp.port == 443 |
| HTTP-запросы | http.request |
| GET | http.request.method == “GET” |
| DNS-запросы | dns.flags.response == 0 |
| DNS NXDOMAIN | dns.flags.rcode == 3 |
| TCP RST | tcp.flags.reset == 1 |
| SYN | tcp.flags.syn == 1 && tcp.flags.ack == 0 |
| Retransmission | tcp.analysis.retransmission |
| Fast retransmission | tcp.analysis.fast_retransmission |
| Duplicate ACK | tcp.analysis.duplicate_ack |
Список полей Wireshark очень велик, поэтому эту таблицу стоит воспринимать как стартовый набор, а не как полный справочник. Официальный Display Filter Reference содержит значительно более широкий набор полей.
Финальный алгоритм расследования
Когда приходит тикет «сеть тормозит», можно действовать по короткому алгоритму:
1.Определить проблему
↓
2. Найти точку захвата
↓
3. Сделать ограниченный или полный capture
↓
4. Отфильтровать нужный хост
↓
5. Проверить DNS
↓
6. Проверить TCP handshake
↓
7. Проверить retransmission / duplicate ACK / RST
↓
8. Проверить RTT и временные интервалы
↓
9. Follow TCP Stream
↓
10. Сверить с логами и counters
↓
11. Подтвердить или отвергнуть гипотезу
Самое важное здесь — последний пункт. Wireshark не должен становиться гадальным шаром администратора. Его задача — дать настолько подробную картину происходящего в сети, чтобы гипотезу можно было проверить. Когда пакеты выстроены в последовательность, сеть перестаёт быть чёрным ящиком. Она начинает разговаривать — SYN-ами, ACK-ами, DNS-запросами, TLS handshake и retransmission. А задача админа — научиться понимать этот разговор.
⚙️ Машинное отделение ROADIT благодарит за прочтение.
Больше команд, шпаргалок и обзоров — на roadit.ru и в нашем Телеграф-канале.
📋 Все команды