Анализируем сетевую кровь Иван Скляров (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 |