Если вам необходимо проанализировать или перехватить сетевые пакеты в Linux, то лучше всего для этого использовать консольную утилиту tcpdump. Но проблема возникает в довольно сложном ее управлении. Рядовому пользователю покажется, что работать с утилитой неудобно, но это только на первый взгляд. В статье будет рассказано, как устроена tcpdump, какой синтаксис она имеет, как ей пользоваться, а также будут приведены многочисленные примеры ее использования.
Читайте также: Руководства по настройке интернет-соединения в Ubuntu, Debian, Ubuntu Server
Установка
Большинство разработчиков операционных систем на базе Linux включают утилиту tcpdump в список предустановленных, но если по какой-то причине она в вашем дистрибутиве отсутствует, ее можно всегда скачать и установить через «Терминал». Если у вас ОС основана на Debian, а это Ubuntu, Linux Mint, Kali Linux и им подобные, нужно выполнить эту команду:
sudo apt install tcpdump
При установке вам нужно ввести пароль. Обратите внимание, что при наборе он не отображается, также для подтверждения установки нужно ввести символ «Д» и нажать Enter.
Если у вас Red Hat, Fedora или CentOS, то команда для установки будет иметь следующий вид:
sudo yam install tcpdump
После того как утилита будет установлена, ей сразу же можно пользоваться. Об этом и о многом другом будет рассказано дальше по тексту.
Читайте также: Руководство по установке PHP в Ubuntu Server
Синтаксис
Как и любая другая команда, tcpdump имеет свой синтаксис. Зная его, вы сможете задавать все необходимые параметры, которые будут учитываться при выполнении команды. Синтаксис имеет следующий вид:
tcpdump опции -i интерфейс фильтры
При использовании команды вам обязательно необходимо указывать интерфейс для отслеживания. Фильтры и опции — это не обязательные переменные, но они позволяют выполнить более гибкую настройку.
Опции
Хоть опцию и не обязательно указывать, перечислить доступные все же нужно. В таблице продемонстрирован не весь их список, а только наиболее популярные, но их с лихвой хватит, чтобы решить большинство поставленных задач.
Опция | Определение |
---|---|
-A | Позволяет отсортировать пакеты с форматом ASCII |
-l | Добавляет функцию прокрутки |
-i | После ввода нужно указать сетевой интерфейс, который будет отслеживаться. Чтобы начать отслеживать все интерфейсы, впишите после опции слово «any» |
-c | Завершает процесс отслеживания после проверки указанного количества пакетов |
-w | Генерирует текстовый файл с отчетом проверки |
-e | Показывает уровень интернет-соединения пакета данных |
-L | Выводит только те протоколы, которые поддерживает указанный сетевой интерфейс |
-C | Создает другой файл во время записи пакета, если его размер больше заданного |
-r | Открывает файл для чтения, который был создан с помощью опции -w |
-j | Для записи пакетов будет использоваться формат TimeStamp |
-J | Позволяет просмотреть все доступные форматы TimeStamp |
-G | Служит для создания файла с логами. Опция требует также указания временного значения, по истечении которого будет создаваться новый лог |
-v, -vv, -vvv | В зависимости от количества символов в опции, вывод команды будет становиться подробнее (увеличение прямо пропорционально количеству символов) |
-f | В выводе показывает имя домена адресов IP |
-F | Позволяет считывать информацию не из сетевого интерфейса, а из указанного файла |
-D | Демонстрирует все сетевые интерфейсы, которые можно использовать |
-n | Деактивирует отображение доменных имен |
-Z | Задает пользователя, под учетной записью которого будут созданы все файлы |
-K | Пропуск анализа контрольных сумм |
-q | Демонстрация краткой информации |
-H | Позволяет обнаружить заголовки 802.11s |
-I | Используется при захвате пакетов в режиме монитора |
Разобрав опции, чуть ниже мы перейдем непосредственно к их применениям. А пока что будут рассмотрены фильтры.
Фильтры
Как говорилось в самом начале статьи, вы можете добавлять в синтаксис tcpdump фильтры. Сейчас будут рассмотрены наиболее популярные из них:
Фильтр | Определение |
---|---|
host | Служит для указания имени хоста |
net | Указывает IP подсети и сети |
ip | Служит для указания адреса протокола |
src | Выводит пакеты, которые были отправлены с указанного адреса |
dst | Выводит пакеты, которые были получены указанным адресом |
arp, udp, tcp | Фильтрация по одному из протоколов |
port | Отображает информацию, относящуюся к определенному порту |
and, or | Служит для объединения нескольких фильтров в команде |
less, greater | Вывод пакетов меньше или больше указанного размера |
Все вышеперечисленные фильтры можно комбинировать между собой, таким образом, в выдаче команды вы будете наблюдать только ту информацию, которую желаете увидеть. Чтобы более детально разобраться в использовании вышеперечисленных фильтров, стоит привести примеры.
Читайте также: Часто используемые команды в «Терминале» Linux
Примеры использования
Сейчас будут приведены часто используемые варианты синтаксиса команды tcpdump. Все их перечислить не получится, так как их вариаций может быть бесконечное множество.
Просмотр списка интерфейсов
Рекомендуется каждому пользователю изначально проверить список всех его сетевых интерфейсов, которые можно отследить. Из вышеприведенной таблицы мы знаем, что для этого нужно использовать опцию -D, поэтому в терминале выполните следующую команду:
sudo tcpdump -D
Пример:
Как вы можете заметить, в примере есть восемь интерфейсов, которые можно просмотреть с помощью команды tcpdump. В статье будут приводиться примеры с ppp0, вы же можете использовать любой другой.
Обычный захват трафика
Если нужно отследить один сетевой интерфейс, то сделать это вы можете с помощью опции -i. Не забудьте после ее ввода указать наименование интерфейса. Вот пример выполнения такой команды:
sudo tcpdump -i ppp0
Обратите внимание: перед самой командой нужно вписать «sudo», так как она требует права суперпользователя.
Пример:
Примечание: после нажатия Enter в «Терминале» беспрерывно будут отображаться перехваченные пакеты. Чтобы остановить их поток, нужно нажать комбинацию клавиш Ctrl+C.
Если вы выполняете команду без дополнительных опций и фильтров, то увидите следующий формат отображения отслеженных пакетов:
22:18:52.597573 IP vrrp-topf2.p.mail.ru.https > 10.0.6.67.35482: Flags [P.], seq 1:595, ack 1118, win 6494, options [nop,nop,TS val 257060077 ecr 697597623], length 594
Где цветом выделено:
Синим | Время получения пакета |
Оранжевым | Версия протокола |
Зеленым | Адрес отправителя |
Фиолетовым | Адрес получателя |
Серым | Дополнительная информация о tcp |
Красным | Размер пакета (отображается в байтах) |
Этот синтаксис имеет возможность вывода в окне «Терминала» без использования дополнительных опций.
Захват трафика с опцией -v
Как известно из таблицы, опция -v позволяет увеличить количество информации. Разберем на примере. Проверим тот же интерфейс:
sudo tcpdump -v -i ppp0
Пример:
Здесь можно заметить, что появилась следующая строка в выводе:
IP (tos 0x0, ttl 58, id 30675, offset 0, flags [DF], proto TCP (6), length 52
Где цветом выделено:
Оранжевым | Версия протокола |
Синим | Продолжительность жизни протокола |
Зеленым | Длина заголовка поля |
Фиолетовым | Версия пакета tcp |
Красным | Размер пакета (отображается в байтах) |
Также в синтаксис команды вы можете прописать опцию -vv или -vvv, что позволит еще больше увеличить объем выводимой информации на экран.
Опция -w и -r
В таблице опций упоминалось о возможности сохранять все выводимые данные в отдельный файл, чтобы позже их можно было просмотреть. За это отвечает опция -w. Пользоваться ей довольно просто, всего-навсего укажите ее в команде, а затем впишите название будущего файла с расширением «.pcap». Рассмотрим все на примере:
sudo tcpdump -i ppp0 -w file.pcap
Пример:
Обратите внимание: во время записи логов в файл на экране «Терминала» не отображается никакой текст.
Когда вы захотите просмотреть записанный вывод, необходимо использовать опцию -r, после которой написать название ранее записанного файла. Применяется она без других опций и фильтров:
sudo tcpdump -r file.pcap
Пример:
Обе эти опции отлично подойдут в тех случаях, когда необходимо сохранить большие объемы текста для последующего разбора.
Фильтрация по IP
Из таблицы фильтров мы знаем, что dst позволяет вывести на экран консоли только те пакеты, которые были получены адресом, что указан в синтаксисе команды. Таким образом очень удобно просматривать пакеты, полученные вашим компьютером. Для этого в команде нужно всего лишь указать свой IP-адрес:
sudo tcpdump -i ppp0 ip dst 10.0.6.67
Пример:
Как можно заметить, помимо dst, в команде мы прописали также фильтр ip. Другими словами, мы сказали компьютеру, чтобы при отборе пакетов он обращал внимание на их IP адрес, а не на другие параметры.
По IP можно отфильтровать и отправляемые пакеты. В примере приведем снова наш IP. То есть сейчас мы отследим, какие пакеты отправляются с нашего компьютера на другие адреса. Для этого нужно выполнить следующую команду:
sudo tcpdump -i ppp0 ip src 10.0.6.67
Пример:
Как можно заметить, в синтаксисе команды мы изменили фильтр dst на src, тем самым сказав машине, чтобы она искала отправителя по IP.
Фильтрация по HOST
По аналогии с IP в команде мы можем указать фильтр host, чтобы отсеять пакеты с интересующим хостом. То есть в синтаксисе вместо IP-адреса отправителя/получателя нужно будет указывать его хост. Выглядит это следующим образом:
sudo tcpdump -i ppp0 dst host google-public-dns-a.google.com
Пример:
На изображении можно увидеть, что в «Терминале» отображаются только те пакеты, которые были отправлены с нашего IP на хост google.com. Как можно понять, вместо хоста google, можно вписать любой другой.
Как и в случае с фильтрацией по IP, в синтаксисе dst можно заменить на src, чтобы увидеть пакеты, которые отправляются на ваш компьютер:
sudo tcpdump -i ppp0 src host google-public-dns-a.google.com
Обратите внимание: фильтр host должен стоять после dst или src, иначе команда выдаст ошибку. В случае с фильтрацией по IP, наоборот, dst и src стоят перед фильтром ip.
Применение фильтра and и or
Если у вас появляется необходимость использовать сразу несколько фильтров в одной команде, то для этого нужно применять фильтр and или or (зависит от случая). Указывая фильтры в синтаксисе и разделяя их этими оператором, вы «заставите» работать их как один. На примере это выглядит следующим образом:
sudo tcpdump -i ppp0 ip dst 95.47.144.254 or ip src 95.47.144.254
Пример:
Из синтаксиса команды видно, что мы хотим вывести на экран «Терминала» все пакеты, которые были отправлены на адрес 95.47.144.254 и пакеты, полученные этим же адресом. Также вы можете изменять некоторые переменные в этом выражении. Например, вместо IP указать HOST или заменить непосредственно сами адреса.
Фильтр port и portrange
Фильтр port отлично подойдет в тех случаях, когда нужно получить информацию о пакетах с определенным портом. Так, если вам нужно увидеть лишь ответы или запросы DNS, нужно указать порт 53:
sudo tcpdump -vv -i ppp0 port 53
Пример:
Если вы хотите просмотреть пакеты http, нужно ввести порт 80:
sudo tcpdump -vv -i ppp0 port 80
Пример:
Помимо прочего, есть возможность отследить сразу диапазон портов. Для этого применяется фильтр portrange:
sudo tcpdump portrange 50-80
Как можно заметить, в связке с фильтром portrange не обязательно указывать дополнительные опции. Достаточно всего лишь задать диапазон.
Фильтрация по протоколам
Вы также можете вывести на экран только тот трафик, который соответствует какому-либо протоколу. Для этого нужно использовать в качестве фильтра наименование этого самого протокола. Разберем на примере udp:
sudo tcpdump -vvv -i ppp0 udp
Пример:
Как можно увидеть на изображении, после выполнения команды в «Терминале» отобразились лишь пакеты с протоколом udp. Соответственно, вы можете осуществить фильтрацию и по другим, например, arp:
sudo tcpdump -vvv -i ppp0 arp
или tcp:
sudo tcpdump -vvv -i ppp0 tcp
Фильтр net
Оператор net помогает отфильтровать пакеты, беря за основу обозначение их сети. Пользоваться им так же просто, как и остальными — нужно в синтаксисе указать атрибут net, после чего вписать адрес сети. Вот пример такой команды:
sudo tcpdump -i ppp0 net 192.168.1.1
Пример:
Фильтрация по размеру пакета
Мы не рассмотрели еще два интересных фильтра: less и greater. Из таблицы с фильтрами мы знаем, что они служат для вывода пакетов данных больше (less) или меньше (greater) размера, указанного после ввода атрибута.
Допустим мы хотим следить лишь за пакетами, которые не превышают отметку в 50 бит, тогда команда будет иметь следующий вид:
sudo tcpdump -i ppp0 less 50
Пример:
Теперь давайте отобразим в «Терминале» пакеты, размер которых больше 50 бит:
sudo tcpdump -i ppp0 greater 50
Пример:
Как можно заметить, применяются они одинаково, разница лишь в названии фильтра.
Заключение
По окончании статьи можно сделать вывод, что команда tcpdump — это отличный инструмент, с помощью которого можно отследить любой передаваемый по интернету пакет данных. Но для этого недостаточно просто ввести саму команду в «Терминал». Добиться желаемого результата получится только в случае, если использовать всевозможные опции и фильтры, а также их комбинации.
Наш Telegram каналТолько полезная информация
Добрый день!
Спасибо за статью. Прошу подсказать по задаче.
Есть linux сервер с NFS в закрытой сети. Общая папка расшарена всем пользователям. В папке хранятся различные документы (pdf, doc, mp4 и т.п.). Необходимо понять, какие документы пользователи открывают (скачивают). Т.е. интересуют все пакеты, в которых идет соответствующий запрос от пользовательских машин.
Для анализа запросов хотел ежедневно дампить пакеты, фильтровать и строить статистику. Проблема в том, что не могу понять, какие именно параметры дампа лучше задавать. Анализ дампа и выгрузку в csv планировал организовать через wireshark, тоже не могу понять, как построить фильтрацию.
По сути, надо, чтобы в csv складывалась информация о машине(с которой пришел запрос на чтение файла), дата+время, название открываемого файла.
Столкнулся с тем, что в пакетах «-s512 -vv» можно найти инфу о запрашиваемых файлах, но туда же валится много лишней информации, размер дампа очень большой, если открывать дамп на чтение текстовым редактором, то имя файла видно, если же открывать его в wireshark, то видно только расширение, а имя не читается, т.к. русская кодировка, конфликт utf-8/win1251.
Что можно придумать для сбора статистики?
Добрый день! Статья замечательная! Но есть одно НО — рисунки не соответствуют поясняемым примерам)