tcpdump - как пользоваться

  • Михаил
  • 12 мин. на прочтение
  • 164
  • 05 Feb 2015
  • 05 Feb 2023

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

Tcpdump ничем не хуже Wireshark, и имеет все необходимые возможности для анализа пакетов, к тому же вы можете сохранить все перехваченные пакеты в файл, чтобы анализировать их потом с помощью того же самого Wireshark. В этой статье мы рассмотрим как пользоваться tcpdump для перехвата сетевых пакетов.

Установка tcpdump
Во многих дистрибутивах команда tcpdump поставляется по умолчанию, но если в вашем дистрибутиве ее нет, то вы можете очень просто ее установить из официальных репозитория. Например, в Ubuntu/Debian:

sudo apt install tcpdum
или
yum install tcpdump

Когда установка завершится, вы можете переходить к работе.

Команда tcpdump
Перед тем как перейти к примерам работы с утилитой, давайте рассмотрим ее синтаксис и основные опции. Команда имеет такой синтаксис:

$ tcpdump опции -i интерфейс фильтры

При вызове обязательно нужно передать интерфейс, который будете отслеживать. Если интерфейс не указать, то будет использован первый в списке. Опции настраивают отображение и основные возможности утилиты, а фильтры позволяют отсеять ненужные пакеты. А теперь рассмотрим основные опции:

-A - выводить все пакеты в формате ASCII;
-c - закрыть программу после перехвата n-ого количества пакетов;
-C - при записи пакетов в файл, проверять размер файла, и если он больше заданного - создать новый файл;
-D - вывести список доступных сетевых интерфейсов;
-e - выводить информацию уровня соединения для каждого пакета, это может быть полезно, например, для отображения MAC адреса;
-f - выводить доменное имя для ip адресов;
-F - читать пакеты из файла, а не интерфейса;
-G - создавать новый файл лога через указанный промежуток времени;
-H - обнаруживать заголовки 802.11s;
-i - имя интерфейса для перехвата пакетов. Вы можете захватывать пакеты со всех интерфейсов, для этого укажите any;
-I - переключить интерфейс в режим монитора для захвата всех проходящих пакетов;
-j - установить формат Timestamp для записи пакетов;
-J - посмотреть доступные Timestamp;
-K - не проверять контрольные суммы пакетов;
-l - добавить поддержку прокрутки к выводу;
-L - вывести поддерживаемые протоколы подключения для интерфейса;
-n - не отображать доменные имена;
-r - прочитать пакеты из файла, созданного с помощью -w;
-v, -vv, -vvv - более подробный вывод;
-q - выводить минимум информации;
-w - записать вывод в файл;
-Z - пользователь, от имени которого будут создаваться файлы.
Это не все опции, но их вам будет вполне достаточно для решения большинства задач. Чаще мы будем применять фильтры. С помощью фильтров вы можете отсеивать только те типы пакетов, которые хотите видеть. Вы можете фильтровать по ip адресу, протоколу, сети, интерфейсу и многим другим параметрам. Но фильтры tcpdump мы будем рассматривать уже на примерах.

Как пользоваться tcpdump
Перед тем как перейти к использованию tcpdump нужно посмотреть какие сетевые интерфейсы вы можете использовать. Для этого запустите команду с опцией -D:

tcpdump -D

Начнем рассматривать примеры tcpdump с захвата трафика на интерфейсе eth0, у меня это основной интерфейс, который подключен к интернету. Для работы программе необходимы права суперпользователя, поэтому не забудьте указать sudo:

tcpdump -i ens18

Чтобы остановить работу команды нажмите Ctrl+C. В выводе вы сразу же увидите все перехваченные пакеты. Формат записи для каждого пакета будет выглядеть следующим образом:

Такой формат характерен для пакетов данных, в зависимости от протокола выделенный черным текст будет отличаться. Сначала идет временная метка, затем протокол, далее зеленым отмечен ip адрес отправителя, а синим адрес адресата, в данном случае, нашего компьютера. Дальше идут дополнительные параметры tcp и в конце размер пакета в байтах. Подробность вывода информации можно контролировать с помощью опций -v, Например:

tcpdump -v -i ens18

Здесь уже появляется информация о протоколе IP:

Мы можем узнать информацию о времени жизни пакета ttl, версию протокола TCP и длину поля заголовка. Опция -vv будет выводить проверку контрольных сумм пакета и содержимое в некоторых случаях.

После опций вы можете указывать фильтры для пакетов. Вот основные параметры, по которым можно отсеивать пакеты:

  • host - имя хоста;
  • ip - ip адрес;
  • proto - протокол;
  • net - адрес сети или подсети;
  • port - адрес порта;
  • src - параметр, касающийся отправителя;
  • dst - параметр, касающейся получателя;
  • Доступны такие протоколы: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp и udp.

Вы можете все это комбинировать между собой, чтобы получить желаемый результат. Рассмотрим более детально на примерах. Отсеем только пакеты, адресованные нашему компьютеру:

tcpdump -i ens18 ip dst 10.10.11.11

Также мы можем отобрать пакеты, отправляемые на определенный узел:

tcpdump -i ens18 dst host google-public-dns-a.google.com

Как видите, это DNS пакеты и здесь вместо флагов TCP содержится полезная информация, запрос ip адреса хоста. Также вы можете выбрать ответные пакеты от определенного хоста:

tcpdump -i ens18 src host google-public-dns-a.google.com

Здесь нет полного содержимого пакета, если вы хотите его получить нужно использовать опцию -v или -vv:

tcpdump -vv -i ens18 host dst google-public-dns-a.google.com

С помощью оператора and вы можете объединить несколько фильтров в один:

tcpdump -i ens18 dst host google-public-dns-a.google.com and src host google-public-dns-a.google.com

Из операций объедения доступны and и or, также можно применять скобки для обозначения приоритета. Вам необязательно указывать host, во многих случаях достаточно src или dst, утилита сама поймет что имелось в виду. Точно такую же конструкцию можно использовать для портов. Например, мы можем отсеять все запросы или ответы к DNS (на порт 53):

tcpdump -vv -i ens18 port 53

Точно такое же можно провернуть для http (порт 80):

tcpdump -vv -i ens18 port 80

Естественно, тут тоже можно применять dst и src для более конкретных результатов. Вы можете фильтровать не один порт, а целый диапазон портов:

tcpdump -i ens18  portrange 21-23

Если указать один из протоколов, вы отфильтруете только пакеты этого протокола, например tcp, udp или arp:

tcpdump -i ens18 -vv arp

Точно также можно выбрать все udp пакеты:

tcpdump -i ens18 -vv udp

Также доступен фильтр по обозначению сети:

tcpdump -i ens18 net 10.10.11.1/24

Кроме того, вы можете фильтровать пакеты по их размеру, например, меньше 32 байт:

tcpdump -i ens18 less 32

Или больше 128:

tcpdump -i ens18 greater 128

Иногда бывает необходимо сохранить захваченный трафик в файл, для этого используется опция -w:

tcpdump -i ens18 -w file.pcap

Этот файл можно открыть с помощью любой программы для чтения таких файлов, например, Wireshark. Чтобы открыть сохраненные в файл пакеты используйте опцию -r:

tcpdump -i ens18 -r file.pcap

Остался еще один момент, на который стоит обратить внимание. Это формат отображения содержимого пакетов. Вы можете вывести содержимое пакета в формате ASCII используйте опцию -A:

tcpdump -A -i ens18 

Также вы можете отобразить содержимое в формате HEX и ASCII для этого используйте -XX:

tcpdump -XX -i ens18

Мы рассмотрели как пользоваться tcpdump. Это очень мощный сетевой анализатор, который работает только через командную строку.