Фильтруй эфир! Проводим аудит сетевого трафика с помощью tcpdump. Tcpdump — полезное руководство с примерами Tcpdump примеры

tcpdump — мощный анализатор командной строки и Libpcap, портативная библиотека для захвата сетевого трафика. Tcpdump выводит описание содержимого пакетов на сетевом интерфейсе, которые соответствуют логическое выражение. Он также может быть запущен с ключом -w, который вызывает его, чтобы сохранить пакетные данные в файл для последующего анализа, и / или с -r флагом, который вызывает его для чтения из сохраненного файла пакета. С помощью этой утилиты можно перехватывать и так же анализировать сетевой трафик который проходит через ПК на котором запущенна данная программа.

Хотелось бы поговорить в данной теме «установка и использование tcpdump» об установке tcpdump, а так же как им пользоваться и для чего он нужен.

С помощью tcpdump можно:

  • Можно делать отладку сетевых приложений.
  • Можно производить отладку сети или сетевого оборудования в целом.

Чтобы установить tcpdump на debian/ubuntu/linux mint нужно выполнить:

# sudo apt-get install tcpdump

Для того чтобы установить tcpdump на RedHat/CentOS/Fedora используйте:

# sudo yum install tcpdump

Для того чтобы установить tcpdump на MacOS используйте.

# brew install tcpdump

Использование tcpdump.

Чтобы проверить работает ли у нас tcpdump можно выполнить команду:

# tcpdump -i eth0 port 80

Существует довольно много ключей для использования самой утилиты tcpdump, приведу список распространенных:

Если нужно узнать какими пакетами обменивается 21 сервера (например your_server_1 и your_server_2), то для этого служит команда:

# tcpdump host your_server_1 and your_server_2

Если нужно отслеживать только исходящие пакеты из хоста, то выполните:

# tcpdump src host your_server

Если нужно отслеживать только входящие пакеты из хоста, то выполните:

# tcpdump dst host your_server

Так же можно прослушивать исходящие или входящие пакеты с сервера и по определенному порту для этого просто добавьте порт который нужно прослушивать (в основном используется 80, 8080).

См. список интерфейсов, по которым tcpdumt можете слушать:

# tcpdump -D

Слушать интерфейс eth0:

# tcpdump -i eth0

Слушать на любом доступном интерфейсе (Требуется ядро Linux версии 2.2 или выше):

# tcpdump -i any

Вывод всего на экран (все что выполняется программой):

# tcpdump -v

Вывод много чего на экран (все что выполняется программой):

# tcpdump -vv

Вывод очень много всего на экран (все что выполняется программой):

# tcpdump -vvv

Выводить не сильно много информации когда идет захват пакетов (не как стандартный):

# tcpdump -q

Ограничить захват пакетов до 100:

# tcpdump -c 100

Записать все данные (перехваченные пакеты) в файл с именем capture.cap:

# tcpdump -w capture.cap

Записать все данные (перехваченные пакеты) в файл с именем capture.cap и вывести на экран в режиме реального времени:

# tcpdump -v -w capture.cap

Вывод пакетов с файла capture.cap:

# tcpdump -r capture.cap

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

# tcpdump -vvv -r capture.cap

Вывод IP и порты вместо доменов идет захват пакетов:

# tcpdump -n

Захват любых пакетов, где хост назначения — 192.138.1.1. Вывод ИП и порты на экран:

# tcpdump -n dst host 192.138.1.1

# tcpdump -n src host 192.138.1.1

Захват любых пакетов c хоста 192.138.1.1. Вывод ИП и порты на экран:

# tcpdump -n host 192.138.1.1

Захват пакетов где сеть 192.138.1.0/24. Вывод ИП и порты на экран:

# tcpdump -n dst net 192.138.1.0/24

# tcpdump -n src net 192.138.1.0/24

Захват пакетов с сети 192.138.1.0/24. Вывод ИП и порты на экран:

# tcpdump -n net 192.138.1.0/24

Захват пакетов с порта 23. Вывод ИП и порты на экран:

# tcpdump -n dst port 23

Захват пакетов с портов 1 по 1023. Вывод ИП и порты на экран:

# tcpdump -n dst portrange 1-1023

Захватывать только TCP пакеты где destination на портах 1 по 1023. Вывод ИП и порты на экран:

# tcpdump -n tcp dst portrange 1-1023

Захватывать только UDP пакеты где destination на портах 1 по 1023. Вывод ИП и порты на экран:

# tcpdump -n udp dst portrange 1-1023

Захват пакетов с destination где ИП 192.138.1.1 и destination порт которого 23. Вывод на экран:

# tcpdump -n "dst host 192.138.1.1 and dst port 23"

Захват пакетов с destination где ИП 192.138.1.1 и destination по портам 80 или 443. Выводим на экран:

# tcpdump -n "dst host 192.138.1.1 and (dst port 80 or dst port 443)"

Захват любых ICMP пакетов:

# tcpdump -v icmp

Захват любых ARP пакетов:

# tcpdump -v arp

Захват любых ICMP или ARP пакетов:

# tcpdump -v "icmp or arp"

Захват любых пакетов которые broadcast или multicast:

# tcpdump -n "broadcast or multicast"

Захват больших пакетов (500 байт) а не стандартных 68б:

# tcpdump -s 500

Захват всех байт данных в пакете:

# tcpdump -s 0

Просмотр «тяжелых пакетов»:

# tcpdump -nnvvXSs 1514

Захват пакетов ICMP с ping и pong:

# tcpdump -nnvXSs 0 -c2 icmp

Вывод без многих вариантов:

# tcpdump -nS

Основные коммуникации (очень подробный режим), можно увидеть хороший объем трафика, с многословием:

# tcpdump -nnvvS

Глубокий взгляд на трафик, добавляет -X для полезной нагрузки:

# tcpdump -nnvvXS

Просмотр тяжелого пакета и увеличивает snaplength, захватывая весь пакет:

# tcpdump -nnvvXSs 1514

Вы можете также фильтровать на основе определенных частей пакета, а также объединить несколько условий в группы. Это полезно при поиске только SYNs или РСТ, например, и последний для еще более расширенный изоляцией трафика.

Показать мне все URGENT (URG) пакеты:

# tcpdump "tcp & 32!=0"

Показать мне всеACKNOWLEDGE (ACK) пакеты:

# tcpdump "tcp & 16!=0"

Показать мне все PUSH (PSH) пакеты:

# tcpdump "tcp & 8!=0"

Показать мне все RESET (RST) пакеты:

# tcpdump "tcp & 4!=0"

Показать мне все SYNCHRONIZE (SYN) пакеты:

# tcpdump "tcp & 2!=0"

Показать мне все FINISH (FIN) пакеты:

# tcpdump "tcp & 1!=0"

Показать мне все SYNCHRONIZE/ACKNOWLEDGE (SYNACK) пакеты:

# tcpdump "tcp=18"

Захват TCP Flags используя tcpflags:

# tcpdump "tcp & & tcp-syn != 0"

Пакеты с RST и SYN флагами (проверка):

# tcpdump "tcp = 6"

Траффик с ‘Evil Bit"(проверка):

# tcpdump "ip & 128 != 0"

На этом я завершу свою статью «установка и использование tcpdump», надеюсь все ясно и понятно.

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

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

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

sudo apt install tcpdum p

В Fedora/Red Hat/CentOS:

sudo 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 с захвата трафика на интерфейсе eth0, у меня это основной интерфейс, который подключен к интернету. Для работы программе необходимы права суперпользователя, поэтому не забудьте указать sudo:

sudo tcpdump -i eth0

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

13:03:41.795599 IP udp032919uds.hawaiiantel.net.6881 > 192.168.1.2.52055 : Flags [.], seq 640160396:640161844, ack 436677393, win 2050, options , length 1448

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

sudo tcpdump -v -i eth0

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

IP (tos 0x0, ttl 64 , id 50309, offset 0, flags , proto TCP (6) , length 64)

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

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

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

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

sudo tcpdump -i eth0 ip dst 192.168.1.2

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

sudo tcpdump -i eth0 dst host google-public-dns-a.google.com

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

sudo tcpdump -i eth0 src host google-public-dns-a.google.com

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

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

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

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

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

sudo tcpdump -vv -i eth0 port 53

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

sudo tcpdump -vv -i eth0 port 80

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

sudo tcpdump portrange 21-23

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

sudo tcpdump -vv arp

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

sudo tcpdump -vv udp

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

sudo tcpdump net 129.168.1.1/24

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

sudo tcpdump less 32

Или больше 128:

tcpdump greater 128

sudo tcpdump -i eth0 -w file.pcap

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

sudo tcpdump -r file.pcap

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

sudo tcpdump -A -i eth0

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

sudo tcpdump -XX -i eth0

Выводы

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

На завершение видео с лекцией о tcpdump:

К оманда tcpdump также называется анализатором пакетов.

Команда tcpdump будет работать на большинстве разновидностей операционной системы UNIX. tcpdump позволяет сохранять захваченные пакеты, так что мы можем использовать захваченный пакет для дальнейшего анализа. Сохраненный файл может быть просмотрен той же командой tcpdump. Мы также можем использовать программное обеспечение с открытым исходным кодом, как Wireshark для чтения файлов tcpdump PCAP.

На этом уроке мы рассмотрим некоторые практические примеры того, как использовать команду tcpdump.

1. Захват пакетов от конкретного интерфейса локальных сетей с использованием tcpdump -i

При выполнении команды tcpdump без какого-либо варианта, он будет захватывать все пакеты, проходящие через все интерфейсы. Опция -i команды tcpdump, позволяет фильтровать по определенному интерфейсу Ethernet.

$ tcpdump -i eth1 12:59:41.967250 ARP, Request who-has free.msk.ispsystem.net tell gw.msk.ispsystem.net, length 46 12:59:41.967257 ARP, Request who-has reserve.scoffserver.ru tell gw.msk.ispsystem.net, length 46 12:59:41..44141 > wdc-ns1.ispsystem.net.domain: 14799+ PTR? 184.48.146.82.in-addr.arpa. (44) ...

В этом примере, tcpdump захватил все пакеты потока в интерфейсе eth1 и отображает в стандартном выводе.

Примечание:

Утилита Editcap используется для выбора или удаления определенных пакетов из файла дампа и перевод их в заданном формате.

2. Захват только N-ое число пакетов с помощью tcpdump -c

При выполнении команды tcpdump дает пакеты, пока вы не отмените команду tcpdump. Используя опцию -c вы можете указать количество пакетов для захвата.

$ tcpdump -c 2 -i eth0 listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 13:01:35.165898 ARP, Request who-has 213.159.211.80 tell gw.msk.ispsystem.net, length 46 13:01:35..35123 > wdc-ns1.ispsystem.net.domain: 7254+ PTR? 80.211.159.213.in-addr.arpa. (45) 2 packets captured 7 packets received by filter 0 packets dropped by kernel

Команда tcpdump захватили только 2 пакета от интерфейса eth0.

Примечание:

Mergecap и TShark: Mergecap представляет собой инструмент объединения свалки пакетов, который будет объединять в себе несколько пакетов в один файл дампа. Tshark является мощным инструментом для захвата сетевых пакетов, которые могут быть использованы для анализа сетевого трафика. Он поставляется с анализатором распределения сети Wireshark.

3. Выод на дисплей перехваченных пакетов в ASCII, используя tcpdump -a

Следующий синтаксис tcpdump печатает пакет в ASCII.

$ tcpdump -A -i eth0 13:03:06.516709 IP 213.132.93.178..vlsi-lm: Flags [.], ack 3120779210, win 254, length 0 E..([email protected]..].....b...%.=...O.P....... 13:03:06..35313 > wdc-ns1.ispsystem.net.domain: 13562+ PTR? 178.93.132.213.in-addr.arpa. (45) E..I9.@[email protected] [фильтры]

В официальной документации (команда man tcpdump) можно найти несколько примеров использования этой утилиты для разных случаев с применением довольно разнообразных и сложных фильтров.

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

Наиболее часто используемые ключи при запуске tcpdump приведены таблице

ключ

описание

Преобразовывает сетевые и широковещательные адреса в доменные имена.

Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров.

Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться.

Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию - eth0, для выбора всех интерфейсов - any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo.

Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:

shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log

Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит ‘net’ вместо ‘net.library.org’

Отображает IP-адрес вместо имени хоста.

Отображает номер порта вместо используемого им протокола.

Не переводит интерфейс в режим приема всех пакетов (promiscuous mode).

Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных.

Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w.

Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number - ISN) в относительные.

Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet).

Не отображает метку времени в каждой строке.

Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb.

Отображает неформатированную метку времени в каждой строке.

Показывает время вместе с датой.

Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)

Вывод ещё более полной информации, в основном касается NFS и SMB.

Вывод максимально подробной информации.

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

Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s

-x , но включает в себя заголовок канального уровня

Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения.

То же, что и предыдущий параметр -X , но включает заголовок канального уровня.

tcpdump завершит работу после получения указанного числа пакетов.

Собранные пакеты будут сразу складываться в файл, а иначе копиться в памяти до тех пор, пока она не закончится

Фильтры tcpdump

Фильтры разделяются на следующие классификации

host — адрес узла сети

port – порт на котором нужно ловить пакеты

portrange – диапазон портов

net – сеть

Tcpdump net 192.168.0.0/24

захват всего трафика в котором в качестве источника или получателя стоят ip адреса из сети 192.168.0.0/24

Tcpdump port 80

Будет захватываться весь трафик на 80-м порту.

Направление трафика по отношению к объекту мониторинга

src – отправитель

dst — получатель

например команда

Src host 172.31.25.200

Захват трафика у которого отправитель ip адрес 172.31.25.200

Протокол

ether – базовая сетевая технология Ethernet, как правило указывает на то что в фильтре используется аппаратный MAC адрес

ip – протокол IPv4

ip6 – протокол IPv6

arp – протокол ARP

tcp – протокол TCP

udp – протокол UDP

Если протокол не указан, то будет захвачен трафик по все протоколам

Например команда

Udp port 5060

захват трафика по протоколу udp порт 5060

Составные фильтры

Для того что бы более гибко фильтровать трафик можно использовать логические операции

«И» – and (&&)

«ИЛИ» – or (||)

«НЕ» – not (!) – инверсия значения

При этом приоритет этих операций следующий:

наивысшим приоритетом обладает операция инверсии

потом логическое «И»

наименьшим приоритетом обладает операция «ИЛИ».

Приоритет операций можно менять с помощью круглых скобок.

(net 172.16.0.0/24 or host 172.31.0.5) and tcp port 80

захват трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5, как любому хосту по отдельности так и вместе

(net 172.16.0.0/24 || host 172.31.0.5) && not tcp port 80

захват любого трафика кроме трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5 как любому хосту по отдельности так и вместе

tcpdump linux примеры

Запись вывода в файл

$ sudo tcpdump -w sshtrace.tcpdump tcp port 22

Файл sshtrace.tcpdump при этом будет по-умолчанию создан в домашнем каталоге текущего пользователя. Для вывода информации из файла myrouter.tcpdump следует использовать опцию -r:

$ tcpdump -r sshtrace.tcpdump

Снять весь трафик с интерфейса eth1

$ tcpdump –i eth1

Снять трафик с диапазона портов на интерфейсе eth1

$ tcpdump -i eth1 portrange 100-200

весь трафик, идущий к 172.16.0.1, который не является ICMP.

Если вам необходимо проанализировать или перехватить сетевые пакеты в 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

После того как утилита будет установлена, ей сразу же можно пользоваться. Об этом и о многом другом будет рассказано дальше по тексту.

Синтаксис

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

Все вышеперечисленные фильтры можно комбинировать между собой, таким образом, в выдаче команды вы будете наблюдать только ту информацию, которую желаете увидеть. Чтобы более детально разобраться в использовании вышеперечисленных фильтров, стоит привести примеры.

Примеры использования

Сейчас будут приведены часто используемые варианты синтаксиса команды 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 , seq 1:595, ack 1118, win 6494, options , length 594

Где цветом выделено:

  • синим - время получения пакета;
  • зеленым - адрес отправителя;
  • фиолетовым - адрес получателя;
  • серым - дополнительная информация о tcp;
  • красным - размер пакета (отображается в байтах).

Этот синтаксис имеет возможность вывода в окне «Терминала» без использования дополнительных опций.

Захват трафика с опцией -v

Как известно из таблицы, опция -v позволяет увеличить количество информации. Разберем на примере. Проверим тот же интерфейс:

sudo tcpdump -v -i ppp0

Здесь можно заметить, что появилась следующая строка в выводе:

IP (tos 0x0, ttl 58 , id 30675, offset 0, flags , 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 - это отличный инструмент, с помощью которого можно отследить любой передаваемый по интернету пакет данных. Но для этого недостаточно просто ввести саму команду в «Терминал» . Добиться желаемого результата получится только в случае, если использовать всевозможные опции и фильтры, а также их комбинации.



Понравилась статья? Поделиться с друзьями: