Что такое tcpdump и как анализировать сетевой трафик из терминала
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Разберём по частям:
08:41:13.729687— метка времени (timestamp) получения пакета.IP— протокол сетевого уровня (IPv4). Для IPv6 будетIP6.192.168.64.28.22— IP-адрес и порт источника.192.168.64.1.41916— IP-адрес и порт назначения.Flags [P.]— TCP-флаги. Возможные значения:
| Значение | Флаг | Назначение |
|---|---|---|
S | SYN | Установление соединения |
F | FIN | Завершение соединения |
P | PUSH | Передача данных |
R | RST | Сброс соединения |
. | ACK | Подтверждение пакета |
Комбинации тоже возможны, например [S.] — SYN+ACK.
seq 196:568— последовательность байт (от 196 до 568).ack 1— номер подтверждения (следующий ожидаемый байт).win 309— размер окна (объём доступного буфера).options [...]— TCP-опции (например, MSS или Timestamp).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 легко осваивается и даёт детальное понимание того, что происходит в сети.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний