- Sysadminium
- Утилита tcpdump для анализа сети
- Установка и начало использования
- Захват пакетов и вывод информации
- Фильтры
- Совмещение различных фильтров
- Опции отвечающие за формат и количество выводимой информации
- Примеры команд
- Команда tcpdump в Linux
- Установка tcpdump
- Установка tcpdump в Ubuntu и Debian
- Установка tcpdump на CentOS и Fedora
- Установка tcpdump в Arch Linux
- Захват пакетов с помощью tcpdump
- Понимание вывода tcpdump
- tcpdump фильтры
- Фильтрация по протоколу
- Фильтрация по хосту
- Фильтрация по порту
- Фильтрация по источнику и назначению
- Комплексные фильтры
- Инспекция пакетов
- Чтение и запись снимков в файл
- Выводы
Sysadminium
База знаний системного администратора
Утилита tcpdump для анализа сети
Консольная утилита tcpdump предназначена для исследования сетевого трафика на linux серверах. Как работать с tcpdump на Linux? Рассмотрим в этой статье.
Установка и начало использования
Установить эту утилиту в debian или ubuntu можно так:
Использовать данное приложение может только администратор. Поэтому для работы используем sudo или работаем под пользователем root.
Первым делом можем посмотреть список доступных интерфейсов используя опцию -D:
Рассмотрим эти интерфейсы:
- ens18 – обычный сетевой интерфейс;
- lo – локальный сетевой интерфейс;
- any – псевдоинтерфейс обозначающий все интерфейсы;
- docker0 – у меня установлен в системе docker и этот интерфейс относится к нему;
- nflog, nfqueue, usbmon1 – не относятся к сети, и в этой статье рассматриваться не будут.
Захват пакетов и вывод информации
Чтобы посмотреть все проходящие пакеты через выбранный интерфейс можно воспользоваться опцией -i . Но так как пакетов будет много, дополнительно укажем опцию -c , чтобы захватить только определённое количество пакетов:
Теперь рассмотрим полученную информацию, которая состоит из заголовков каждого пакета выводимые построчно. Строка состоит из следующих полей:
- время;
- протокол;
- ip источника и его порт;
- ip назначения и его порт;
- флаги;
- seq – номер первого байта сегмента. Данные, передающиеся по TCP делятся на сегменты, а в заголовке указывается порядковый номер первого байта в этом сегменте;
- ack – номер подтверждения, если присутствует. Получатель после приёма сегмента или нескольких сегментов посылает номер подтверждения;
- win – размер окна приема. Получатель указывает размер окна, больше которого отправитель не может отправить сегмент;
- options – опции, если присутствуют;
- length – длина полезной нагрузки данных.
Эта утилита может показывать не только заголовки, но и содержимое пакетов, но об этом позже.
Фильтры
Чтобы не захватывать все пакеты, нужно использовать фильтры. Например можно захватить пакеты только от определённого ip адреса, номера порта или протокола. Вот список самых распространённых фильтров:
- port – порт назначения или источника;
- host – ip адрес назначения или источника;
- src – ip адрес источника;
- dst – ip адрес назначения;
- net – подсеть;
- tcp – пакеты tcp;
- udp – пакеты udp;
- ip – ip;
- ip6 – ip версии 6;
- icmp – icmp.
Например захватим 10 пакетов связанных с www.incentivespro.com.
Совмещение различных фильтров
Фильтры можно совмещать, например захватим только icmp пакеты связанные с ip адресом 172.30.81.7:
Совмещать фильтры можно следующими операторами:
- and – для захвата пакета должны сработать оба фильтра;
- or – для захвата пакета должен сработать любой из фильтров;
- not – исключить из захвата эти пакеты.
В примере выше мы использовали – and.
Опции отвечающие за формат и количество выводимой информации
Теперь разберёмся с наиболее используемыми опциями, которые отвечают за формат вывода:
- -i – прослушивать конкретный интерфейс;
- -n – отображать ip адреса вместо имен;
- -nn – отображать ip адреса и номера портов вместо имени и названия протоколов;
- -q – минимальное количество информации о пакете;
- -t – не отображать метку времени в каждой строке;
- -tttt – задает вывод временных меток в такой форме: 2021-03-03 16:07:29.578942;
- -X – показывать содержимое пакета в шестнадцатеричной кодировке и в ASCII;
- -XX – то же, что и -X, но также показывает ethernet заголовки;
- -v, -vv, -vvv – увеличить количество получаемой информации;
- -c – получить определённое число пакетов и завершить работу.
Примеры команд
Смотрим все пакеты на всех интерфейсах или на каком-то одном:
Ловим пакеты у которых адрес:
- источника или назначения равен 192.168.0.100;
- источника равен 192.168.0.100;
- назначения равен 192.168.0.100;
- источника или назначения входит в подсеть 192.168.0.0/24
Ловим пакеты у которых порт:
- источника или назначения равен 8000;
- источника равен 8000;
- назначения равен 8000;
- входит в диапазон портов 8000-9000;
Ловим пакеты определенного протокола:
Ловим tcp пакеты у которых порт входит в группу портов:
Тоже самое, но смотрим содержимое пакетов:
Пишем результат в файл и считываем из файла:
Опции, фильтры и комбинации фильтров утилиты tcpdump позволяют исследовать работу сети. Это может пригодиться при поиске проблемы, при анализе безопасности сети, а также если вы изучаете какой-нибудь протокол и хотите на практике понаблюдать за его работой.
Источник
Команда tcpdump в Linux
tcpdump — это утилита командной строки, которую вы можете использовать для захвата и проверки сетевого трафика, идущего в вашу систему и из нее. Это наиболее часто используемый сетевыми администраторами инструмент для устранения неполадок в сети и тестирования безопасности.
Несмотря на название, с помощью tcpdump вы также можете захватывать не-TCP трафик, такой как UDP, ARP или ICMP. Перехваченные пакеты можно записать в файл или на стандартный вывод. Одной из самых мощных функций команды tcpdump является ее способность использовать фильтры и собирать только те данные, которые вы хотите анализировать.
В этой статье мы рассмотрим основы использования команды tcpdump в Linux.
Установка tcpdump
tcpdump установлен по умолчанию в большинстве дистрибутивов Linux и macOS. Чтобы проверить, доступна ли команда tcpdump в вашей системе, введите:
Результат должен выглядеть примерно так:
Если tcpdump отсутствует в вашей системе, приведенная выше команда напечатает «tcpdump: команда не найдена». Вы можете легко установить tcpdump с помощью диспетчера пакетов вашего дистрибутива.
Установка tcpdump в Ubuntu и Debian
Установка tcpdump на CentOS и Fedora
Установка tcpdump в Arch Linux
Захват пакетов с помощью tcpdump
Общий синтаксис команды tcpdump следующий:
- Команда options позволяет управлять поведением команды.
- expression фильтра определяет, какие пакеты будут захвачены.
Только root или пользователь с привилегиями sudo может запускать tcpdump . Если вы попытаетесь запустить команду от имени непривилегированного пользователя, вы получите сообщение об ошибке: «У вас нет разрешения на захват на этом устройстве».
Самый простой вариант использования — вызвать tcpdump без каких-либо опций и фильтров:
tcpdump будет продолжать захватывать пакеты и записывать их на стандартный вывод, пока не получит сигнал прерывания. Используйте Ctrl+C чтобы отправить сигнал прерывания и остановить команду.
Для более подробного вывода передайте параметр -v или -vv для более подробного вывода:
Вы можете указать количество пакетов для захвата с помощью опции -c . Например, чтобы захватить только десять пакетов, введите:
После захвата пакетов tcpdump остановится.
Если интерфейс не указан, tcpdump использует первый найденный интерфейс и выгружает все пакеты, проходящие через этот интерфейс.
Используйте параметр -D чтобы распечатать список всех доступных сетевых интерфейсов, с которых tcpdump может собирать пакеты:
Для каждого интерфейса команда выводит имя интерфейса, краткое описание и соответствующий индекс (номер):
Приведенные выше выходные данные показывают, что ens3 — это первый интерфейс, обнаруженный tcpdump и используемый, когда команде не предоставлен интерфейс. Второй интерфейс any — это специальное устройство, позволяющее захватывать все активные интерфейсы.
Чтобы указать интерфейс, на котором вы хотите перехватывать трафик, вызовите команду с параметром -i за которым следует имя интерфейса или связанный индекс. Например, чтобы захватить все пакеты со всех интерфейсов, вы должны указать any интерфейс:
По умолчанию tcpdump выполняет обратное разрешение DNS для IP-адресов и переводит номера портов в имена. Используйте параметр -n чтобы отключить перевод:
Пропуск поиска DNS позволяет избежать генерации трафика DNS и делает вывод более читаемым. Рекомендуется использовать эту опцию всякий раз, когда вы вызываете tcpdump .
Вместо отображения вывода на экране вы можете перенаправить его в файл с помощью операторов перенаправления > и >> :
Вы также можете просматривать данные при сохранении в файл с помощью команды tee :
Параметр -l в приведенной выше команде сообщает tcpdump о необходимости буферизации выходной строки. Если этот параметр не используется, вывод не будет записан на экране при создании новой строки.
Понимание вывода tcpdump
tcpdump выводит информацию для каждого захваченного пакета в новой строке. Каждая строка включает метку времени и информацию об этом пакете в зависимости от протокола.
Типичный формат строки протокола TCP выглядит следующим образом:
Пойдем по полю и объясним следующую строку:
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, вы должны запустить:
Другой способ определить протокол — использовать квалификатор proto , за которым следует номер протокола. Следующая команда отфильтрует протокол номер 17 и выдаст тот же результат, что и приведенный выше:
Для получения дополнительной информации о числах проверьте список номеров IP-протоколов .
Фильтрация по хосту
Чтобы захватить только пакеты, относящиеся к определенному хосту, используйте квалификатор host :
Хостом может быть IP-адрес или имя.
Вы также можете фильтровать вывод по заданному диапазону IP-адресов, используя квалификатор net . Например, чтобы выгрузить только пакеты, относящиеся к 10.10.0.0/16 вы должны использовать:
Фильтрация по порту
Чтобы ограничить захват только пакетами от или к определенному порту, используйте квалификатор port . Приведенная ниже команда захватывает пакеты, связанные со службой SSH (порт 22), с помощью этой команды:
portrange позволяет захватывать трафик в диапазоне портов:
Фильтрация по источнику и назначению
Вы также можете фильтровать пакеты на основе порта или хоста источника или назначения, используя квалификаторы are src , dst , src and dst , а также src or dst .
Следующая команда захватывает приходящие пакеты от хоста с IP 192.168.1.185:
Чтобы найти трафик, поступающий из любого источника на порт 80, вы должны использовать:
Комплексные фильтры
Фильтры можно комбинировать с помощью операторов and ( && ), or ( || ), но not ( ! ).
Например, чтобы захватить весь HTTP-трафик, поступающий с исходного IP-адреса 192.168.1.185, вы должны использовать эту команду:
Вы также можете использовать круглые скобки для группировки и создания более сложных фильтров:
Чтобы избежать ошибок синтаксического анализа при использовании специальных символов, заключайте фильтры в одинарные кавычки.
Вот еще один пример команды для захвата всего трафика, кроме SSH, с исходного IP-адреса 192.168.1.185:
Инспекция пакетов
По умолчанию tcpdump захватывает только заголовки пакетов. Однако иногда вам может потребоваться проверить содержимое пакетов.
tcpdump позволяет печатать содержимое пакетов в ASCII и HEX.
Параметр -A указывает tcpdump печатать каждый пакет в ASCII и -x в HEX:
Чтобы показать содержимое пакета как в HEX, так и в ASCII, используйте параметр -X :
Чтение и запись снимков в файл
Еще одна полезная функция tcpdump — записывать пакеты в файл. Это удобно, когда вы захватываете большое количество пакетов или захватываете пакеты для последующего анализа.
Чтобы начать запись в файл, используйте параметр -w за которым следует выходной файл захвата:
Эта команда выше сохранит захват в файл с именем data.pcap . Вы можете назвать файл по .pcap , но обычно используется расширение .pcap (захват пакетов).
Когда используется опция -w , вывод не отображается на экране. tcpdump записывает необработанные пакеты и создает двоичный файл, который невозможно прочитать обычным текстовым редактором.
Чтобы проверить содержимое файла, вызовите tcpdump с параметром -r :
Если вы хотите запустить tcpdump в фоновом режиме , добавьте символ амперсанда ( & ) в конце команды.
Файл захвата также можно проверить с помощью других инструментов анализатора пакетов, таких как Wireshark.
При захвате пакетов в течение длительного периода времени вы можете включить ротацию файлов. tcpdump позволяет создавать новые файлы и вращать файл дампа через указанный интервал времени или фиксированного размера. Следующая команда создаст до десяти файлов размером 200 file.pcap0 именами file.pcap0 , file.pcap1 и т. Д. Перед перезаписью старых файлов.
После создания десяти файлов старые файлы будут перезаписаны.
Обратите внимание, что запускать tcpdump только во время устранения неполадок.
Если вы хотите запустить tcpdump в определенное время, вы можете использовать cronjob . tcpdump не имеет возможности выйти через заданное время. Вы можете использовать команду timeout чтобы остановить tcpdump через некоторое время. Например, чтобы выйти через 5 минут, вы должны использовать:
Выводы
tcpdump — это инструмент командной строки для анализа и устранения проблем, связанных с сетью.
Эта статья познакомила вас с основами использования и синтаксиса tcpdump . Для получения более подробной документации посетите веб-сайт tcpdump .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник