Что такое 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 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний