Что такое tcpdump и как анализировать сетевой трафик из терминала

8 минут чтения
Средний рейтинг статьи — 4.9

tcpdump — это одна из самых популярных и мощных консольных утилит для перехвата и анализа сетевого трафика. Она позволяет в реальном времени отслеживать пакеты, проходящие через сетевой интерфейс, и анализировать их содержимое. Благодаря своей лёгкости и гибкости tcpdump широко используется как системными администраторами, так и специалистами по информационной безопасности.

Установка tcpdump

На большинстве дистрибутивов Linux tcpdump можно установить из стандартных репозиториев:

# Debian/Ubuntu
sudo apt install tcpdump
 
# CentOS/RHEL
sudo yum install tcpdump
 
# Fedora
sudo dnf install tcpdump
 
# macOS (через Homebrew)
brew install tcpdump

Захват пакетов с помощью tcpdump

Для захвата пакетов с целью диагностики или анализа tcpdump требует повышенных прав, поэтому в большинстве примеров команды запускаются с префиксом sudo.

Чтобы начать, используйте команду:

tcpdump --list-interfaces
# или короткий вариант
tcpdump -D

Она покажет, какие интерфейсы доступны для захвата:

$ sudo tcpdump -D
1.eth0
2.virbr0
3.eth1
4.any (Псевдо-устройство для захвата на всех интерфейсах)
5.lo [Loopback]

В примере выше перечислены все интерфейсы, доступные на машине. Особый интерфейс any позволяет захватывать пакеты на всех активных интерфейсах.

Запустим захват всех пакетов на интерфейсе any:

$ sudo tcpdump --interface any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq ...

tcpdump будет захватывать пакеты до тех пор, пока не получит сигнал прерывания. Чтобы остановить, нажмите Ctrl+C. В приведённом примере было захвачено более 9000 пакетов. Так как подключение выполнялось по SSH, tcpdump зафиксировал весь этот трафик.

Чтобы ограничить количество пакетов, используйте опцию -c (count):

$ sudo tcpdump -i any -c 5

Теперь захват завершится автоматически после 5 пакетов. Это удобно, если, например, нужно проверить только начало соединения.

Отключение DNS и порт-резолвинга

По умолчанию tcpdump преобразует IP-адреса и порты в имена. Для диагностики проще использовать «сырые» адреса и номера портов.

  • -n — отключает преобразование IP-адресов в имена хостов
  • -nn — отключает преобразование и хостов, и сервисов

Пример:

$ sudo tcpdump -i any -c 5 -nn
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq ...

Теперь вывод содержит только IP и порты, а tcpdump не делает DNS-запросов, что снижает сетевую нагрузку.

Понимание формата вывода

tcpdump умеет захватывать и декодировать множество протоколов (TCP, UDP, ICMP и др.). Рассмотрим пример TCP-пакета:

08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372

Разберём по частям:

  1. 08:41:13.729687 — метка времени (timestamp) получения пакета.
  2. IP — протокол сетевого уровня (IPv4). Для IPv6 будет IP6.
  3. 192.168.64.28.22 — IP-адрес и порт источника. 192.168.64.1.41916 — IP-адрес и порт назначения.
  4. Flags [P.] — TCP-флаги. Возможные значения:
ЗначениеФлагНазначение
SSYNУстановление соединения
FFINЗавершение соединения
PPUSHПередача данных
RRSTСброс соединения
.ACKПодтверждение пакета

Комбинации тоже возможны, например [S.] — SYN+ACK.

  1. seq 196:568 — последовательность байт (от 196 до 568).
  2. ack 1 — номер подтверждения (следующий ожидаемый байт).
  3. win 309 — размер окна (объём доступного буфера).
  4. options [...] — TCP-опции (например, MSS или Timestamp).
  5. length 372 — длина полезной нагрузки (в байтах).

Фильтры в tcpdump

Фильтрация — это одна из самых сильных сторон tcpdump. Утилита поддерживает язык фильтров Berkeley Packet Filter (BPF).

Примеры:

Захват только TCP-трафика:

sudo tcpdump tcp

Пакеты на 80-й порт (HTTP):

sudo tcpdump port 80

Только исходящие пакеты к определённому хосту:

sudo tcpdump dst 192.168.0.1

Комбинация фильтров:

sudo tcpdump tcp and port 443 and host example.com

Сохранение захватов в файл

Еще одна полезная возможность tcpdump — это сохранение трафика в файл для последующего анализа. Это позволяет, например, запускать захват пакетов в пакетном режиме на ночь и просматривать результаты утром. Также это удобно, если пакетов слишком много и анализ в реальном времени затруднен из-за высокой скорости.

Чтобы сохранить пакеты в файл вместо отображения их на экране, используйте опцию -w (write):

$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
[sudo] password for ricardo: 
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Эта команда сохраняет результат в файл с именем webserver.pcap. Расширение .pcap означает packet capture («захват пакетов») и является стандартом для этого формата.

Как видно в примере, на экран ничего не выводится, а захват завершается после сохранения 10 пакетов (задает опция -c10). Если нужно видеть некоторую информацию в процессе, можно добавить опцию -v.

Важно: tcpdump создает файл в бинарном формате, поэтому открыть его простым текстовым редактором не получится. Чтобы прочитать содержимое файла, используйте tcpdump с опцией -r (read).

Заключение

tcpdump — это мощный инструмент для анализа сетевого трафика прямо из терминала. Он позволяет не только перехватывать пакеты, но и эффективно фильтровать их, что делает его незаменимым как для администраторов, так и для специалистов по безопасности. Несмотря на кажущуюся сложность, tcpdump легко осваивается и даёт детальное понимание того, что происходит в сети.

8 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний