Анализируем сетевую кровь

Иван Скляров (www.sklyaroff.ru)

Хакер, номер #080, стр. 080-102-1

Возможности утилиты tcpdump от А до Я

Сеть напоминает кровеносную систему, а движущиеся по ней пакеты сродни тромбоцитам, лейкоцитам и прочим клеткам крови. Однако не все, что плавает в крови, несет пользу. Периодически в кровь проникает зараза, которая стремится навредить или даже убить весь организм. Чтобы обнаружить и вовремя устранить заболевание, необходимо сдавать кровь на анализы. С аналогичной целью следует анализировать "сетевую кровь". Стандартным инструментом для такого анализа в *nix является утилита tcpdump.

[виртуозное владение опциями командной строки]

Утилита tcpdump представляет собой сетевой анализатор пакетов, разработанный Lawrence Berkeley National Laboratory. Если tcpdump запустить без каких-либо параметров, она будет перехватывать все сетевые пакеты и выводить о них информацию. С помощью параметра '-i' можно указать сетевой интерфейс, с которого следует принимать данные:

# tcpdump -i eth2

Таким образом, с интерфейса eth2 будет осуществляться захват пакетов. Если требуются лишь пакеты, получаемые или отправляемые от определенного хоста, то его имя или IP нужно указать после ключевого слова host:

# tcpdump host namesrv

Если же нужны пакеты, которыми обмениваются, например, хосты namesrv1 и namesrv2, то можно использовать такой фильтр:

# tcpdump host namesrv1 and namesrv2

Для отслеживания только исходящих пакетов от какого-либо узла нужно указать сочетание "src host":

# tcpdump src host namesrv

А для отслеживания только входящих пакетов - "dst host":

# tcpdump dst host namesrv

Ключевые слова "src port" и "dst port" позволяют указывать порт отправителя и порт получателя, например:

# tcpdump dst port 513

Если нужно отслеживать один из трех протоколов tcp, udp, icmp, то его имя можно просто указать в командной строке. С помощью булевых операторов and (&&), or (||) и not (!) можно задавать фильтры произвольной сложности. Ниже приведен пример фильтра, отслеживающего только ICMP-пакеты, приходящие из внешней сети:

# tcpdump icmp and not src net localnet

Можно проверять конкретные биты или байты в заголовках протоколов, для чего используется такой формат: proto[expr:size], где proto - один из протоколов ether, fddi, tr, ip, arp, rarp, tcp, udp, icmp или ip6; expr - смещение в байтах от начала заголовка пакета; size - дополнительное поле, указывающее, сколько байт рассматривать (может отсутствовать, тогда рассматривается 1 байт). Например, чтобы отбирать только TCP-сегменты, в которых установлен флаг SYN, следует использовать фильтр:

# tcpdump 'tcp[ 13 ]==2'

Здесь нужно знать, что с 13 байта заголовка TCP расположены 8 бит флагов (1 байт), где SYN является вторым битом по номеру. Так как он должен быть установлен в 1, то байт флагов в двоичном виде будет выглядеть как 00000010 (это 2 в dec). С помощью аргумента '-c' можно указать количество принимаемых пакетов:

# tcpdump -c 10

В итоге будет получено всего 10 пакетов. Параметр '-a' позволяет (если возможно) отображать IP-адреса в символьном виде (правда это довольно сильно замедляет работу утилиты):

# tcpdump -a

Содержание  Вперед на стр. 080-102-2
ttfb: 3.1509399414062 ms