tcpdump — утилита командной строки, которую вы можете использовать для захвата и проверки сетевого трафика, поступающего в вашу систему и из нее Это наиболее часто используемый среди сетевых администраторов инструмент для устранения неполадок в сети и тестирования безопасности.
Несмотря на его название tcpdump, вы также можете захватывать не только TCP-трафик, а и UDP, ARP или ICMP. Захваченные пакеты могут быть записаны в файл или стандартный вывод. Одной из самых мощных функций команды tcpdump является ее способность использовать фильтры и собирать только те данные, которые вы хотите проанализировать.
В этой статье мы рассмотрим основы использования команды tcpdump в Linux.
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, используя менеджер пакетов вашего дистрибутива.
sudo apt update && sudo apt install tcpdump
sudo yum install tcpdump
sudo pacman -S tcpdump
Общий синтаксис команды tcpdump выглядит следующим образом:
tcpdump [options] [expression]
Только root или пользователь с sudoпривилегиями может работать tcpdump. Если вы попытаетесь запустить команду как непривилегированный пользователь, вы получите сообщение об ошибке: “You don’t have permission to capture on that device”.
Самый простой вариант использования — вызвать 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выводит информацию для каждого захваченного пакета на новой строке. Каждая строка содержит метку времени и информацию об этом пакете, в зависимости от протокола.
Типичный формат строки протокола 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
Когда 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, dst и src или классификатор 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
Файл захвата также можно проверить с помощью других инструментов анализа пакетов, таких как Wireshark.
При захвате пакетов в течение длительного периода времени вы можете включить ротацию файлов. tcpdump позволяет создавать новые файлы или вращать файл дампа за указанный промежуток времени или фиксированный размер. Следующая команда будет создавать до десяти 200MB файлов, именованных 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использования и синтаксисом.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
спасибохорошая статья