Иногда для устранения неполадок в сети может потребоваться дамп сетевого трафика. Для такой цели существует специальный инструмент под названием tcpdump
.
tcpdump
— это программа-сниффер (анализатор сетевого трафика), которая позволяет перехватывать и анализировать проходящий через утилиту сетевой трафик. Утилита имеет богатый набор опций и различных фильтров, благодаря чему ее можно применять для различных целей. tcpdump
— это полностью консольная утилита без графического интерфейса, а значит, ее можно запускать на серверах, где отсутствует поддержка графического интерфейса (GUI). Первая версия программы была выпущена в далеком 1988 году. С тех пор программа активно поддерживается — новые версии стабильно выходят каждый год.
В данной статье мы разберем различные сценарии использования tcpdump
.
cloud
Для установки tcpdump
необходимо следующее:
Сервер или виртуальная машина с предустановленной ОС Linux. Использовать можно любой дистрибутив.
Установка будет производиться на ОС Ubuntu 22.04.3 LTS. Пакет tcpdump
уже присутствует в официальном репозитории ОС. Для начала необходимо обновить индекс пакетов:
sudo apt update
Далее устанавливаем утилиту:
sudo apt -y install tcpdump
Убедимся, что установка произведена корректно. Для этого выведем версию tcpdump
:
tcpdump --version
Если в выводе команды отобразилась версия tcpdump
, то установка выполнена корректно.
Дальнейший запуск и использование утилиты необходимо производить от имени root
-пользователя или пользователя с правами sudo
.
Если запустить tcpdump
без параметров, то утилита начнет захватывать весь трафик со всех доступных интерфейсов в системе, выводя данные на экран (Stdout):
tcpdump
Чтобы остановить работу программы, необходимо нажать сочетание клавиш Ctrl + C.
После каждого завершения работы утилита выводит следующую информацию:
packets captured
— отображает количество захваченных пакетов (пакеты, которые были получены и обработаны tcpdump
);packets received by filter
— отображает количество пакетов, которые были захвачены при использование фильтров;packets dropped by kernel
— отображает количество пакетов, которые были отброшены ядром ОС.Также по умолчанию tcpdump
не сохраняет результаты своей работы. Запись в файл будет рассмотрена далее в статье.
На примере протокола TCP разберем вывод захваченного пакета. По умолчанию tcpdump
отображает следующие данные при захвате:
09:33:57.063196 IP nexus-test.com.ssh > 192.168.111.1.50653: Flags [P.], seq 27376:27440, ack 321, win 521, length 64
Расшифровка параметров приведена в таблице ниже.
Параметр |
Описание |
|
Метка времени. Используется формат Под фракцией подразумеваются доли секунды с полуночи. В данном примере пакет был захвачен в 9 часов:33 минуты: 57 секунд. |
|
Используемый протокол. |
|
Доменное имя (или IP-адрес) и порт исходного хоста (источника). Доменное имя (IP-адрес) и порт назначения разделены символом точки. В данном примере вместо числового обозначения порта 22 используется имя протокола — |
|
Доменное имя (или IP-адрес) и порт хоста назначения. Доменное имя (IP-адрес) и порт назначения разделены символом точки. |
|
ACK-флаг(и). Предназначены для указания на состояние соединения. Могут содержать одно или более значений. В данном примере задействован флаг
|
|
Порядковый номер данных в пакете. Используется относительное число для упрощения отслеживания. Последовательность |
|
Используется для подтверждения пришедшего пакета. |
|
Размер окна в байтах. Отображает количество байтов буферного пространства, доступного хосту для приема данных. |
|
Длина пакета в байтах. Отображает длину данных полезной нагрузки. Длина — это разница между последним и первым байтами порядкового номера. |
Перейдем к более гибкому использованию tcpdump
. Рассмотрим на практике различные примеры использования утилиты.
Для вывода всех сетевых интерфейсов в системе, на которых tcpdump
может перехватывать трафик, используется команда:
tcpdump -D
Как уже было упомянуто ранее, по умолчанию tcpdump
захватывает трафик со всех доступных интерфейсов в системе. Для захвата трафика только с определенного сетевого интерфейса (возьмем интерфейс с именем ens33
) можно использовать команду:
tcpdump -i ens33
Еще одной особенностью tcpdump
является то, что по умолчанию утилита преобразует IP-адреса в имена хостов, а также использует название сервисов вместо номеров портов. Чтобы tcpdump
не преобразовывал IP-адреса в имена хостов необходимо при запуске добавить ключ -n
:
tcpdump -n
Чтобы запретить преобразование номеров портов в название протокола, необходимо использовать опцию -nn
.
tcpdump -nn
По умолчанию tcpdump
будет захватывать неограниченное количество пакетов. Чтобы захватить только необходимое количество пакетов, например 4, необходимо использовать ключ -c
:
tcpdump -c 4
По умолчанию tcpdump
не отображает дату захвата пакета. Для отображения даты используется ключ -tttt
. Дата будет отображена в формате год:месяц:число
в самом начале строки:
tcpdump -tttt
tcpdump
обладает богатым набором фильтров, позволяя захватывать только необходимые пакеты. Рассмотрим основные фильтры.
Для того чтобы захватить трафик который «слушается» на определенном порту, можно воспользоваться опцией port
. Например, захватим трафик со всех интерфейсов, указав в качестве направления опцию dest
— в данном случае tcpdump
выведет трафик, который направляется к месту назначения (от нас):
tcpdump dst -n port 80
Также можно задать диапазон портов:
tcpdump -n portrange 80-443
tcpdump
поддерживает фильтрацию по протоколам. В качестве протоколов можно использовать следующие значения: ether
, fddi
, tr
, wlan
, ppp
, slip
, link
, ip
, arp
, rarp
, tcp
, udp
, icp
, ipv6
.
Вывод некоторых протоколов предоставлен ниже:
tcpdump icmp
tcpdump tcp
tcpdump arp
tcpdump udp
tcpdump
позволяет захватывать пакеты определенного размера. Для этого используется две опции:
less
— меньше задаваемого количества байт;greater
— больше задаваемого количества байт.Рассмотрим на конкретных примерах.
Захватим трафик, пакеты которого в сумме «весят» не более 43 байт:
tcpdump less 43
Захватим трафик, пакеты которого в сумме «весят» более 43 байт:
tcpdump greater 43
Стоит учитывать, что в размер пакета входит и размер заголовка: заголовок стандарта Ethernet без CRC занимает 14 байт, заголовок протокола IPv4 занимает 20 байт, заголовок протокола ICMP занимает 8 байт.
Для того чтобы использовать фильтрацию по MAC-адресу, необходимо использовать опции ether host
. Для перехвата любого трафика, отправляемого на заданный MAC-адрес или с него, необходимо использовать команду ниже (где 00:0c:29:c7:00:3f
— MAC-адрес):
tcpdump ether host 00:0c:29:c7:00:3f
Фильтровать трафик можно, используя IP-адрес или доменное имя отправителя или получателя.
Для того чтобы перехватывать трафик, который исходит от определенного хоста, используется параметр src
:
tcpdump -nn src 192.168.36.132
Для того чтобы перехватывать трафик, который «приходит» от определенного хоста, используется параметр dst
:
tcpdump -nn dst 192.168.36.132
tcpdump
поддерживает различные логические операторы, позволяя комбинировать опции. Утилита поддерживает следующие операторы:
and
или &&
— логическое «И». Объединяет нескольких условий — отображает результат, соответствующий всем условиям;or
или ||
— логическое «ИЛИ». Параллельно объединяет несколько условий — выводится результат, соответствующий хотя бы одному условию;not
или !
— логическое «НЕ». Предназначено для исключения указанного условия — выводится результат, не соответствующий заданному условию.Рассмотрим использование логических операторов на конкретных примерах. Перехватим пакеты, которые отправляются с хоста 192.168.36.132, и захватим только те пакеты, которые прослушивают 22 порт:
tcpdump -nn src 192.168.36.132 and port 22
Захватим пакеты со всех доступных интерфейсов, которые слушают порты 22 или 80:
tcpdump -nn port 22 or port 80
Захватим все пакеты, кроме пакетов с ICMP:
tcpdump -nn not icmp
Как уже было упомянуто ранее, по умолчанию tcpdump
не сохраняет вывод своей работы в файл. Для того чтобы данные сохранялись в файл, необходимо использовать параметр -w
, указав имя файла, а также задать расширение для файла в формате .pcap
:
tcpdump -nn src 192.168.36.132 -w results.pcap
Во время записи в файл результаты не будут отображаться в терминале. Для того чтобы остановить захват пакетов, необходимо нажать сочетание клавиш CTRL + C.
Данные, записанные в файл, можно прочитать. Для этого необходимо использовать параметр -r
и указать имя файла, куда были сохранены результаты tcpdump
:
tcpdump -r results.pcap
Подготовили для вас выгодные тарифы на облачные серверы
tcpdump
представляет собой мощный инструмент командной строки, при помощи которого можно проводить анализ своей сети и выявлять проблемы. Утилита поддерживает богатый набор различных опций, позволяя фильтровать необходимую информацию о пакетах.