tcpdump
— это утилита командной строки, которую вы можете использовать для захвата и проверки сетевого трафика, идущего в вашу систему и из нее. Это наиболее часто используемый сетевыми администраторами инструмент для устранения неполадок в сети и тестирования безопасности.
Несмотря на название, с помощью tcpdump
вы также можете захватывать не-TCP трафик, такой как UDP, ARP или ICMP. Перехваченные пакеты можно записать в файл или на стандартный вывод. Одной из самых мощных функций команды tcpdump
является ее способность использовать фильтры и собирать только те данные, которые вы хотите анализировать.
В этой статье мы рассмотрим основы использования команды tcpdump
в Linux.
Содержание
Установка tcpdump
tcpdump
установлен по умолчанию в большинстве дистрибутивов Linux и macOS. Чтобы проверить, доступна ли команда tcpdump
в вашей системе, введите:
tcpdump --version
Результат должен выглядеть примерно так:
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b 26 Feb 2019
Если tcpdump
отсутствует в вашей системе, приведенная выше команда напечатает «tcpdump: команда не найдена». Вы можете легко установить tcpdump
с помощью диспетчера пакетов вашего дистрибутива.
Установка tcpdump
в Ubuntu и Debian
sudo apt update && sudo apt install tcpdump
Установка tcpdump
на CentOS и Fedora
sudo yum install tcpdump
Установка tcpdump
в Arch Linux
sudo pacman -S tcpdump
Захват пакетов с помощью tcpdump
Общий синтаксис команды tcpdump
следующий:
tcpdump [options] [expression]
- Команда
options
позволяет управлять поведением команды. -
expression
фильтра определяет, какие пакеты будут захвачены.
Только root или пользователь с привилегиями sudo
может запускать tcpdump
. Если вы попытаетесь запустить команду от имени непривилегированного пользователя, вы получите сообщение об ошибке: «У вас нет разрешения на захват на этом устройстве».
Самый простой вариант использования — вызвать tcpdump
без каких-либо опций и фильтров:
sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
... Long output suppressed
23116 packets captured
23300 packets received by filter
184 packets dropped by kernel
tcpdump
будет продолжать захватывать пакеты и записывать их на стандартный вывод, пока не получит сигнал прерывания. Используйте Ctrl+C
чтобы отправить сигнал прерывания и остановить команду.
Для более подробного вывода передайте параметр -v
или -vv
для более подробного вывода:
sudo tcpdump -vv
Вы можете указать количество пакетов для захвата с помощью опции -c
. Например, чтобы захватить только десять пакетов, введите:
sudo tcpdump -c 10
После захвата пакетов tcpdump
остановится.
Если интерфейс не указан, tcpdump
использует первый найденный интерфейс и выгружает все пакеты, проходящие через этот интерфейс.
Используйте параметр -D
чтобы распечатать список всех доступных сетевых интерфейсов, с которых tcpdump может собирать пакеты:
sudo tcpdump -D
Для каждого интерфейса команда выводит имя интерфейса, краткое описание и соответствующий индекс (номер):
1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
Приведенные выше выходные данные показывают, что ens3
— это первый интерфейс, обнаруженный tcpdump
и используемый, когда команде не предоставлен интерфейс. Второй интерфейс any
— это специальное устройство, позволяющее захватывать все активные интерфейсы.
Чтобы указать интерфейс, на котором вы хотите перехватывать трафик, вызовите команду с параметром -i
за которым следует имя интерфейса или связанный индекс. Например, чтобы захватить все пакеты со всех интерфейсов, вы должны указать any
интерфейс:
sudo tcpdump -i any
По умолчанию tcpdump
выполняет обратное разрешение DNS для IP-адресов и переводит номера портов в имена. Используйте параметр -n
чтобы отключить перевод:
sudo tcpdump -n
Пропуск поиска DNS позволяет избежать генерации трафика DNS и делает вывод более читаемым. Рекомендуется использовать эту опцию всякий раз, когда вы вызываете tcpdump
.
Вместо отображения вывода на экране вы можете перенаправить его в файл с помощью операторов перенаправления >
и >>
:
sudo tcpdump -n -i any > file.out
Вы также можете просматривать данные при сохранении в файл с помощью команды tee
:
sudo tcpdump -n -l | tee file.out
Параметр -l
в приведенной выше команде сообщает tcpdump
о необходимости буферизации выходной строки. Если этот параметр не используется, вывод не будет записан на экране при создании новой строки.
Понимание вывода tcpdump
tcpdump
выводит информацию для каждого захваченного пакета в новой строке. Каждая строка включает метку времени и информацию об этом пакете в зависимости от протокола.
Типичный формат строки протокола TCP выглядит следующим образом:
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
Пойдем по полю и объясним следующую строку:
15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
-
15:47:24.248737
—15:47:24.248737
метка захваченного пакета15:47:24.248737
по местному времени и использует следующий формат:hours:minutes:seconds.frac
, гдеfrac
— доли секунды с полуночи. -
IP
— пакетный протокол. В данном случае IP означает Интернет-протокол версии 4 (IPv4). -
192.168.1.185.22
— IP-адрес и порт источника, разделенные точкой (.
). -
192.168.1.150.37445
— IP-адрес и порт назначения, разделенные точкой (.
). -
Flags [P.]
— поле TCP Flags. В этом примере[P.]
означает пакет подтверждения push, который используется для подтверждения предыдущего пакета и отправки данных. Другие типичные значения поля флага следующие:- [.] — ACK (подтверждение)
- [S] — SYN (Начать соединение)
- [P] — PSH (Push-данные)
- [F] — FIN (Завершить соединение)
- [R] — RST (сбросить соединение)
- [S.] — SYN-ACK (пакет SynAcK)
-
seq 201747193:201747301
— Порядковый номер находится вseq 201747193:201747301
first:last
. Он показывает количество данных, содержащихся в пакете. За исключением первого пакета в потоке данных, где эти числа являются абсолютными, все последующие пакеты используются как относительные позиции байтов. В этом примере номер201747193:201747301
, что означает, что этот пакет содержит байты от 201747193 до 201747301 потока данных. Используйте параметр-S
для вывода абсолютных порядковых номеров. -
ack 1226568763
Номер подтверждения — это порядковый номер следующих данных, ожидаемых на другом конце этого соединения. -
win 402
— Номер окна — это количество доступных байтов в приемном буфере. -
options [nop,nop,TS val 1051794587 ecr 2679218230]
— параметры TCP.nop
, или «нет операции» — это заполнение, используемое для того, чтобы сделать заголовок TCP кратным 4 байтам.TS val
— это временная метка TCP, аecr
— эхо-ответ. Посетите документацию IANA для получения дополнительной информации о параметрах TCP. -
length 108
— длина данных полезной нагрузки
tcpdump
фильтры
Когда tcpdump
вызывается без фильтров, он захватывает весь трафик и производит огромное количество выходных данных, что очень затрудняет поиск и анализ интересующих пакетов.
Фильтры — одна из самых мощных функций команды tcpdump
. Они позволяют захватывать только те пакеты, которые соответствуют выражению. Например, при устранении проблем, связанных с веб-сервером, вы можете использовать фильтры для получения только HTTP-трафика.
tcpdump
использует синтаксис Berkeley Packet Filter (BPF) для фильтрации перехваченных пакетов с использованием различных параметров обработки, таких как протоколы, IP-адреса и порты источника и назначения и т. д.
В этой статье мы рассмотрим некоторые из наиболее распространенных фильтров. Список всех доступных фильтров можно найти на странице руководства pcap-filter .
Фильтрация по протоколу
Чтобы ограничить захват определенным протоколом, укажите этот протокол как фильтр. Например, чтобы захватить только трафик UDP, вы должны запустить:
sudo tcpdump -n udp
Другой способ определить протокол — использовать квалификатор proto
, за которым следует номер протокола. Следующая команда отфильтрует протокол номер 17 и выдаст тот же результат, что и приведенный выше:
sudo tcpdump -n proto 17
Для получения дополнительной информации о числах проверьте список номеров IP-протоколов .
Фильтрация по хосту
Чтобы захватить только пакеты, относящиеся к определенному хосту, используйте квалификатор host
:
sudo tcpdump -n host 192.168.1.185
Хостом может быть IP-адрес или имя.
Вы также можете фильтровать вывод по заданному диапазону IP-адресов, используя квалификатор net
. Например, чтобы выгрузить только пакеты, относящиеся к 10.10.0.0/16
вы должны использовать:
sudo tcpdump -n net 10.10
Фильтрация по порту
Чтобы ограничить захват только пакетами от или к определенному порту, используйте квалификатор port
. Приведенная ниже команда захватывает пакеты, связанные со службой SSH (порт 22), с помощью этой команды:
sudo tcpdump -n port 23
portrange
позволяет захватывать трафик в диапазоне портов:
sudo tcpdump -n portrange 110-150
Фильтрация по источнику и назначению
Вы также можете фильтровать пакеты на основе порта или хоста источника или назначения, используя квалификаторы are src
, dst
, src and dst
, а также src or dst
.
Следующая команда захватывает приходящие пакеты от хоста с IP 192.168.1.185:
sudo tcpdump -n src host 192.168.1.185
Чтобы найти трафик, поступающий из любого источника на порт 80, вы должны использовать:
sudo tcpdump -n dst port 80
Комплексные фильтры
Фильтры можно комбинировать с помощью операторов and
( &&
), or
( ||
), но not
( !
).
Например, чтобы захватить весь HTTP-трафик, поступающий с исходного IP-адреса 192.168.1.185, вы должны использовать эту команду:
sudo tcpdump -n src 192.168.1.185 and tcp port 80
Вы также можете использовать круглые скобки для группировки и создания более сложных фильтров:
sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'
Чтобы избежать ошибок синтаксического анализа при использовании специальных символов, заключайте фильтры в одинарные кавычки.
Вот еще один пример команды для захвата всего трафика, кроме SSH, с исходного IP-адреса 192.168.1.185:
sudo tcpdump -n src 192.168.1.185 and not dst port 22
Инспекция пакетов
По умолчанию tcpdump
захватывает только заголовки пакетов. Однако иногда вам может потребоваться проверить содержимое пакетов.
tcpdump
позволяет печатать содержимое пакетов в ASCII и HEX.
Параметр -A
указывает tcpdump
печатать каждый пакет в ASCII и -x
в HEX:
sudo tcpdump -n -A
Чтобы показать содержимое пакета как в HEX, так и в ASCII, используйте параметр -X
:
sudo tcpdump -n -X
Чтение и запись снимков в файл
Еще одна полезная функция tcpdump
— записывать пакеты в файл. Это удобно, когда вы захватываете большое количество пакетов или захватываете пакеты для последующего анализа.
Чтобы начать запись в файл, используйте параметр -w
за которым следует выходной файл захвата:
sudo tcpdump -n -w data.pcap
Эта команда выше сохранит захват в файл с именем data.pcap
. Вы можете назвать файл по .pcap
, но обычно используется расширение .pcap
(захват пакетов).
Когда используется опция -w
, вывод не отображается на экране. tcpdump
записывает необработанные пакеты и создает двоичный файл, который невозможно прочитать обычным текстовым редактором.
Чтобы проверить содержимое файла, вызовите tcpdump
с параметром -r
:
sudo tcpdump -r data.pcap
Если вы хотите запустить tcpdump
в фоновом режиме , добавьте символ амперсанда ( &
) в конце команды.
Файл захвата также можно проверить с помощью других инструментов анализатора пакетов, таких как Wireshark.
При захвате пакетов в течение длительного периода времени вы можете включить ротацию файлов. tcpdump
позволяет создавать новые файлы и вращать файл дампа через указанный интервал времени или фиксированного размера. Следующая команда создаст до десяти файлов размером 200 file.pcap0
именами file.pcap0
, file.pcap1
и т. Д. Перед перезаписью старых файлов.
sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap
После создания десяти файлов старые файлы будут перезаписаны.
Обратите внимание, что запускать tcpdump
только во время устранения неполадок.
Если вы хотите запустить tcpdump
в определенное время, вы можете использовать cronjob . tcpdump
не имеет возможности выйти через заданное время. Вы можете использовать команду timeout
чтобы остановить tcpdump
через некоторое время. Например, чтобы выйти через 5 минут, вы должны использовать:
sudo timeout 300 tcpdump -n -w data.pcap
Выводы
tcpdump
— это инструмент командной строки для анализа и устранения проблем, связанных с сетью.
Эта статья познакомила вас с основами использования и синтаксиса tcpdump
. Для получения более подробной документации посетите веб-сайт tcpdump .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.