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 80
or
(или) /||
bash# Трафик на порт 80 (HTTP) ИЛИ на порт 443 (HTTPS) sudo tcpdump -i any -nn port 80 or port 443
not
(не) /!
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 broadcast
6. Советы и лучшие практики
- Всегда используйте
-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
.