Полезные выражения tcpdump

Когда дело доходит до отладки сетевых проблем в Linux, большинство пользователей ограничиваются базовыми командами вроде ping, netstat или даже curl. Но есть один инструмент, который часто недооценивают, неправильно понимают или вообще игнорируют - tcpdump. Если вы думаете, что tcpdump - это просто сниффер пакетов, вы многое упускаете: у него есть куча мощных функций для анализа сетей.

В этой статье мы пройдёмся по всем возможностям tcpdump: от базовых сценариев, до весьма продвинутых, и достаточно полезных в реальной эксплуатации. И разберёмся, почему эта команда должна быть в арсенале каждого системного администратора, SRE и DevOps-инженера.

tcpdump практически нет равных в применении различных фильтров и выражений. С их помощью можно выцепить именно тот трафик, который вам нужен.

Захват трафика от/к конкретному хосту:

tcpdump -i eth0 host 192.168.1.100

Захват HTTP-трафика (порт 80):

tcpdump -i eth0 port 80

Только TCP-трафик:

tcpdump tcp

Исключить трафик к определённому хосту:

tcpdump -i eth0 not host 192.168.1.1

Фильтрация по нескольким условиям:

tcpdump 'src 192.168.1.1 and dst port 22'

Трафик с определёнными флагами TCP (например, SYN и ACK):

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'

Только DNS-запросы (а не ответы):

tcpdump -i eth0 port 53 and '(udp[10] & 0x80) = 0'

ICMP-трафик (например, ping):

tcpdump icmp

Отслеживание потерь пакетов и повторных передач:

tcpdump 'tcp[13] & 4 != 0'  # TCP RST packets

Это помогает заметить, когда соединения сбрасываются (что может указывать на ошибки или проблемы с тайм-аутами).

Мониторинг DNS-трафика в реальном времени:

tcpdump -i any port 53 -n

Полезно, если вы хотите выяснить, почему тормозит DNS-резолвинг.

Захват только SSL/TLS-рукопожатия:

tcpdump -i eth0 port 443 and 'tcp[((tcp[12] & 0xf0) >> 2):1] = 0x16'

Можно использовать, чтобы убедиться, что TLS-установки идут как положено, не копаясь в шифрованных данных.

Просмотр HTTP-заголовков вживую:

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

Показывает текстовые данные (например, заголовки запросов и ответов) прямо в терминале. Удобно при отладке веб-приложений.

Фильтрация пакетов больше 512 байт:

tcpdump 'greater 512'

Так можно отсеять мелкий шум и сосредоточиться на «тяжёлых» пакетах.

Сохраняем и анализируем позже:

tcpdump -w debug_traffic.pcap -i eth0
# Then:
tcpdump -r debug_traffic.pcap

  • Отладка обрывов соединений
  • Проверка входящих и исходящих DNS- или API-запросов
  • Поиск «шумных» контейнеров или микросервисов
  • Обнаружение подозрительного или несанкционированного трафика
  • Захват только HTTP-заголовков для анализа производительности
  • Всегда используйте -s 0, если вам нужны полные пакеты (по умолчанию tcpdump обрезает их).
  • Комбинируйте -w и -c, чтобы ограничить размер файлов и не получить захват на терабайт.
  • Используйте -G и -W для ротации по времени — удобно, как циклический буфер:
tcpdump -i eth0 -w capture-%H%M.pcap -G 60 -W 5

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

Да, у tcpdump нет графического интерфейса, но по возможностям он не уступает (а иногда и превосходит) многие GUI-инструменты. Его фильтры, живой анализ и минимальная нагрузка делают его отличным инструментом как для продакшн-отладки, так и для изучения работы сетевых протоколов.

Если вы не используете tcpdump на полную - считайте, что смотрите на свою сеть почти вслепую.