tcp_callback никогда не вызывался в образце libnids

Я работаю над извлечением данных http из файла pcap. Мне нужно собрать фрагмент, поэтому я нахожу nids lib. Я устанавливаю libnids 1.24 с доморощенным в Mac OS 10.9.5 64 бит.

Я пытаюсь запустить пример printall. Я немного изменил код, чтобы он подходил для моей среды, например, изменил «nids.h» на , add nids_params.filename = filename; открыть автономный файл для анализа.

Образец может запускаться. Но проблема в том, что он ничего не печатает.

Я добавляю печать в первую строку функции tcp_callback. Опять ничего. Это указывает на то, что обратный вызов никогда не вызывается.

Чтобы доказать, что проблема не связана с моим файлом шапки

  • Я установил его для захвата живого пакета. После того, как я открываю веб-страницу, я ничего не получаю.
  • Я сам анализирую файл pcap с помощью libpcap и получаю много пакетов tcp.
  • количество пакетов 70k+. Маловероятно, что с рукопожатием не существует полного TCP-соединения.

Это такая боль — компилировать libnids с образцом и шаг за шагом отлаживать. Итак, можете ли вы дать мне некоторую информацию о том, почему обратный вызов не вызывается?


person Sisyphus    schedule 03.12.2014    source источник


Ответы (1)


Поскольку мне никто не ответил :( Я должен выбрать самый болезненный путь: скомпилировать libnids, затем шаг за шагом отладить, чтобы увидеть, что происходит.

Я пытаюсь отключить параметры компиляции -O2.

И посмотрите, где должен вызываться обратный вызов tcp. Я нахожу, что два факта:

  • контрольная сумма некоторых пакетов неверна.
  • он просто находит поток tcp и добавляет новое соединение, потому что ACK не видны.

первый проверен wireshark. И я вижу, что Wireshark уведомляет меня, что tcp checksum offload. Я получаю объяснение из вики wireshark:

Большинство современных операционных систем поддерживают некоторую форму сетевой разгрузки, при которой некоторая сетевая обработка выполняется на сетевой карте, а не на ЦП. Обычно это отличная вещь. Это может высвободить ресурсы в остальной части системы и позволить ей обрабатывать больше подключений. Если вы пытаетесь захватить трафик, это может привести к ложным ошибкам и странному или даже отсутствующему трафику. Разгрузка контрольной суммы В системах, которые поддерживают разгрузку контрольной суммы, контрольные суммы IP, TCP и UDP вычисляются на сетевой карте непосредственно перед их передачей по сети. В Wireshark они отображаются как исходящие пакеты, помеченные черным с красным текстом и примечанием [неверно, должно быть xxxx (возможно, вызвано «разгрузкой контрольной суммы TCP»?)].

Во-вторых, потому что libnids может повторно собрать поток с помощью сообщения рукопожатия.

Внезапно мне пришла в голову мысль, что совмещение этих двух фактов в результате ничего не дает.

Поскольку большинство пакетов ACK имеют неправильную контрольную сумму. Таким образом, пакет пропускается до того, как его сможет увидеть функция повторной сборки.

После отключения контрольной суммы я наконец получаю вывод полезной нагрузки tcp. Два дня и у меня получилось!

person Sisyphus    schedule 05.12.2014