Использование tcpdump для анализа и перехвата сетевого трафика
Иногда для устранения неполадок в сети может потребоваться дамп сетевого трафика. Для такой цели существует специальный инструмент под названием tcpdump
.
tcpdump
— это программа-сниффер (анализатор сетевого трафика), которая позволяет перехватывать и анализировать проходящий через утилиту сетевой трафик. Утилита имеет богатый набор опций и различных фильтров, благодаря чему ее можно применять для различных целей. tcpdump
— это полностью консольная утилита без графического интерфейса, а значит, ее можно запускать на серверах, где отсутствует поддержка графического интерфейса (GUI). Первая версия программы была выпущена в далеком 1988 году. С тех пор программа активно поддерживается — новые версии стабильно выходят каждый год.
В данной статье мы разберем различные сценарии использования tcpdump
.
Предварительные требования
Для установки tcpdump
необходимо следующее:
-
Сервер или виртуальная машина с предустановленной ОС Linux. Использовать можно любой дистрибутив.
Установка tcpdump
Установка будет производиться на ОС Ubuntu 22.04.3 LTS. Пакет tcpdump
уже присутствует в официальном репозитории ОС. Для начала необходимо обновить индекс пакетов:
sudo apt update
Далее устанавливаем утилиту:
sudo apt -y install tcpdump
Убедимся, что установка произведена корректно. Для этого выведем версию tcpdump
:
tcpdump --version
Если в выводе команды отобразилась версия tcpdump
, то установка выполнена корректно.
Дальнейший запуск и использование утилиты необходимо производить от имени root
-пользователя или пользователя с правами sudo
.
Запуск tcpdump без параметров
Если запустить tcpdump
без параметров, то утилита начнет захватывать весь трафик со всех доступных интерфейсов в системе, выводя данные на экран (Stdout):
tcpdump
Чтобы остановить работу программы, необходимо нажать сочетание клавиш Ctrl + C.
После каждого завершения работы утилита выводит следующую информацию:
packets captured
— отображает количество захваченных пакетов (пакеты, которые были получены и обработаныtcpdump
);packets received by filter
— отображает количество пакетов, которые были захвачены при использование фильтров;packets dropped by kernel
— отображает количество пакетов, которые были отброшены ядром ОС.
Также по умолчанию tcpdump
не сохраняет результаты своей работы. Запись в файл будет рассмотрена далее в статье.
Формат вывода 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
может перехватывать трафик, используется команда:
tcpdump -D
Захват трафика с определенного сетевого интерфейса
Как уже было упомянуто ранее, по умолчанию tcpdump
захватывает трафик со всех доступных интерфейсов в системе. Для захвата трафика только с определенного сетевого интерфейса (возьмем интерфейс с именем ens33
) можно использовать команду:
tcpdump -i ens33
Отключение преобразования IP-адресов в имена хостов
Еще одной особенностью tcpdump
является то, что по умолчанию утилита преобразует IP-адреса в имена хостов, а также использует название сервисов вместо номеров портов. Чтобы tcpdump
не преобразовывал IP-адреса в имена хостов необходимо при запуске добавить ключ -n
:
tcpdump -n
Чтобы запретить преобразование номеров портов в название протокола, необходимо использовать опцию -nn
.
tcpdump -nn
Захват определенного количества пакетов
По умолчанию tcpdump
будет захватывать неограниченное количество пакетов. Чтобы захватить только необходимое количество пакетов, например 4, необходимо использовать ключ -c
:
tcpdump -c 4
Добавление даты
По умолчанию tcpdump
не отображает дату захвата пакета. Для отображения даты используется ключ -tttt
. Дата будет отображена в формате год:месяц:число
в самом начале строки:
tcpdump -tttt
Фильтрация пакетов в tcpdump
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 адресу
Для того чтобы использовать фильтрацию по 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
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
представляет собой мощный инструмент командной строки, при помощи которого можно проводить анализ своей сети и выявлять проблемы. Утилита поддерживает богатый набор различных опций, позволяя фильтровать необходимую информацию о пакетах.