1010101001000100110100111
@1010101001000100110100111

Обнаружение IP-пакетов внутри потока данных?

Иногда в процессе отладки сетевых приложений возникает необходимость проанализировать содержимое пакетов по бинарным/hex логам обмена, и при этом под рукой может не оказаться специализированной программы для анализа.

Тем более, что, сформировать вручную бинарный файл (совместимый с форматом «снимков», поддерживаемых анализатором) содержащий «сырые» сетевые пакеты, зачастую, бывает гораздо сложнее, чем «вручную» эти пакеты «распарсить».

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

Например, мне так и не удалось «натравить» Microsoft Network Monitor на локально-установленный Apache.

Не помог даже специальный драйвер LoopBack-интерфейса, который я установил, в надежде что он поможет NetMon'у перехватывать локальные сетевые пакеты, типа PING 127.0.0.1 и ему подобные.

Тем не менее, вновь-созданный VPN-туннель, позволяющий отправлять в сеть «сырые» IP-пакеты, без проблем прослушивается NetMon'ом, (несмотря на то, что он так же как и Apache, поднят локально).



Приведенный ниже код позволяет в блоке «сырых» данных $raw_data отыскивать позиции начала возможных заголовков IP-пакетов версии 4.
<?php<br>
$mask="/[E-O](?=.{8}[\x01\x06\x11])/s";<br>
$res=preg_match_all($mask, $raw_data, $result, PREG_OFFSET_CAPTURE);<br>
foreach ($result[0] as $rrr)<br>
  echo $rrr[1],"\r\n";<br>
Данный способ обнаружения довольно грубый, и дает очень много ложных срабатываний, поэтому, желательно так же более тщательно проверять результаты.

Проверка контрольной суммы заголовка полностью решает эту проблему.

function checksum($data, $bool=false) <br>
    { <br>
    if (strlen($data) & 1)<br>
      $data .= "\x00"; <br>
    $bit = unpack("n*", $data); <br>
    $sum = array_sum($bit); <br>
    while ($sum >> 16) <br>
      $sum = ($sum >> 16) + ($sum & 0xffff); <br>
    if ($bool) return ($sum===0xffff);<br>
    return pack("n", ~$sum);<br>
    } <br>
Собственно вопрос:

Нужно так же обнаруживать заголовки пакетов IP версии 6.

Кто-нибудь подскажет как это попроще сделать?
  • Вопрос задан
  • 3294 просмотра
Пригласить эксперта
Ответы на вопрос 1
DmZ
@DmZ
В общем случае не выйдет просто найти пакет IPv6.
Если есть заголовки Ethernet, то можно смотреть на «тип» и версию внутреннего протокола. (В любом случае это позволит практически 100% определять IPv4/IPv6 пакеты)
В случае с PPP — прийдется анализировать и установку соединения и конфигурацию (IPCP/IP6CP) — одним регеэкспом не отделаешься :(

Может проще посмотреть на нормальные тулзы типа Wireshark?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы