Команда Tcpdump в Linux

Команда tcpdump в Linux

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: command not found». Вы можете легко установить 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 фильтра определяет, какие пакеты будут захвачены.

Запустить tcpdump может только пользователь root или с привилегиями sudo . Если вы попытаетесь выполнить команду от имени обычного пользователя, вы получите сообщение об ошибке: «У вас нет разрешения на захват данных на этом устройстве».

Самый простой вариант использования — вызвать 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 — временная метка захваченного пакета указывается по местному времени и имеет следующий формат: hours:minutes:seconds.frac , где frac — доли секунды с полуночи.

  • IP — пакетный протокол. В данном случае IP означает интернет-протокол версии 4 (IPv4).

  • 192.168.1.185.22 — IP-адрес и порт источника, разделенные точкой ( . ).

  • 192.168.1.150.37445 — IP-адрес и порт назначения, разделенные точкой ( . ).

  • Flags [P.] — поле флагов TCP. В этом примере [P.] означает пакет Push Acknowledgment, который используется для подтверждения предыдущего пакета и отправки данных. Другие типичные значения поля флага:

    • [.] — ACK (Подтверждение)
    • [S] — SYN (Начать соединение)
    • [P] — PSH (передача данных)
    • [F] — FIN (Завершить соединение)
    • [R] — RST (сброс соединения)
    • [С.] — SYN-ACK (пакет SynAcK)
  • seq 201747193:201747301 — порядковый номер указывается в формате first:last . Он показывает количество данных, содержащихся в пакете. За исключением первого пакета в потоке данных, где эти номера абсолютные, все последующие пакеты используют относительные позиции байтов. В этом примере номер равен 201747193:201747301 , что означает, что пакет содержит байты с 201747193 по 201747301 потока данных. Используйте опцию -S для вывода абсолютных порядковых номеров.

  • ack 1226568763 Номер подтверждения — это порядковый номер следующих данных, ожидаемых другим концом этого соединения.

  • win 402 — Номер окна — это количество доступных байтов в приемном буфере.

  • options [nop,nop,TS val 1051794587 ecr 2679218230] — параметры TCP. nop (или «no operation») — это заполнение, используемое для увеличения длины заголовка TCP до 4 байтов. TS val — это временная метка TCP, а ecr — это ответ с эхом. Подробнее о параметрах TCP см. в документации IANA .

  • 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

Фильтрация по номеру источника и

Вы также можете фильтровать пакеты на основе порта или хоста источника или назначения, используя квалификаторы 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 (захват пакетов).

При использовании опции -w вывод не отображается на экране. tcpdump записывает необработанные пакеты и создает двоичный файл, который невозможно прочитать с помощью обычного текстового редактора.

Чтобы проверить содержимое файла, вызовите tcpdump с опцией -r :

 sudo tcpdump -r data.pcap

Если вы хотите запустить tcpdump в фоновом режиме , добавьте символ амперсанда ( & ) в конец команды.

Файл захвата также можно проверить с помощью других инструментов анализа пакетов, таких как Wireshark.

При захвате пакетов в течение длительного периода времени можно включить ротацию файлов. tcpdump позволяет создавать новые файлы и ротировать дамп с заданным интервалом или фиксированного размера. Следующая команда создаст до десяти файлов размером 200 МБ с именами file.pcap0 , file.pcap1 и т. д., прежде чем перезаписать старые файлы.

 sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap

После создания десяти файлов старые файлы будут перезаписаны.

Обратите внимание, что запускать tcpdump следует только при устранении неполадок.

Если вы хотите запустить tcpdump в определённое время, можно использовать cronjob . tcpdump не имеет функции завершения по истечении заданного времени. Для остановки tcpdump через определённое время можно использовать команду timeout . Например, чтобы завершить работу через 5 минут, выполните:

 sudo timeout 300 tcpdump -n -w data.pcap

Заключение

tcpdump — это инструмент командной строки для анализа и устранения неполадок, связанных с сетью.

Эта статья познакомила вас с основами использования и синтаксиса tcpdump . Более подробную документацию можно найти на сайте tcpdump .

Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.

терминал tcpdump

Связанные руководства

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *