Примеры tcpdump в Linux. Установка и использование tcpdump Tcpdump linux примеры

Примеры tcpdump в Linux. Установка и использование tcpdump Tcpdump linux примеры
Примеры tcpdump в Linux. Установка и использование tcpdump Tcpdump linux примеры

Для UNIX-систем есть множество самых разнообразных снифферов и анализаторов трафика с удобным графическим интерфейсом и богатым набором функций. Но ни один из них не может сравниться в гибкости, универсальности и распространенности со старым как мир tcpdump. Эта утилита входит в состав многих дистрибутивов Linux и всех BSD-систем из коробки и сможет выручить тебя, когда другие средства будут недоступны.

Введение

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

Tcpdump появился на свет почти 25 лет назад в университете Беркли, до сих пор активно развивается и продолжает оставаться эталоном среди подобных инструментов для операционной системы UNIX. Разработанная специально для него библиотека захвата пакетов libpcap сегодня используется чуть ли не каждым сниффером для UNIX-систем и многими аналогичными программами для Windows.

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

Наедине с консолью

Попробуем разобраться, как работает tcpdump и с какой стороны следует к нему подходить. Открой терминал и запусти программу с правами пользователя root (как и любой сниффер, tcpdump должен иметь полный доступ к сетевым интерфейсам), указав имя сетевого интерфейса и ограничив количество выводимых пакетов десятью:

# tcpdump -i wlan0 -c 10 -n

Ключ -n отключает преобразование IP-адресов в DNS-имена. Теперь попытаемся отследить обмен только с конкретным хостом, например с домашним роутером:

# tcpdump -i wlan0 -c 10 -n host 192.168.0.1 and port 53

Давай посмотрим, что же нам вывел tcpdump, на примере двух строк, представленных на скриншоте «DNS-запрос глазами tcpdump». Можно легко понять, что это DNS-запрос (порт 53) с хоста 192.168.0.101 хосту 192.168.0.1 и последующий за ним ответ. Но что значат все остальные цифры и знаки?


Цифры 16:22:41.340105 - это время отправки пакета, включая миллионные доли секунды (так называемый frac). Две буквы IP, как нетрудно догадаться, идентифицируют используемый протокол сетевого уровня, далее следуют адрес: порт отправки и адрес: порт назначения пакета. Все, что идет после двоеточия, напрямую зависит от используемого протокола транспортного или прикладного уровня. С некоторыми протоколами tcpdump знаком и умеет расшифровывать их до понятного человеку вида, другие он оставляет как есть и просто приводит содержимое пакета. В данном случае tcpdump расшифровал DNS-сообщения и вернул строку 49244+ A? ya.ru. (23) , что означает: был послан запрос (A?) адреса, ассоциированного с именем ya.ru., общая длина пакета за вычетом TCP/IP-заголовков составила 23 байт. Первая цифра - это идентификатор запроса.

В следующей строке мы видим ответ, формат представления которого практически аналогичен запросу, с той лишь разницей, что теперь после идентификатора запроса идет информация о количестве найденных записей (8/2/3) и сами записи (A 213.180.204.3, A 77.88.21.3, A 87.250.250.3...).

В арсенале tcpdump есть поддержка многих протоколов, благодаря чему он может представить в читаемом виде информацию о протоколах TCP, UDP и ICMP, SMB/CIFS, NFS, AFS, AppleTalk. Но что, если tcpdump ничего не знает об используемом протоколе прикладного уровня или не может определить его? В обычной ситуации он просто выведет информацию о пакете. Она может выглядеть примерно так:

Flags [.], seq 3666073194:3666074622, ack 3281095139, win 2000, options , length 1428

Это TCP-пакет, формат представления информации о котором в tcpdump следующий (поля разделяются запятыми):

  • flags - установленные флаги. Обозначаются символами S (SYN), F (FIN), P (PUSH) и R (RST), точка означает отсутствие установленных флагов;
  • data-seqno - описывает данные, содержащиеся в пакете, в таком формате: first:last, где first и last - номер последовательности первого и последнего байта передаваемых данных, nbytes;
  • ack - следующий номер последовательности (ISN + 1);
  • window - размер окна;
  • options - здесь могут указываться дополнительные сведения, например (максимальный размер сегмента);
  • length - длина пакета.

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

# tcpdump -i wlan0 -c 10 -n -X host 192.168.0.1 and port 80

Эту функцию очень удобно использовать для анализа протоколов, в которых передача данных идет открытым текстом, например HTTP. Для бинарных протоколов и протоколов с шифрованием она, конечно же, будет бесполезна.
Кроме того, для получения дополнительных сведений о пакете можно использовать флаг -v. Тогда после IP в скобках появится подробная информация об IP-пакете:

(tos 0x0, ttl 64, id 8339, offset 0, flags , proto UDP (17), length 51)

В общем-то, здесь все довольно прозаично. Вначале идет тип обслуживания (TOS), далее время жизни пакета (TTL), идентификатор пакета, смещение от начала первого пакета в цепочке, флаги, используемый прокол транспортного уровня (TCP, UDP, ICMP) и длина.


Продвинутые возможности

Мы уже рассмотрели большинство самых важных возможностей tcpdump, но его функциональность намного шире. Например, мы использовали операторы host и port для указания нужных нам адреса и порта для фильтрации вывода, но что, если нам надо увидеть только пакеты, идущие к указанному адресу, но не исходящие с него? Для этого можно использовать оператор src:

# tcpdump -i wlan0 -c 10 -n src 192.168.0.1

Есть и его обратный вариант dst, предназначенный для указания адреса назначения. Как было показано выше, все операторы можно комбинировать с помощью оператора and (мониторинг сетевого трафика, исключая SSH-сессии и DNS-запросы):

# tcpdump -i wlan0 port not 22 and port not 53

Также можно использовать or (или) и except (не). Кроме того, tcpdump понимает диапазоны портов:

# tcpdump -i wlan0 -c 10 -n portrange 21-23

Умеет отфильтровывать пакеты по их размеру:

# tcpdump -i wlan0 -c 10 -n > 32 and <= 128

И понимает маски подсетей:

# tcpdump -i wlan0 c 10 -n src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

Одна из самых интересных возможностей tcpdump - это умение фильтровать пакеты по содержанию конкретных битов или байтов в заголовках протоколов. Для этого используется такой формат: proto, где proto - протокол, expr - смещение в байтах от начала заголовка пакета, а size - необязательное поле, указывающее на длину рассматриваемых данных (по умолчанию 1 байт). Например, чтобы отфильтровать только пакеты с установленным флагом SYN (инициация TCP-рукопожатия), следует использовать такую запись:

# tcpdump "tcp==2"

Как это работает? Очень просто. 13 байт TCP-заголовка содержит флаги, ровно восемь штук, по биту на каждый. Под флаг SYN отведен второй бит. Приведенная запись просто проверяет факт установки этого бита. Кстати, более читаемый вид этой записи будет выглядеть так:

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

Практическое использование

Утилиту tcpdump принято использовать для двух целей: для отладки сети, сетевых приложений и новых протоколов и для обучения основам TCP/IP. Мы пойдем другим путем и воспользуемся возможностями tcpdump для выявления фактов сканирования хоста и проведения сетевых атак.

На рис. 1 показано, как выглядит классический TCP-скан портов, выполненный утилитой Nmap, в логах tcpdump. Хорошо видно, как Nmap с адреса 192.168.0.100 пытается установить TCP-соединение с разными портами, посылая SYN-пакет (S в поле флагов). Сначала идет проба порта 8888, в ответ приходит RST-пакет, а это значит, что порт не прослушивается ни одним сервисом, далее проба порта 587 с тем же результатом. Наконец, Nmap посылает SYN-пакет на 22-й порт (SSH) и получает ответ в виде пакета SYN-ACK:

192.168.0.100.43337 > 192.168.0.111.22: Flags [S], seq 2610024277, ... 192.168.0.111.22 > 192.168.0.100.43337: Flags , seq 3496707239, ack 2610024278, ... 192.168.0.100.43337 > 192.168.0.111.22: Flags [.], ack 1, ...

Порт открыт, и теперь Nmap может успешно закрыть соединение с помощью отправки RST-пакета и перейти к следующим портам. Однако он поступает умнее: посылает подтверждение приема ACK-пакета и сразу переходит к следующим портам. Такое поведение позволяет обойти некоторые системы обнаружения вторжений, но человека, вооруженного сниффером, так просто не проведешь.

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



Теперь рассмотрим другой метод обнаружения открытых портов - SYN-сканирование (nmap -sS). Такой вид скана принято называть скрытым, потому что во время его никогда не устанавливается полное TCP-соединение, а значит, информация о факте соединения не попадает в логи. Вывод tcpdump для такого вида скана представлен на рис. 2. Он очень похож на лог обычного TCP-сканирования, однако реакция сканера на открытые порты теперь другая:

192.168.0.100.48585 > 192.168.0.111.22: Flags [S], seq 1679394613, ... 192.168.0.111.22 > 192.168.0.100.48585: Flags , seq 625029896, ack 1679394614, ... 192.168.0.100.48585 > 192.168.0.111.22: Flags [R], seq 1679394614, ...

Видно, что после получения одобрительного пакета SYN-ACK сканер не завершает установку соединения, а сразу обрывает его, уходя от попадания в логи. На рис. 3 можно видеть результат UDP-сканирования. Здесь все очень просто, Nmap перебирает порты с возможными UDP-сервисами, посылая на каждый из них пакет нулевой длины. Если порт закрыт, ОС посылает в ответ сообщение ICMP unreachable:

16:41:48.798310 IP 192.168.0.100.61020 > 192.168.0.111.18869: UDP, length 0 16:41:48.798346 IP 192.168.0.111 > 192.168.0.100: ICMP 192.168.0.100 udp port 18869 unreachable, length 36

В противном случае порт считается открытым. Еще один метод сканирования: null-сканирование с помощью отправки пакетов, не содержащих ни одного установленного флага (nmap -sN). Реакция на такие пакеты может быть разной в зависимости от используемой ОС, но, как видно по следующему листингу, Linux отвечает на них посылкой RST-пакетов:

192.168.0.100.39132 > 192.168.0.111.256: Flags , win 3072, length 0 192.168.0.111.256 > 192.168.0.100.39132: Flags , ...

Также атакующий может применять Xmas-сканирование, при котором пакеты имеют установленные флаги FIN, URG и PUSH (пакет как бы светится флагами, как новогодняя елка):

192.168.0.100.35331 > 192.168.0.111.5544: Flags , seq 3998959601, win 4096, urg 0, length 0 192.168.0.111.5544 > 192.168.0.100.35331: Flags , seq 0, ack 3998959602

Как видно, реакция на такие пакеты идентичная. ACK-сканирование (-sA) будет выглядеть в логах tcpdump как отправка множества пакетов с установленным флагом ACK и ответ на них в виде посылки пакетов RST. Однако, если в системе установлен брандмауэр, ответных сообщений приходить не будет, и Nmap сможет понять, фильтруется ли порт.

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

16:43:06.008305 IP 192.168.0.100 > 192.168.0.111: ICMP type-#68, length 1032 16:43:06.008383 IP 192.168.0.100 > 192.168.0.111: ICMP type-#34, length 1032 16:43:06.008714 IP 192.168.0.100 > 192.168.0.111: ICMP type-#183, length 1032 16:43:06.008831 IP 192.168.0.100 > 192.168.0.111: ICMP type-#192, length 1032

Особую важность здесь имеет поле, содержащее время приема пакета. Ни одно нормальное приложение не будет слать множество ICMP-сообщений за промежуток времени, равный одной тысячной секунды. Другие виды флуда (например, SYN) определяются точно таким же образом.

Взаимодействие с другими программами

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

$ ssh [email protected] tcpdump -w - "port !22" | wireshark -k -i -

Здесь мы использовали опцию -w - для записи дампа в стандартный вывод и перенаправили его wireshark, работающему на локальной машине. Таким же образом можно проанализировать трафик с помощью snort:

$ ssh [email protected] "tcpdump -nn -i eth1 -w -" | snort -c /etc/snort/snort.conf -r -

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

# tcpdump -nnvv -r dump.cap tcp | grep -v "tcp sum ok" | wc –l

Админские штучки

Возможность фильтрации пакетов по данным, содержащимся в заголовке, которую мы рассмотрели в начале первого раздела, очень удобно использовать для отладки различных протоколов и поиска сетевых проблем. Например, мы можем применить ее для отлова сетевых пакетов, передаваемых по протоколу Cisco Discovery Protocol, по которому маршрутизаторы Cisco обмениваются информацией о топологии и состоянии сети:

# tcpdump -nn -v -i eth0 -s 1500 -c 1 "ether == 0?2000"

Таким же образом можно отловить все пакеты, передаваемые по протоколу DHCP (DISCOVER, REQUEST, INFORM), чтобы выявить проблемы подключения клиентов:

# tcpdump -i eth0 -vvv -s 1500 "((port 67 or port 68) and (udp = 0x1))"

Или поймать пакеты, передаваемые в рамках POP3-аутентификации:

# tcpdump -i eth0 "tcp port pop3 and ip = 85 and ip = 83" -s 1500 -n

Сетевой grep

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

Например, чтобы найти параметры, передаваемые методами GET и POST в рамках HTTP-сессии, можно использовать следующую команду:

# ngrep -l -q -d eth0 "^GET |^POST " tcp and port 80

Выявляем бездельников:

# ngrep -i "game*|p0rn|adult" -W byline -d eth0 > slackers.txt

Анализируем SMTP-трафик на всех сетевых интерфейсах:

# ngrep -i "rcpt to|mail from" tcp port smtp

Опции tcpdump

Таблица наиболее интересных и полезных флагов tcpdump.

  • -i [интерфейс] - прослушиваемый сетевой интерфейс, для всех следует указать any.
  • -n - не преобразовывать IP-адреса в DNS-имена.
  • -nn - не преобразовывать IP-адреса и номера портов.
  • -X - показывать содержимое пакета в текстовом и шестнадцатеричном форматах.
  • -XX - то же самое плюс содержимое Ethernet-фрейма.
  • -v, -vv, -vvv - увеличить количество показываемой информации и пакетов (больше, еще больше, все).
  • -c [n] - показывать только первые n пакетов.
  • -s [n] - количество байтов, отображаемых для каждого пакета (можно уменьшить для удобства чтения или увеличить для получения большей информации).
  • -S - показывать абсолютные номера TCP-последовательности (TCP sequence numbers).
  • -e - показывать заголовки Ethernet-фреймов.
  • -q - показывать меньше информации (для удобства чтения).
  • -E - расшифровать IPsec-трафик с помощью указанного ключа.
  • -w - сохранить дамп программы в файл, аргумент - используется для указания stdout.

Выводы

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

Поэтому решил создать свою шпаргалку, чтобы было... Ибо без tcpdump не один админ - неадмин

Введение

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

В зависимости от используемого сетевого оборудования для соединения компьютеров в сети Ethernet существуют следующие возможности прослушивания трафика :

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

Итак, утилита tcpdump входит в большинство дистрибутивов Unix и позволяет перехватывать и отображать/сохранять в файл сетевой трафик. Утилита использует библиотеку libpcap . Для Windows тоже существует порт . Для работы утилиты ее необходимо . Например, в Debian она устанавливается с помощью команды:

Debian:~# apt-get install tcpdump

Для работы утилиты необходимы (т.к. изменяются настройки сетевого интерфейса - переводится в "безпорядочный" режим). В общем случае формат команды tcpdump имеет следующий вид:

Debian:~# tcpdump <опции> <фильтр>

Опции утилиты tcpdump

-i интерфейс

Задает интерфейс, с которого необходимо анализировать трафик (без указания интерфейса - анализ "первого попавшегося").

Отключает преобразование IP в доменные имена. Если указано -nn, то запрещается преобразование номеров портов в название протокола.

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

dst хост

Проверяет, совпадает ли адрес получателя IP-пакета с указанным значением. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

src хост

Проверяет, совпадает ли адрес отправителя IP пакета с указанным значением. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

host хост

Проверяет, совпадает ли адрес отправителя или получателя с заданным значением. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

net имя_сети

Проверяется, находится ли адрес отправителя/получателя в заданной сети. Возможно указание сети в формате CIDR (например 10.0.0.1/22), либо указание имени сети, заданной в .

ip | arp | rarp | tcp | udp | icmp [хост]

Проверяет, принадлежит ли пакет одному из указанных протоколов и при указании адреса хоста проверяет, совпадает ли адрес отправителя\получателя с заданным. Возможно задавать как IP, подсеть в формате 10.0.0.1/24, так и имя хоста.

dst port номер_порта

Проверяется, принадлежит ли пакет протоколу TCP/UDP и равен ли порт назначения заданному. Можно указать номер порта, либо имя, заданное в файле /etc/services.

src port номер_порта

Проверяется, принадлежит ли пакет протоколу TCP/UDP и равен ли порт источника заданному. Можно указать номер порта, либо имя, заданное в файле /etc/services.

port номер_порта

Проверяется, принадлежит ли пакет протоколу TCP/UDP и равен ли порт назначения или источника заданному. Можно указать номер порта, либо имя, заданное в файле /etc/services.

ip broadcast

Проверяется, является ли IP пакет широковещательным.

ether { src | dst | host } MAC_адрес

Проверяется, принадлежит ли сетевой пакет источнику, назначению, источнику или назначению имеющему заданный MAC_адрес.

ether broadcast

Проверяется, является ли ARP-пакет широковещательным.

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

Анализ трафика на сетевом уровне (ARP, ICMP) с помощью tcpdump

Предположим, у нас имеется 2 хоста. Хост 1 с интерфейсом eth0 и следующими параметрами:

Host1:~# ip addr show dev eth0 5: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff inet 192.168.56.1/24 brd 192.168.56.255 scope global eth0 inet6 fe80::800:27ff:fe00:0/64 scope link valid_lft forever preferred_lft forever

А так же хост2 с интерфейсом eth1

Host2:~# ip addr show dev eth1 3: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:fd:e5:aa brd ff:ff:ff:ff:ff:ff inet 192.168.56.33/24 scope global eth1 inet6 fe80::a00:27ff:fefd:e5aa/64 scope link valid_lft forever preferred_lft forever

Предположим, что до текущего момента сетевого обмена данными между хостами не происходило и если на хосте 2 запустить команду ip neigh show, то будет видно что в ARP-таблице нет записей. Проведем маленький эксперимент. Запустим на одном из виртуальных интерфейсов host1 утилиту tcpdump:

Host1:~# tcpdump -ne -i eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

Host1:~# ping -c 1 192.168.56.33 PING 192.168.56.33 (192.168.56.33) 56(84) bytes of data. 64 bytes from 192.168.56.33: icmp_req=1 ttl=64 time=1.06 ms --- 192.168.56.33 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.067/1.067/1.067/0.000 ms

После этого в ARP-таблице системы host1 появилась запись об IP-адресе машины host2:

Host1:~# ip neigh show dev eth0 192.168.56.33 lladdr 01:00:27:77:e5:00 HOST2

На виртуальной консоли tcpdump нам отобразил следующую информацию:

Host1:~# tcpdump -ne -i eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:16:29.465780 0a:00:27:00:00:00 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.56.33 tell 192.168.56.1, length 28 12:16:29.466786 01:00:27:77:e5:00 > 0a:00:27:00:00:00, ethertype ARP (0x0806), length 42: Reply 192.168.56.33 is-at 01:00:27:77:e5:00, length 28 12:16:29.466815 0a:00:27:00:00:00 > 01:00:27:77:e5:00, ethertype IPv4 (0x0800), length 98: 192.168.56.1 > 192.168.56.33: ICMP echo request, id 5284, seq 1, length 64 12:16:29.467934 01:00:27:77:e5:00 > 0a:00:27:00:00:00, ethertype IPv4 (0x0800), length 98: 192.168.56.33 > 192.168.56.1: ICMP echo reply, id 5284, seq 1, length 64 ^C 4 packets captured 4 packets received by filter 0 packets dropped by kernel

Каждая запись о сетевом пакете в таком формате содержит время перехвата пакета, MAC-адреса отправителя и получателя, тип протокола, длину пакета и сведения о содержимом пакета. Первая запись описывает широковещательный ARP-запрос с MAC-адреса интерфейса eth0 системы host1 ("У кого адрес 192.168.56.33, это говорит 192.168.56.1 "). Вторая запись - ответ с MAC-адреса машины host2 на MAC-адрес системы host1 ("192.168.56.33 имеет MAC-адрес 01:00:27:77:e5:00 "). Третья и четвертая записи (ICMP-запрос и ICMP-ответ ) являются результатом работы команды ping на системе host1. Далее работа tcpdump была прервана . Перед завершением работы tcpdump печатает статистику работы: количество перехваченных, полученных фильтром и отброшенных ядром пакетов

Таким образом, система host1 для того, чтобы отправить стандартный эхо-запрос машине host2, предварительно по протоколу ARP получила MAC-адреса машины host2 и внесла его с привязкой к IP-адресу в свою ARP-таблицу.

Анализ трафика на транспортном уровне (TCP, UDP) с помощью tcpdump

Предположим на системе host2 установлен некий WEB-сервер. Попробуем на машине host1 открыть страницу с этого web-сервера с помощью консольного браузера lynx:

Host1:~# lynx 192.168.56.33

На другой консоли предварительно запустим tcpdump с фильтрующими параметрами:

Host1:~# tcpdump -n -i eth0 host 192.168.56.33 and port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 15:44:37.837393 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [S], seq 1209026235, win 5840, options , length 0 15:44:37.838118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 370041518, ack 1209026236, win 5792, options , length 0 15:44:37.838157 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 1, win 46, options , length 0 15:44:37.839254 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 1:222, ack 1, win 46, options , length 221 15:44:37.839921 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 222, win 1716, options , length 0 15:44:37.848118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 1:446, ack 222, win 1716, options , length 445 15:44:37.848156 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 446, win 54, options , length 0 15:44:37.849738 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 446, ack 222, win 1716, options , length 0 15:44:37.850366 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 222, ack 447, win 54, options , length 0 15:44:37.851267 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 223, win 1716, options , length 0 …

В данном примере клиент (192.168.56.1) c TCP-порта 41533 устанавливает соединение с сервером (192.168.56.33), слушающим на порту 80, делает запрос, получает необходимые данные и соединение завершается.

Заголовок TCP-сегмента, помимо номеров портов получателя и отправителя содержит ряд параметров:

  • Номер последовательности (seq). Определяет порядок следования байт в отправляемом в сеть потоке (смещение первого байта в сегменте относительно начала потока данных).
  • Подтвержденный номер (ACK). Максимальный номер байта в полученном сегменте увеличенный на 1. Отправляемые отправителю подтверждения одновременно служат запросом новой порции данных.
  • Управляющие флаги (SYN - S, ACK, FIN -F , RST - R , PSH - P, URG)
  • Окно (win) - количество байтов данных, ожидаемых отправителем данного, начиная с байта номер которого указан в поле ack. Для оптимизации передачи отправитель не ждет подтверждения для каждого отправленного сегмента, а может отправить в сеть группу сегменту (но в байтах не больше размера окна). Если качество канала плохое (много запросов на повторную передачу, теряются подтверждения) окно уменьшается, если хорошее - окно увеличивается.
  • Опции . Используются для решения вспомогательных задач. Например, передается MSS (Maximum segment size) - максимальный размер сегмента.

Процесс установления двунаправленного соединения по протоколу TCP отражают первые три записи tcpdump:

  • Клиент отправляет серверу TCP-сегмент с установленным флагом SYN, начальным "случайным" номером (1209026235), с которого будут нумероваться байты в отправляемом им потоке, максимальный размер окна - объем, который разрешено передавать серверу без подтверждения от клиента (5840): 15:44:37.837393 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [S], seq 1209026235, win 5840, options , length
  • Сервер отправляет клиенту TCP-сегмент с установленными флагами SYN и ACK, начальным "случайным" номером (370041518), с которого будут нумероваться байты в отправляемом им потоке, и максимальный размер окна для клиента (5792). Данный сегмент также является подтверждением получения запроса на установление соединения от клиента: 15:44:37.838118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 370041518, ack 1209026236, win 5792, options , length
  • Клиент отправляет серверу TCP-сегмент с установленным флагом ACK, который является подтверждением получения сегмента от сервера (далее tcpdump отображает относительные значения seq и ask): 15:44:37.838157 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 1, win 46, options , length

После этого соединение считается установленным .

В следующей паре записей клиент передает в секции данных сегмента серверу запрос протокола прикладного уровня (221 байт) и получает от сервера подтверждение его получения:

15:44:37.839254 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 1:222, ack 1, win 46, options , length 221 15:44:37.839921 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 222, win 1716, options , length 0

При этом флаг PSH (P) используется для оповещения отправляющей стороны о том, что принимающая готова принимать данные. Далее сервер отправляет данные клиенту (445 байт) и получает от него подтверждение получения:

15:44:37.848118 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 1:446, ack 222, win 1716, options , length 445 15:44:37.848156 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags [.], ack 446, win 54, options , length 0

Затем по инициативе сервера соединение завершается. Сервер шлет пакет с установленным флагом FIN:

15:44:37.849738 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags , seq 446, ack 222, win 1716, options , length 0

Клиент в ответ также отправляет пакет с установленным флагом FIN, данный пакет одновременно является подтверждением получения запроса на завершение соединения от сервера:

15:44:37.850366 IP 192.168.56.1.41533 > 192.168.56.33.80: Flags , seq 222, ack 447, win 54, options , length 0

Серверу остается лишь подтвердить получение FIN-сегмента от клиента:

15:44:37.851267 IP 192.168.56.33.80 > 192.168.56.1.41533: Flags [.], ack 223, win 1716, options , length 0

Реакция tcpdump на попытку подключения к закрытому порту 23/tcp:

21:56:14.381091 IP 192.168.56.1.54040 > 192.168.56.33.23: Flags [S], seq 2956835311, win 5840, options , length 0 21:56:14.381688 IP 192.168.56.33.23 > 192.168.56.1.54040: Flags , seq 0, ack 2956835312, win 0, length 0

В данном примере с системы 192.168.56.1 делается попытка подключится к несуществующему TCP-сервису на узле 192.168.56.33. Удаленная система реагирует отправкой сегмента с установленным флагом RST (сброса соединения).

Реакция tcpdump на отправку UDP-датаграммы на закрытый порт 53/udp:

21:55:16.925906 IP 192.168.56.1.41979 > 192.168.56.33.53: 6561+ A? www.tut.by. (28) 21:55:16.926615 IP 192.168.56.33 > 192.168.56.1: ICMP 192.168.56.33 udp port 53 unreachable, length 64

В данном примере сделана попытка отправить UDP-датаграмму на несуществующий порт удаленной системы. Протокол UDP обычно реагирует отправкой ICMP-сообщения исходному узлу о недостижимости порта.

Другие примеры использования команды tcpdump:

# tcpdump -n -i ppp0 ether src 11:20:b3:d8:d8:2c

Вывод сетевой статистики с интерфейса ppp0 (-i ppp0) без преобразования IP в DNS (-n) тех фреймов, у которых MAC-адресом источника равен 11:20:b3:d8:d8:2c.

# tcpdump -n -e -i vlan0 ether broadcast

Вывод широковещательного трафика с интерфейса vlan0.

# tcpdump -n -i eth0 src 192.168.66.1

Фильтруются сетевые пакеты, в заголовке которых в поле источник указан IP-адрес192.168.66.1.

# tcpdump -n -i eth0 host 192.168.66.1

Фильтруются пакеты, в которых данный IP-адрес указан как источник или как получатель пакета.

# tcpdump -n -i eth0 src net 10.0.0.0 mask 255.0.0.0

Фильтруются пакеты, в которых источником указаны узлы сети 10.0.0.0/8.

# tcpdump -n -i eth0 icmp

Вывод только ICMP-пакетов с интерфейса eth0.

На этом, пожалуй, закончу текущую статью. По мере появления новых примеров буду дополнять статью. Надеюсь, что материал будет полезен не только мне

В статье были использованы примеры и некоторые материалы лекций intuit .

С Уважением, Mc.Sim!

Если вам необходимо проанализировать или перехватить сетевые пакеты в 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 - это отличный инструмент, с помощью которого можно отследить любой передаваемый по интернету пакет данных. Но для этого недостаточно просто ввести саму команду в «Терминал» . Добиться желаемого результата получится только в случае, если использовать всевозможные опции и фильтры, а также их комбинации.

Tcpdump чрезвычайно удобный сетевой анализатор, очень помогающий в работе как сетевым администраторам, так и безопасникам. Естественно что для получения максимальной информации при работе с tcpdump, просто необходимо иметь представления о стеке протоколов TCP/IP. Для удобства можно использовать более удобные и интеллектуальные программы, например , но часто возникают ситуации когда на тестируемую машину не представляется возможным установить дополнительные сервисы, и тогда tcpdump просто незаменим, не будит же админ, ради анализа пакетов, ставить на unix’овый сервак X-Windows тем более что в большинстве unix’овых систем, утилита tcpdump идет по умолчанию.

Понимание протокола TCP/IP дает широкое пространство для использование анализатора и устранения неисправностей и неполадок в работе сети, за счет разбора пакетов. Поскольку оптимальное использование данной утилиты требует хорошего понимания сетевых протоколов и их работы, то получается забавная ситуация, в которой инженеру в любом случае необходимо знать и понимать механизмы передачи данных в сети. т.ч. tcpdump полезна во все отношениях: как устранения неисправностей, так и самообразования.

Ниже приводятся несколько опций, которые помогут наиболее полно и подробно использовать эту утилиту, тем более что все эти опочки и ключики довольно легко забываются, и данные примеры весьма полезны, для освежевания памяти.

Первый используемый ключик -n который запрещает попытки преобразования адресов в доменные имена, тем самым выдавая нам чистые IP адреса с портами.

Второй это -X который задает для каждого пакета вывод как hex (шестнадцатеричная система) так и ASCII содержимого пакета.
И последняя опция это -S которая заменяет вывод относительной TCP нумерации, на абсолютную. Смысл в том, что при относительной нумерации некоторые проблемы могут скрыться от вашего внимания.

Нужно понимать, что основное преимущество tcpdump перед другими утилитами заключается в том, что в ней возможен подробный и ручной разбор пакетов. Также нужно помнить что по умолчанию tcpdump использует только первые 68 байт пакета, т.ч. если необходимо видеть больше, то следует использовать ключ -s number , где number количество байт которые следует захватить. В случае задания number 0 , произойдет полный захват пакета, поэтому лучше использовать значение 1514, что даст полный захват стандартного, для сетей Ethernet, пакета.

Список наиболее часто используемых ключей:
-c: задается проверка размера файла захвата перед каждой очередной записью захваченного пакета, если размер больше, то файл сохраняется и запись идет в новый файл
-e: выводится ethernet заголовок (канальный уровень) в каждой строке дампа
-i any: прослушивание всех интерфейсов, на случай если вам необходим весь трафик.
-n: запрещает преобразование адресов в доменные или символьные имена
-nn: запрещает преобразование адресов и портов в доменные или символьные имена
-q: Красткий вывод информации, за счет уменьшения вывода информации о протоколе.
-X: выводит как hex так и ASCII содержимое пакета
-v, -vv, -vvv: задает вывод дополнительной информации о захваченных пакетах, что дает возможность более широкого анализа.
Несколько примеров для использования:

# Стандартный вывод пакетов
tcpdump -nS
# Расширенный стандартный вывод
tcpdump -nnvvS
# Глубокий разбор пакета
tcpdump -nnvvXS
# Наиболее подробная информация о трафике
tcpdump -nnvvXSs 1514

Выражения позволяют производить более целевое сканирование и задавать типы трафика. Умение использовать выражения делает tcpdump весьма продуктивным инструментом, в рукам сисадмина. Существует три основных типа выражений: type, dir, and proto.
Опции выражжения type бывают host, net и port.
Для выражения направления задаваемого dir существующие опции src, dst, src or dst, и src and dst.
Несколько стандартных выражений:

host // анализ трафика на основе IP адреса (также работает с символьными именами, если не задано -n)
tcpdump host 1.2.3.4

src, dst // анализ трафика только для определенного назначения или передатчика
tcpdump src 2.3.4.5
tcpdump dst 3.4.5.6

net // захват трафика принадлежащего определенной сети
tcpdump net 1.2.3.0/24

proto // работает с tcp, udp, и icmp. Нужно помнить что proto не упоминается
tcpdump icmp

port // анализ трафика с определенного порта (входящего или исходящего)
tcpdump port 3389

src, dst port // фильтр базируется на входящем или исходящем порту
tcpdump src port 1025
tcpdump dst port 3389

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

AND
and or &&
OR
or or ||
EXCEPT
not or !

TCP трафик с ресурса 10.15.123.33 с портом назвачения 3379:

# tcpdump -nnvvS tcp and src 10.15.123.33 and dst port 3379

Трафик переходящий из сети 192.168 с назначением на сети 10 или 172.16:

# tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

Non-ICMP трафик с точкой назначения 192.168.0.2 и из сети 172.16:

# tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net 172.16.0.0/16 and not icmp

Трафик с хостов Eros or Ares , но не идущий на стандартный SSH порт (для данного выражения требуется разрешение имен):

# tcpdump -vv src eros or ares and not dst port 22

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

Также следует помнить о том, что мы можем строить запросы, включающие группы и пулы опций, заданных в одном запросе. Но для того чтобы утилита tcpdump обращала на них внимание их нужно помещать в скобки, беря выражение в одиночные кавычки:
Трафик идущий с хоста 10.0.2.4 на порты назначения 3379 или 22:
# tcpdump ‘src 10.0.2.4 and (dst port 3379 or 22)’

Также возможно производить фильтрацию на основе TCP флагов, например для вычленения SYN или RST пакетов:

Анализировать все URG пакеты:
# tcpdump ‘tcp & 32 != 0′

Анализировать все ACK пакеты:
# tcpdump ‘tcp & 16 != 0′

Анализировать все PSH пакеты:
# tcpdump ‘tcp & 8 != 0′

Анализировать все RST пакеты:
# tcpdump ‘tcp & 4 != 0′

Анализировать все SYN пакеты:
# tcpdump ‘tcp & 2 != 0′

К оманда 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]}