Полезные выражения 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
на полную - считайте, что смотрите на свою сеть почти вслепую.