Perl для системного администрирования


Опасность на проводе - часть 8


Как и в примере из главы 5, работающем с DNS, нам придется разбить пакет на части. Обычно такая процедура требует обращения к спецификации (RFC) и создания нужных шаблонов unpack(). Тим Поттер (Tim Potter) проделал сложную работу и написал несколько модулей Net Packet: NetPacket::Ethernet, NetPacket::IP, NetPacket::TCP, NetPacket::ICMP и т. д. Каждый из них поддерживает два метода: strip() и decode().

Метод strip() просто возвращает данные из пакета, выкидывая все, что касается уровня сети. Запомните, что TCP/IP-пакет в сети Ethernet - это, на самом деле, обычный пакет TCP, «обернутый» в пакет IP, а тот, в свою очередь, обернут в пакет Ethernet. Так что если $pkt хранит TCP/IP-пакет, то NetPacket:: Ethernet: :strip($pkt) вернет IP-пакет (удалив уровень Ethernet). Если бы нам нужна была TCP-часть от $pkt, можно было бы использовать NetPacket: :IP: : st r ip( Net Packet: : Ethernet: : stnp($packet)) для удаления и 1Р-, и Ethernet-уровня.

decode() продвигается глубже еще на один шаг. Он разбивает пакет на его составляющие и возвращает экземпляр объекта, содержащего все эти части. Например:

NetPacket::TCP->decode(

NetPacket: :IP: : strip( Net Packet: ; Ethernet: :st>-ip($packet)))

вернет экземпляр объекта со следующими полями:

Поле

Описание

src_port

TCP-порт источника

dest_port

TCP-порт приемника

Seqnum

Порядковый номер

Acknum

Номер подтверждения

Hien

Длина заголовка

Reserved

6-битное «зарезервированное» пространство в TCP-заголовке

Flags

Флаги URG, АСК, PSH, RST, SYN и FIN

Winsize

Размер TCP-окна

Cksum

Контрольная сумма

Urg

Указатель на экстренные данные

Options

Любые TCP-параметры в двоичном виде

Data

Данные для пакета

Это уже должно быть знакомо читателю (рис. 10.2). Чтобы выяснить порт приемника для пакета, можно сделать следующее:

$pt = NetPacket::TCP->decode( NetPacket: :IP: :stnp(

NetPacket::Ethernet::strip($packet )))->{dest_port};

Теперь соберем все вместе и кое-что изменим. Поттер создал оболочку для инициализации и циклов Net: : Рсар и выпустил ее как модуль Net: : PcapUtils. Модуль обрабатывает некоторые из выполняемых нами шагов, делая наши программы короче. Продемонстрируем все это л действии, учитывая все, что мы узнали в последнем разделе:




- Начало -  - Назад -  - Вперед -



Книжный магазин