Когда приложения не отвечают, API возвращает ошибки, или сервисы не могут установить соединение друг с другом, первой реакцией часто становится анализ логов. Но что делать, если причина проблемы кроется не в коде, а в сетевом взаимодействии? В таких ситуациях на помощь приходит tcpdump — мощный консольный сниффер, позволяющий в реальном времени просматривать каждый пакет, проходящий через сетевой интерфейс. С его помощью вы получаете доступ к сырым данным, видя, кто, кому, на какой порт и что именно передал.

Основы синтаксиса tcpdump

Знание базовых команд tcpdump позволяет решить до 80% типовых задач по анализу сетевого трафика, часто заменяя полноценные графические снифферы для быстрого дебага.

Прослушивание всех пакетов на интерфейсе

Для мониторинга всего трафика, проходящего через определённый сетевой интерфейс (например, eth0 или ens3):

sudo tcpdump -i eth0

Мониторинг HTTP-трафика

Чтобы отслеживать только HTTP-трафик на стандартном порту 80:

sudo tcpdump -i eth0 port 80

Фильтрация трафика между конкретными хостами

Для анализа взаимодействия между двумя определёнными IP-адресами:

sudo tcpdump -i eth0 host 192.168.1.100 and host 192.168.1.200

Сохранение дампа для дальнейшего анализа

Для сохранения захваченного трафика в файл формата .pcap, который можно открыть и проанализировать в таких инструментах, как Wireshark:

sudo tcpdump -i eth0 -w capture.pcap

Разбор вывода tcpdump

Понимание вывода tcpdump является ключом к быстрой диагностике. Рассмотрим типичный пример:

17:45:33.123456 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [S], seq 1234567890, win 64240, length 0
  • 17:45:33.123456: Точное время захвата пакета, включая микросекунды.
  • IP: Указывает на использование протокола IP.
  • 192.168.1.100.54321 > 93.184.216.34.80: Показывает IP-адрес источника (192.168.1.100) с портом (54321) и IP-адрес назначения (93.184.216.34) с портом (80). В данном случае, клиент 192.168.1.100 пытается связаться с HTTP-сервером 93.184.216.34.
  • Flags [S]: Флаги TCP-пакета. [S] означает SYN-флаг, указывающий на начало новой TCP-сессии (синхронизация).
  • seq 1234567890: Порядковый номер (sequence number) TCP-пакета.
  • win 64240: Размер окна приёма (receive window size), указывающий на количество данных, которое отправитель готов принять.
  • length 0: Длина полезной нагрузки пакета. В SYN-пакетах она обычно равна 0.

Расширенные фильтры для решения реальных проблем

Фильтры в tcpdump основаны на синтаксисе pcap-filter, предоставляя мощные возможности для детализированного анализа трафика.

1. Обнаружение атак (брутфорс, сканирование портов)

Для выявления попыток подключения к определённым портам, например, SSH (порт 22), можно использовать фильтр, который ловит только SYN-пакеты:

sudo tcpdump -i eth0 'tcp port 22 and tcp[13] & 2 != 0'

Выражение tcp[13] & 2 != 0 эффективно отфильтровывает только пакеты с установленным SYN-флагом, что позволяет обнаружить попытки установления нового соединения.

2. Мониторинг DNS-запросов с сервера

Для просмотра всех DNS-запросов, инициированных вашим сервером, используйте фильтр по порту 53:

sudo tcpdump -i eth0 port 53

Необычные или частые запросы к неизвестным доменам могут сигнализировать о наличии вредоносного ПО (майнер, ботнет).

3. Захват HTTP-запросов и заголовков

Для просмотра HTTP GET/POST запросов, включая их содержимое (если оно не зашифровано), можно использовать следующий, более сложный фильтр в сочетании с флагом -A для вывода ASCII-данных:

sudo tcpdump -i eth0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Этот фильтр, хотя и громоздкий, позволяет захватывать пакеты с полезной нагрузкой HTTP на порту 80.

4. Отладка взаимодействия между микросервисами в Docker

При отладке связи между контейнерами Docker, работающими в одной сети, полезно прослушивать трафик на соответствующем bridge-интерфейсе (например, docker0):

sudo tcpdump -i docker0 host 172.17.0.2 and host 172.17.0.3

Это позволяет увидеть, как микросервисы обмениваются данными внутри Docker-сети.

Типичные сценарии использования для системного администратора

Проблема с подключением к базе данных

Сценарий: Приложение не может подключиться к базе данных PostgreSQL на порту 5432.
Решение:

sudo tcpdump -i eth0 host 10.0.0.5 and port 5432

Анализ: Если вы видите исходящие SYN-пакеты (попытки соединения), но нет ответов или приходят RST-пакеты (сброс соединения), это может указывать на проблему с сетевой доступностью, фаерволом на сервере БД или активное отклонение соединения сервером.

Несанкционированный трафик на защищённый порт

Сценарий: Неизвестный трафик направляется на порт 443, не связанный с обычным Nginx.
Решение:

sudo tcpdump -i eth0 'dst port 443 and not src net 192.168.1.0/24'

Анализ: Этот фильтр поможет выявить исходящий трафик на порт 443 (HTTPS), который не исходит из вашей внутренней подсети. Это может быть признаком скомпрометированного сервера или нежелательной активности.

Определение источника нагрузки на сеть

Сценарий: Непонятный рост использования полосы пропускания (bandwidth).
Решение:

sudo timeout 30 tcpdump -i eth0 -nn 2>/dev/null | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -nr | head

Анализ: Эта команда захватывает трафик в течение 30 секунд и выводит список топ-10 IP-адресов, создающих наибольший объём трафика. Это простой, но эффективный способ быстро определить основные источники сетевой нагрузки.

Когда какой инструмент использовать?

  • tcpdump: Идеален для быстрого анализа трафика непосредственно на сервере или в командной строке, когда нет доступа к графическому интерфейсу.
  • Wireshark: Незаменим для глубокого и детального анализа сохранённых файлов дампа (.pcap), предоставляя мощные функции визуализации и фильтрации.
  • ngrep: Используется, когда необходимо найти конкретные текстовые строки или шаблоны в сетевом трафике, действуя подобно grep для сети.

Важно помнить, что tcpdump не может расшифровывать HTTPS-трафик, поскольку он шифруется. Однако он позволяет видеть факт установления соединения, объём передаваемых данных и частоту запросов, что во многих случаях достаточно для определения корневой причины сетевых проблем.

tcpdump остаётся незаменимым инструментом в арсенале любого системного администратора и специалиста DevOps для оперативной диагностики сетевых проблем, когда стандартные логи и системы мониторинга не дают исчерпывающей информации. Если материал был полезен, оцените его!