====== Полезные выражения 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 ==== Да, у ''tcpdump'' нет графического интерфейса, но по возможностям он не уступает (а иногда и превосходит) многие GUI-инструменты. Его фильтры, живой анализ и минимальная нагрузка делают его отличным инструментом как для продакшн-отладки, так и для изучения работы сетевых протоколов. Если вы не используете ''tcpdump'' на полную - считайте, что смотрите на свою сеть почти вслепую.