Tcpdump чтобы проверить кто забивает сеть. Установка и использование 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 — мощный анализатор командной строки и 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», надеюсь все ясно и понятно.

Dec 19, 2011 By Henry Van Styn
in HOW-TOs

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

tcpdump - важнейший инструмент прослушивания трафика, или снифинга, он предоставляет множество возможностей анализа и даже может экспортировать интерпретированные поля пакетов в другие программы.

Если вы думаете, что утилиты, подобные tcpdump, утрачивают свое значение с появлением графических инструментов типа Wireshark, подумайте еще раз. Wireshark - отличное приложение, однако вовсе не универсальный инструмент абсолютно для всех ситуаций. В качестве универсального легковесного решения для различных применений (как например юниксовые инструменты cat, less и hexdump) tcpdump смотрится намного круче. И наиболее впечатляющая его особенность, это удобство использования. В качестве стиля поведения он следует приближению к концепции "команды в одну строку" для получения быстрых одноходовых ответов. Кроме того его можно применять в рамках ssh-сессии без нужды использования графики. Благодаря поддержке соглашений синтаксиса командной строки (например, выдача выходного потока данных на стандартный вывод, который можно перенаправить) tcpdump может быть использован во всех типах конвейеров для построения интересных и полезных утилит.

В настоящей статье я рассмотрю некоторые базовые принципы использования tcpdump и основы его синтаксиса.

Основы

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

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

Анатомия команд tcpdump

Команда tcpdump состоит из двух частей: опций и выражения для фильтра (Figure 1).

Figure 1. Example tcpdump Command

Выражение для фильтра определяет, какие пакеты захватывать, а опции - какие из них показывать в выводе, также опции отвечают за поведение утилиты.

Опции

Опции tcpdump следуют стандартным соглашениям командной строки, поэтому формат опций - флаг-значение. Некоторые флаги не имеют значения параметра, потому что сами являются переключателями. Например, за -i следует имя интерфейса, а -n выключает разрешение имен через DNS.

Страница руководства man описывает множество опций, но есть некоторое множество их, без которых не обойтись:

I interface: интерфейс, на котором tcpdump будет прослушивать трафик;

V, -vv, -vvv: многословность вывода;

Q: тихий режим;

E: печатать заголовки кадров канального уровня (Ethernet);

N: разрешать доменные имена хостов;

T: не печатать временнЫе метки;

N: не разрешать доменные имена хостов;

S0 (or -s 0): максимальный захват, пакеты захватываются целиком; в последних версиях tcpdump это поведение по умолчанию.

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

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

Синтаксис пакетного фильтра мощный и прозрачный. В начале он содержит ключевые слова, называемые "примитивы", которые представляют собой различные классификаторы для пакетов, это могут быть протокол, адрес, порт или направление. Они могут быть соединены между собой в цепочки с помощью операторов и/или, сгруппированы и объединены правилами наследования, отсортированы с помощью отрицания.

Благодаря говорящим именам критериев, выражения для фильтров обычно выглядят как "самообъясняющие" свою суть конструкции, из-за этого их довольно легко конструировать и понимать. Полностью синтаксис описан в man-странице pcap-filter, здесь же представлены некоторые примеры:

ARP - простой протокол, он используется для разрешения IP-адресов в MAC-адреса сетевых карт. Как можно видеть выше, tcpdump описывает эти пакеты в довольно-таки примитивной манере. Пакеты DNS, с другой стороны, будут описаны несколько по-другому:

IP 10.0.0.2.50435 > 10.0.0.1.53: 19+ A? linuxjournal.com. (34) IP 10.0.0.1.53 > 10.0.0.2.50435: 19 1/0/0 A 76.74.252.198 (50)

Поначалу это может показаться недостаточно ясным, но по мере изучения того, как работают протоколы различных уровней, наполнится смыслом. DNS намного более сложный протокол, чем ARP, но кроме этого он работает на более высоком уровне. Это означает, что пакеты нижележащих протоколов также отображаются в выводе. В отличие от ARP, который не маршрутизируется между различными физическими сегментами сети, DNS это протокол для всего Интернета. Для маршрутизации этих пакетов используется уровень IP, для транспорта задействован UDP. Это делает DNS протоколом пятого уровня (IP - третий уровень, UDP - четвертый).

Информация уровней UDP/IP, содержащая адрес и порт источника, отображается в левой стороне строки, специфическая DNS-информация - в правой. Несмотря на то, что синтаксис довольно сжатый, он достаточен для определения базовых элементов DNS. Первый пакет есть запрос адреса для linuxjournal.com, второй пакет - это ответ, дающий адрес 76.74.252.198. Это типичная последовательность для простых DNS-запросов.

Просмотрите секцию "OUTPUT FORMAT" справки man для tcpdump для полного описания всех протокол-зависимых форматов вывода. Пакеты некоторых протоколов видны в выводе лучше, другие хуже, но важная информация обычно находится легко.

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

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

Анализ протоколов на основе TCP
tcpdump - это пакетный анализатор, поэтому он хорошо работает с протоколами, основанными на работе с отдельным пакетом, например, IP, UDP, DHCP, DNS и ICMP. Если же есть некий "поток", или последовательность пакетов для установления соединения, tcpdump не сможет напрямую анализировать эти потоки и сценарии соединений. Такие протоколы, как HTTP, SMTP и IMAP с точки зрения сетевого взаимодействия гораздо больше похожи на интерактивные приложения, чем "пакетные" протоколы.

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

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

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

Соединив все вместе, получим инструмент для захвата данных HTTP-сессий.

Кроме того, вы должны понимать, что в выводе может содержаться некоторое количество мусора. Лишнее можно отрезать с помощью опции утилиты strings, которая ограничивает длину вывода строки (смотри man strings).

Этот трюк довольно хорошо работает для любых протоколов, основанных на тексте.

Анализ HTTP и SMTP
Трюк со строками из предыдущего раздела может помочь для захвата данных сессий HTTP, несмотря на отсутствие встроенного анализатора потоков. Полученные данные можно "проанализировать" и потом множеством различных способов.

Например, вам вздумалось проверить доступность всех сайтов, в имени которых есть "davepc", в реальном времени. Поможет такая команда, запущенная на файерволе (подразумевается, что внутренний интерфейс eth1):

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

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

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

Возьмем стандартную схему соединения двух сетей через VPN-соединение. Сети 10.0.50.0/24 и 192.168.5.0/24 (Figure 2).

Figure 2. Example VPN Topology

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

Если пакеты запроса идут на хост С (удаленный шлюз), но не на D, это показывает, что само соединение VPN работает, но имеются проблемы маршрутизации. Если хост D получает запросы, но не оправляет ответы, это может означать, что протокол ICMP заблокирован. Если же ответы отправляются, но не доходят до С, возможно на D неправильно настроен шлюз по умолчанию.

tcpdump инструкция на русском и примеры.

-A задает вывод каждого пакета (без заголовков канального уровня) в формате ASCII. Этот режим удобен для сбора трафика HTTP.

-c <число пакетов> задает завершение работы программы после захвата заданного числа пакетов.

-C <размер файла> задает необходимость проверки размера файла захвата перед записью в него каждого нового пакета. Если размер файла превышает значение параметра file_size, этот файл закрывается
и создается новый файл для записи в него пакетов. Для файлов захвата используется имя, заданное параметром -w и, начиная со второго файла к имени добавляется в качестве
суффикса номер файла. Переменная file_size задает размер файла в миллионах байтов (не в мегабайтах = 1 048 576 байт).

-d задает вывод дампа скомпилированного кода соответствия пакетов (packet-matching code) в понятном человеку формате и завершение работы программы.

-dd выводит дамп кода соответствия в виде фрагмента C-программы.

-ddd выводит дамп кода соответствия в виде строки десятичных значений, перед которой следует строка со значением счетчика.

-D выводит список сетевых интерфейсов системы, с которых tcpdump может собирать пакеты. Для каждого сетевого интерфейса указывается имя и номер, за которыми может следовать
текстовое описание интерфейса. Имя и номер интерфейса могут использоваться с флагом -i для задания сбора пакетов с одного интерфейса.

Эта опция может быть весьма полезна для систем, не дающих информации об имеющихся сетевых интерфейсах3.

Флаг -D не поддерживается, если программа tcpdump была скомпилирована со старой версией libpcap, которая не поддерживает функцию pcap_findalldevs().

-e выводит заголовок канального уровня в каждой строке дампа.

-E задает использование алгоритма и секрета spi@ipaddr для расшифровки пакетов IPsec ESP, направленных по адресу ipaddr и содержащих and в поле Security Parameter Index значение
spi. Комбинация spi и адреса может быть повторена с использованием в качестве разделителя запятой или новой строки. Отметим, что установка секрета для пакетов IPv4 ESP в
настоящее время поддерживается.

В качестве алгоритмов могут использоваться des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc или none. По умолчанию применяется алгоритм des-cbc. Возможность дешифровки
пакетов обеспечивается только в тех случаях, когда при компиляции tcpdump были включены опции поддержки криптографии.

Параметр secret содержит ASCII-текст секретного ключа ESP. Если секрет начинается с символов 0x, будет считываться шестнадцатеричное значение. Опция предполагает использование
ESP в соответствии с RFC 2406, а не RFC 1827. Эта опция поддерживается только для отладки и использовать ее с реальными секретными ключами не следует, поскольку введенный в
командной строке ключ IPsec доступен другим пользователям системы4.

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

-f задает вывод чужих адресов IPv4 в числовом формате. Использование этой опции позволяет избавиться от проблем, возникающих на серверах Sun NIS при попытках трансляции
нелокальных адресов. Проверка чужеродности адреса IPv4 осуществляется с использованием адреса и маски принявшего пакет интерфейса. Если адрес и маска интерфейса недоступны
(например, при использовании unnumbered-интерфейсов или при захвате пакетов со всех адресов в Linux с использованием фиктивного интерфейса any), эта опция будет работать
некорректно.

-F <файл> задает использование фильтров, содержащихся в указанном файле. В этом случае заданные в командной строке фильтры игнорируются.

-i <интерфейс> задает сбор пакетов с указанного интерфейса. Если интерфейс не задан, tcpdump ищет в системе список доступных интерфейсов и выбирает в нем активное устройство с минимальным
номером (исключая loopback).

В системах Linux, начиная с ядра 2.2 поддерживается фиктивный интерфейс с именем any, обеспечивающий сбор пакетов со всех активных интерфейсов системы. Отметим, что сбор
пакетов с устройства any осуществляется в обычном (не promiscuous) режиме.

Если в системе поддерживается флаг -D, можно в качестве аргумента задавать номер интерфейса, выводимый при использовании этого флага.

-l задает буферизацию строк stdout. Эта опция полезна в тех случаях, когда вы хотите просматривать данные во время сбора пакетов. Например, команды

tcpdump -l | tee dat

tcpdump -l > dat & tail -f dat

обеспечивают запись пакетов в файл dat и одновременный вывод на консоль.

-L задает вывод списка известных типов канального уровня и завершение работы программы.

-m <файл> загружает модуль определений SMI MIB из указанного файла. Эта опция может использоваться неоднократно для загрузки нескольких модулей MIB.

-n отключает преобразование адресов и номеров портов в символьные имена.

-N задает использование только имен хостов, а не полных доменных имен. Например, вместо lhotze.bilim-systems.net при использовании этой опции моя рабочая станция будет
обозначаться как lhotze.

-O отключает оптимизатор кода проверки соответствия пакетов условиям фильтрации. Используйте эту опцию, если вам покажется, что оптимизатор работает с ошибками.

-p указывает программе, что интерфейс не нужно переводить в режим захвата5. Опцию -p нельзя использовать вместе с фильтром ether host {local-hw-addr} or ether broadcast.

-q задает вывод минимального объема информации.

-R при установке этого флага предполагается, что пакеты ESP/AH используют старый вариант спецификации6 и tcpdump не будет выводить поля replay prevention (защита от
воспроизведения). Поскольку спецификация ESP/AH не включает поля с номером версии, tcpdump не может определить версию протокола ESP/AH по заголовкам пакетов.

-r <файл> задает чтение данных из файла, созданного ранее с использованием команды tcpdump -w или с помощью другой программы, поддерживающей формат tcpdump (например, Ethereal). Если в
качестве имени файла задан символ -, используется поток данных от стандартного устройства ввода (stdin).

-S задает вывод абсолютных порядковых номеров TCP взамен относительных.

-s задает захват из каждого пакета snaplen байтов вместо отбираемых по умолчанию 68 байтов7. Значение 68 подходит для протоколов IP, ICMP, TCP и UDP но может приводить к потере
протокольной информации для некоторых пакетов DNS и NFS. Потеря части пакетов по причине малого размера кадра захвата (snapshot) указывается в выходных данных полями вида
[|proto]’, где proto – имя протокольного уровня, на котором произошло отсечение части пакета8. Отметим, что увеличение кадра захвата приведет к дополнительным временным
затратам на обработку пакетов и уменьшению числа буферизуемых пакетов, что может привести к потере части пакетов. Используйте минимальное значение snaplen, которое позволит
обойтись без потери информации об интересующем вас протоколе. Установка snaplen = 0 приведет к захвату полных пакетов.

-T <тип> задает интерпретацию пакетов, выбранных с помощью фильтра, как пакетов указанного параметром типа. В настоящее время поддерживаются типы aodv9, cnfp10, rpc11, rtp12, rtcp13,
snmp14, tftp15, vat16 и wb17.

-t отключает вывод временных меток в каждой строке дампа.

-tt задает вывод в каждой строке дампа неформатированных временных меток.

-ttt задает вывод временных интервалов (в микросекундах) между захватом предыдущего и данного пакетов в каждой строке дампа.

-tttt задает вывод временных меток в принятом по умолчанию формате для каждой строки дампа.

-u задает вывод манипуляторов (handle) NFS без декодирования.

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

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

-vv задает дополнительное увеличение объема выводимой информации (например, полное декодирование пакетов SMB, вывод дополнительных полей откликов NFS и т. п.).

-vvv задает максимальный объем выводимой информации (например, полностью выводятся опции telnet SB … SE). При использовании вместе с ключом -X опции Telnet выводятся также в
шестнадцатеричном представлении.

-w <файл> задает запись необработанных (raw) пакетов. Собранные в файл пакеты можно впоследствии просматривать с использованием флага -r или передавать для анализа другим программам
(например, Ethereal). Если в качестве имени файла указан символ -, запись осуществляется на стандартное устройство вывода (stdout).

-x задает вывод шестнадцатеричного дампа (без заголовка канального уровня) для каждого захваченного пакета. Объем выводимой информации определяется меньшим из двух значений —
размер пакета и значение параметра snaplen. Отметим, что при захвате полных кадров канального уровня дамп может включать также байты заполнения, если пакет сетевого уровня
имеет малый размер.

-xx задает вывод шестнадцатеричного дампа для каждого пакета с включением заголовков канального уровня.

-X задает вывод дампа в шестнадцатеричном и ASCII-формате без заголовков канального уровня. Эта опция может быть очень удобна при анализе новых протоколов.

-XX задает вывод дампа в шестнадцатеричном и ASCII-формате с включением заголовков канального уровня.

-y <тип> задает тип канального уровня, используемого при захвате пакетов. Поддерживаемые значения можно посмотреть с помощью флага -L.

Примеры.

  • Ловим весь исходящий трафик

tcpdump -i re0 -n -nn -ttt dst host 192.168.1.2

  • Ловим весь исходящий трафик кроме нашей ssh сессии ибо очень большой поток данных получается.

tcpdump -i re0 -n -nn -ttt ‘dst host 192.168.1.110 and not (src host 192.168.1.2 and dst port 22)’

  • Просмотр общения dns

tcpdump -i re0 -n -nn -ttt ‘host 192.168.1.110 and port 53’

  • Просмотр icmp пакетов

tcpdump -i re0 -n -nn -ttt ‘ip proto \icmp’

  • Трафик переходящий из сети 10.7.20 с назначением на сети 10.7.0. или 10.7.24.:

tcpdump -nvX src net 10.7.20.0.0/16 and dst net 10.7.0.0/8 or 10.7.24.0/16

  • Трафик идущий с сети 10.7.0.0 на порты назначения 22 или 4589:

tcpdump ’src 10.7.0.0 and (dst port 22 or 4589)’

  • Посмотреть трафик на интерфейсе:
  • посмотреть трафик одного хоста:

tcpdump host 192.168.1.1

  • Посмотреть трафик на порте:

tcpdump src port 80

  • Посмотреть IP трафик на хост:

tcpdump ip host 192.168.1.2

  • Посмотреть ARP трафик на хост:

tcpdump arp host 192.168.1.2

  • Смотрим RARP трафик на хост:

tcpdump rarp host 192.168.1.2

  • Смотрим трафик, кроме хоста pav253

tcpdump not host pav253

  • Смотрим трафик на pav253 и pav210

tcpdump host pav253 or host pav210

  • Смотрим содержимое пакетов на интерфейсе re0 на хост сайт

tcpdump -X -i re0 host сайт

  • icq трафик

tcpdump -X -i re0 port aol

  • Смотрим содержимое пакетов на интерфейсе tun0 на хост ya.ru, при этом прочитать из каждого пакета по 1500 байт и не преобразовывать IP в имя хоста

tcpdump -X -s 1500 -n -i re0 host сайт

  • Top активных взимодействий

tcpdump -tn -c 10000 -i re0 tcp or udp | awk -F «.» ‘{print $1″.»$2″.»$3″.»$4}’ | \ sort | uniq -c | sort -nr | awk ‘$1 > 100’

  • Смотрим все TCP пакеты с флагом SYN (начало сессии).

tcpdump -i eth0 -nn tcp == 2 and src net 192.168.1.0/24

  • Просмотр syn и fin пакетов из вне

tcpdump ‘tcp & (tcp-syn|tcp-fin) != 0 and not src and dst net 192.168.1.0’

  • Просмотр все ipv4 http пакеты с порта 80, кроме syn / fin / ack данных

tcpdump ‘tcp port 80 and (((ip — ((ip&0xf)<>2)) != 0)’

  • Просмотр только syn пакеты

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′



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: