Skip to content

tcpdump

1. Введение: Что такое tcpdump?

tcpdump — это консольная утилита для перехвата и анализа сетевого трафика, проходящего через сетевой интерфейс. Это стандартный инструмент, присутствующий практически в любой Unix-подобной системе (Linux, BSD, macOS). Его часто называют «швейцарским ножом» сетевого администратора.

Ключевые особенности:

  • Мощность: Позволяет видеть raw-трафик, пакет за пакетом.
  • Гибкость: Имеет чрезвычайно развитый язык фильтров для точного целевого захвата.
  • Универсальность: Может декодировать огромное количество сетевых протоколов.
  • Незаменимость: Работает там, где нет графического интерфейса (серверы, удаленные сессии).

Важное примечание о правах: Для захвата трафика требуются права суперпользователя. Всегда запускайте tcpdump через sudo или из-под root.

bash
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 <число>: Остановить захват после получения указанного количества пакетов.
    bash
    sudo tcpdump -i any -c 5 -nn # Захватить 5 пакетов и выйти
  • -w <файл>: Записать сырые пакеты в файл (а не выводить на экран). Идеально для сохранения дампа для последующего анализа.
    bash
    sudo tcpdump -i any -w capture.pcap
  • -r <файл>: Читать пакеты из файла (а не с интерфейса). Анализ сохраненного дампа.
    bash
    sudo 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

bash
# Весь DNS-трафик (порт 53) с выводом содержимого
sudo tcpdump -i any -nn -X port 53

Пример 2: Поиск проблем с сетью

bash
# Посмотреть, есть ли RST-пакеты, обрывающие соединение
sudo tcpdump -i any -nn "tcp[tcpflags] & tcp-rst != 0"

Пример 3: Анализ веб-трафика конкретного хоста

bash
# Весь HTTP/HTTPS трафик до/от сервера 10.0.0.10
sudo tcpdump -i any -nn host 10.0.0.10 and \(port 80 or port 443\)

Пример 4: Поиск широковещательного (broadcast) трафика в сети

bash
sudo tcpdump -i any -nn broadcast

6. Советы и лучшие практики

  1. Всегда используйте -nn: Избегает лишних DNS-запросов и делает вывод чище.
  2. Сужайте фокус: Всегда используйте фильтры. Захват всего трафика (tcpdump -i any) на загруженном интерфейсе может «убить» вашу сессию.
  3. Пишите в файл для анализа: Для анализа сложных проблем сначала сохраните трафик в файл (-w), а потом анализируйте его (-r) в спокойной обстановке.
  4. Комбинируйте с другими утилитами: tcpdump можно использовать вместе с grep, awk, less для дальнейшей обработки.
    bash
    sudo tcpdump -i any -nn -l | grep 'something' # -l для line buffering
  5. Изучите Wireshark: tcpdump идеален для захвата на серверах. Для глубокого анализа сложных проблем с красивым GUI используйте Wireshark. Вы можете сохранить дамп в tcpdump (-w), а потом открыть его в Wireshark.

7. Заключение

tcpdump — это не просто утилита, это фундаментальный навык для любого ИТ-специалиста, работающего с сетями. Потратьте время на то, чтобы освоить его синтаксис фильтров. Это сэкономит вам countless hours при диагностике проблем и даст вам глубокое понимание того, как на самом деле работают сетевые приложения.

Домашнее задание: Запустите tcpdump -i any -nn в одной консоли и сделайте ping google.com в другой. Посмотрите на вывод и попробуйте разобраться в каждом поле вывода. Повторите то же самое для curl http://example.com.

Контакты: bystrovno@basealt.ru