Опубликован: 20.02.2007 | Уровень: специалист | Доступ: платный
Лекция 14:

Анализаторы сетевых потоков

Реализация

WinDump - это просто порт Windows утилиты tcpdump. Использование tcpdump и WinDump почти взаимозаменяемо. В этой лекции мы сосредоточимся на утилите tcpdump, отмечая все различия между WinDump и tcpdump по мере продвижения. Вообще, если вы работаете дома, один, то можете использовать tcpdump вместо WinDump.

Первое обстоятельство, которое нужно иметь в виду, заключается в том, что утилита tcpdump обычно требует привилегированного доступа (root). Она должна выполняться с доступом root или setuid root. Этот тип доступа необходим утилите tcpdump и библиотеке libpcap для того, чтобы иметь очень низкий уровень доступа (то есть уровень ядра) к сетевым интерфейсам и сетевым данным. Это также удерживает "пользователя Джо" от установки анализатора сетевых пакетов для неуместного использования. Некоторые системы Unix требуют большего, а некоторые меньшего доступа - детали смотрите с помощью утилиты man или в файле README.

Примечание. Защита WinDump / WinPcap сделана немного слабее, чем защита tcpdump / libpcap. Когда выполняется WinDump, она пытается загружать файл WinPcap DLL, если он еще не выполняется. Загружать эту библиотеку DLL можно только с привилегиями администратора. Однако если WinPcap уже выполняется, то любой пользователь может с этого момента использовать его до тех пор, пока система не будет перезагружена или не будет остановлена служба Netgroup Packet Filter (только в NT/2000).

Другая причина, по которой пользователи libpcap и WinPcap нуждаются в низкоуровневом доступе, состоит в том, что по умолчанию эти анализаторы сетевых потоков переводят сетевой интерфейс, на котором они работают, в смешанный режим. Если вы помните наше обсуждение в начале лекции, некоторые сетевые устройства, типа хабов Ethernet, фактически передают пакет ко всем портам хаба, надеясь, что законный получатель обнаружит себя и примет пакет. Другие хосты, связанные с хабом, также получают этот пакет, но они, как предполагается, игнорируют его. Смешанный (Promiscuous) режим предписывает интерфейсу вмешиваться в чужие дела, и это позволяет утилите tcpdump видеть весь сетевой трафик на хабе, а не только трафик, который направлен к хабу или от него. То же самое происходит, если вы выполняете tcpdump на маршрутизаторе или брандмауэре. Если интерфейс не находится в смешанном режиме, вы видите только трафик, направленный непосредственно маршрутизатору. Н о если мы помещаем интерфейс в смешанный режим, то можем прослушивать каждый пакет, который проходит через устройство. Многие организации захотят установить анализатор сетевых пакетов ( packet sniffers ) на своих главных маршрутизаторах выхода в интернет с целью контроля.

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

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

Синтаксис командной строки: спецификации фильтров

Утилита tcpdump позволяет использовать булевское выражение для определения пакетного фильтра. Булевское выражение может состоять из нескольких выражений, объединенных вместе с помощью операторов AND, OR или NOT. Типичный формат выражения такой:

<Характеристика пакета> <значение>

Спецификаторы типа. Наиболее типичные характеристики пакета, называемые спецификаторами ( qualifiers ) - спецификаторы типа: host (хост), net (сеть) и port (порт). Например, командная строка:

%tcpdump host 192.168.1.100

говорит о том, что мы хотим видеть только пакеты, идущие по адресу 192.168.1.100 или от него. Если нас интересует только Web-трафик, мы можем попробовать следующее:

%tcpdump host 192.168.1.100 and port 80

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

Спецификаторы направления. tcpdump позволяет определять фильтры направлений. Например, если нас интересует только трафик, прибывающий с адреса 192.168.1.100, который предназначен чьему-то Web-порту, мы используем спецификаторы направлений src и dst:

%tcpdump src host 192.168.1.100 and dst port 80

Этот фильтр дает нам именно то, что мы ищем. Иначе, мы видели бы трафик, прибывающий из других мест на Web-сервер хоста 192.168.1.100, когда это нас совсем не интересует.

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

%tcpdump src or dst host 192.168.1.100 and src or dst port 80
Примечание. Для протоколов типа "точка-точка", таких как протоколы коммутируемых линий Serial Line Internet Protocol (SLIP) и Point-to-Point Protocol (PPP), утилита tcpdump использует другие спецификаторы направления inbound (прибывающий) и outbound (исходящий).

Спецификаторы протокола. У tcpdump также есть спецификаторы протокола, которые могут применяться к вашему выражению. Например, строка

%tcpdump src host 192.168.1.100 and udp dst port 53

даст исходящие DNS (Domain Name System) запросы с хоста 192.168.1.100. Обратите внимание на спецификатор протокола udp, расположенный перед спецификатором порта dst. Другие спецификаторы протокола для спецификаторов типа порта - tcp и icmp. Некоторые спецификаторы протокола используются при спецификаторах типа хоста, например ip, ip6, arp и ether.

Эта команда дает все arp-запросы на нашей локальной подсети:

%tcpdump arp net 192.168.1

Если мы знаем MAC-адрес определенного хоста, и хотим установить на него фильтр, то можно использовать следующую строку:

%tcpdump ether host 00:e0:29:38:b4:67

Если никакие спецификаторы протокола не даны, tcpdump подразумевает значения ip, arp или rarp для спецификаторов типа хоста, и tcp или udp для спецификаторов типа порта.

Другие спецификаторы. До сих пор синтаксис для отдельного выражения, устанавливающего соответствие пакетов некоторым требованиям, выглядит так:

[Спецификатор протокола] [спецификатор направления] 
  <спецификатор типа> значение

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

Таблица 14.1. Другие спецификаторы инструмента tcpdump
Спецификатор Описание Примеры
gateway Отображает только пакеты, которые используют router1 в качестве шлюза (gateway). Значение, используемое с gateway, должно быть именем хоста, поскольку выражение должно разрешать имя хоста к IP-адресу (используя /etc/hosts или DNS), а также к Ethernet-адресу (используя /etc/ethers). tcpdump gateway router1 (Чтобы использовать прямо IP- и MAC-адреса, используйте tcpdump ether host <mac_of_host> and not ip host <ip_of_host>, что эквивалентно использованию фильтра шлюза, но с адресами вместо имен хостов.)
broadcast, multicast broadcast отображает только широковещательные пакеты, (в данном случае, пакеты с адресами получателя 192.168.1.0 или 192.168.1.255). multicast отображает только IP-пакеты, предназначенные группе адресов. tcpdump ip broadcast net 192.168.1
proto Этот полезный спецификатор позволяет вам определять подпротоколы определенного протокола, даже если у tcpdump нет для этого встроенного ключевого слова. Названия протоколов нужно отделять, используя обратную наклонную черту, чтобы оградить tcpdump от интерпретации их, как ключевого слова, но вы можете также в этом месте использовать номера протоколов. Некоторые популярные номера IP-подпротоколов следующие: 1 (ICMP), 6 (TCP) и 17 (UDP). tcpdump ip proto 17. (Выражение ip host 192.168.1.100 and tcp port 80 может быть записано как ether proto \\ip and host 192.168.1.100 and ip proto \\tcp and port 80. Обратите внимание, как модификатор протокола в каждом случае расширяется к <protocol> proto <sub-protocol>.)
mask Этот спецификатор может определить маску подсети для спецификаторов типа сети. Это редко используется, потому что можно указать маску сети в значении, предназначенном для указания спецификатора типа сети. tcpdump net 192.168.1.0 mask 255.255.255.0. (Или по другому, как tcpdump net 192.168.1.0/24.)
len,_greater,_less Пакеты могут быть отфильтрованы по их размеру. Спецификаторы greater и less являются просто сокращением для длинных выражений, которые используют ключевое слово len. В обоих примерах показываются только пакеты, которые имеют размеры 80 байт или больше. tcpdump greater 80 и tcpdump len>= 80.
Packet_content_expressions Для опытных пользователей. Вы можете фильтровать пакеты, основываясь на их содержании. Используйте название протокола (такое как ether, ip или tcp), за ним значение смещения в байтах от искомого заголовка в квадратных скобках, как индекс массива (udp [4], чтобы определить длину UDP-дэйтаграммы), далее булевский оператор и другое выражение. Обратите внимание, что большинство выражений должно быть заключено в кавычки, потому что интерпретатор команд (shell), который вы используете, вероятно, будет пробовать интерпретировать их прежде, чем это будет делать tcpdump. tcpdump 'udp[4] >= 24'. (В этом примере отображаются только UDP-пакеты, у которых размеры полезных данных превышают 24 байта. См. другие примеры в справке man.)

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

  • host - спецификаторы типа хостов имеют значения имен хостов или числовых адресов. (Являются ли они IP-адресами, MAC-адресами или другими адресами, зависит от предшествующего им спецификатора протокола.)
  • port - спецификаторы типа портов используют символические названия (из /etc/services) для портов или непосредственно номера портов.
  • net - спецификаторы типа сети используют сетевые адреса и маски сети написанные или с сетевыми октетами (типа 192.168), с последующим числом сетевых байтов (192.168.0.0/16), или с последующей сетевой маской (192.168.0.0 mask 255.255.0.0).
  • proto - спецификаторы типа протокола используют символические названия ( ip, tcp, udp ) или номера протоколов, определенные в /etc/protocols.
Примечание. Поскольку в Windows нет никакого каталога /etc, WinDump использует хосты и файлы служб, которые установлены в корневом каталоге Windows (например, C:\Windows\).
Сергей Хлюкин
Сергей Хлюкин
Россия, Москва, Московский Государственный Открытый Университет, 2007
Игорь Касаткин
Игорь Касаткин
Россия, Москва