tcpdump
1. Введение: Что такое tcpdump?
tcpdump — это консольная утилита для перехвата и анализа сетевого трафика, проходящего через сетевой интерфейс. Это стандартный инструмент, присутствующий практически в любой Unix-подобной системе (Linux, BSD, macOS). Его часто называют «швейцарским ножом» сетевого администратора.
Ключевые особенности:
- Мощность: Позволяет видеть raw-трафик, пакет за пакетом.
- Гибкость: Имеет чрезвычайно развитый язык фильтров для точного целевого захвата.
- Универсальность: Может декодировать огромное количество сетевых протоколов.
- Незаменимость: Работает там, где нет графического интерфейса (серверы, удаленные сессии).
Важное примечание о правах: Для захвата трафика требуются права суперпользователя. Всегда запускайте tcpdump через sudo или из-под root.
sudo tcpdump [опции] [фильтр]2. Основы захвата трафика
А. Выбор интерфейса
По умолчанию tcpdump использует первый поднятый интерфейс (часто eth0 или ens192). Чтобы выбрать интерфейс, используйте опцию -i.
- Захват на конкретном интерфейсе:bash
sudo tcpdump -i eth0 - Захват на всех интерфейсах:bash
sudo tcpdump -i any - Просмотр доступных интерфейсов:bash
tcpdump -D
Б. Ключевые опции вывода
-n: Не преобразовывать адреса в имена (no DNS resolution). Всегда используйте эту опцию для быстрого вывода и избежания лишнего DNS-трафика.-nn: Не преобразовывать ни адреса, ни порты. Еще более быстрый и четкий вывод.-v,-vv,-vvv: Увеличивают уровень детализации (verbosity) вывода (больше информации о пакетах).-c <число>: Остановить захват после получения указанного количества пакетов.bashsudo tcpdump -i any -c 5 -nn # Захватить 5 пакетов и выйти-w <файл>: Записать сырые пакеты в файл (а не выводить на экран). Идеально для сохранения дампа для последующего анализа.bashsudo tcpdump -i any -w capture.pcap-r <файл>: Читать пакеты из файла (а не с интерфейса). Анализ сохраненного дампа.bashsudo tcpdump -r capture.pcap -nn
3. Фильтрация: Сердце tcpdump
Без фильтров вы утонете в море пакетов. Фильтры tcpdump основаны на синтаксисе libpcap/BPF (Berkeley Packet Filter).
А. Фильтрация по хостам
- По IP-адресу:bash
sudo tcpdump -i any -nn host 192.168.1.5 - По отправителю (source) или получателю (destination):bash
sudo tumpdump -i any -nn src 192.168.1.5 sudo tcpdump -i any -nn dst 8.8.8.8
Б. Фильтрация по портам и протоколам
- По порту:bash
sudo tcpdump -i any -nn port 80 sudo tcpdump -i any -nn dst port 443 sudo tcpdump -i any -nn src port 22 - По диапазону портов:bash
sudo tcpdump -i any -nn portrange 8000-9000 - По протоколу:bash
sudo tcpdump -i any -nn icmp # Только ping-запросы sudo tcpdump -i any -nn tcp sudo tcpdump -i any -nn udp sudo tcpdump -i any -nn arp # Только ARP-запросы
В. Комбинирование фильтров
Можно использовать логические операторы для создания сложных условий.
and(и) /&&bash# Трафик с 192.168.1.5 на порт 80 sudo tcpdump -i any -nn src 192.168.1.5 and dst port 80or(или) /||bash# Трафик на порт 80 (HTTP) ИЛИ на порт 443 (HTTPS) sudo tcpdump -i any -nn port 80 or port 443not(не) /!bash# Весь трафик, КРОМЕ SSH (порт 22) sudo tcpdump -i any -nn not port 22- Группировка с скобками: Скобки нужно экранировать от shell.bash
# Трафик от (источник 1.1.1.1 ИЛИ 8.8.8.8) на порт 53 sudo tcpdump -i any -nn "(src host 1.1.1.1 or src host 8.8.8.8) and dst port 53"
4. Глубокий анализ: Заглядываем внутрь пакетов
А. Анализ конкретных полей пакетов
Можно фильтровать не только по заголовкам, но и по данным внутри пакета.
- Фильтр по флагам TCP:
tcp[13]обращается к 13-му байту заголовка TCP, где хранятся флаги.tcp-fin,tcp-syn,tcp-rst,tcp-push,tcp-ack,tcp-urg— это предопределенные маски для этих флагов.
bash# Захватить только SYN-пакеты (начало TCP-сессии) sudo tcpdump -i any -nn "tcp[tcpflags] & tcp-syn != 0" # Захватить только RST-пакеты (принудительный разрыв) sudo tcpdump -i any -nn "tcp[tcpflags] & tcp-rst != 0"
Б. Чтение содержимого пакетов
-X: Выводить содержимое пакета в hex и ASCII. Полезно для анализа Application Layer (HTTP, SMTP и т.д.).-A: Выводить содержимое пакета только в ASCII (удобно для текстовых протоколов).bash# Посмотреть содержимое HTTP-запросов sudo tcpdump -i any -nn -A port 80 # Посмотреть содержимое и в hex, и в ASCII (например, для бинарных протоколов) sudo tcpdump -i any -nn -X port 25
5. Практические примеры для диагностики
Пример 1: Диагностика DNS
# Весь DNS-трафик (порт 53) с выводом содержимого
sudo tcpdump -i any -nn -X port 53Пример 2: Поиск проблем с сетью
# Посмотреть, есть ли RST-пакеты, обрывающие соединение
sudo tcpdump -i any -nn "tcp[tcpflags] & tcp-rst != 0"Пример 3: Анализ веб-трафика конкретного хоста
# Весь HTTP/HTTPS трафик до/от сервера 10.0.0.10
sudo tcpdump -i any -nn host 10.0.0.10 and \(port 80 or port 443\)Пример 4: Поиск широковещательного (broadcast) трафика в сети
sudo tcpdump -i any -nn broadcast6. Советы и лучшие практики
- Всегда используйте
-nn: Избегает лишних DNS-запросов и делает вывод чище. - Сужайте фокус: Всегда используйте фильтры. Захват всего трафика (
tcpdump -i any) на загруженном интерфейсе может «убить» вашу сессию. - Пишите в файл для анализа: Для анализа сложных проблем сначала сохраните трафик в файл (
-w), а потом анализируйте его (-r) в спокойной обстановке. - Комбинируйте с другими утилитами:
tcpdumpможно использовать вместе сgrep,awk,lessдля дальнейшей обработки.bashsudo tcpdump -i any -nn -l | grep 'something' # -l для line buffering - Изучите Wireshark:
tcpdumpидеален для захвата на серверах. Для глубокого анализа сложных проблем с красивым GUI используйте Wireshark. Вы можете сохранить дамп вtcpdump(-w), а потом открыть его в Wireshark.
7. Заключение
tcpdump — это не просто утилита, это фундаментальный навык для любого ИТ-специалиста, работающего с сетями. Потратьте время на то, чтобы освоить его синтаксис фильтров. Это сэкономит вам countless hours при диагностике проблем и даст вам глубокое понимание того, как на самом деле работают сетевые приложения.
Домашнее задание: Запустите tcpdump -i any -nn в одной консоли и сделайте ping google.com в другой. Посмотрите на вывод и попробуйте разобраться в каждом поле вывода. Повторите то же самое для curl http://example.com.
