The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Ускорение анализатора сетевого трафика Snort при помощи библиотеки Hyperscan
Осенью прошлого года компания Intel открыла исходные тексты библиотеки
поиска совпадений для регулярных выражений Hyperscan, обеспечивающей ускорение
DPI-приложений за счёт
использования SIMD compiler intrinsics.

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

Snort - самое известное DPI-приложение с открытым кодом - получил поддержку
Hyperscan только в начале этого лета. Представленный патч предназначен для
версии Snort 2.9.8.2 но без проблем накладывается на 2.9.8.3 и может быть
портирован и на предыдущие релизы.

Сборка

Для сборки Hyperscan сборочное окружение должно содержать
Boost и компилятор ragel.  В
библиотеке используется система сборки cmake. Сложности, если можно их назвать
сложностями, вызывает только Boost: данной версии
всё ещё нет в большинстве дистрибутивов на момент июня 2016, поэтому скорее
всего придётся собираться локально. Собрать буст  несложно и весь процесс не
очень длителен. Что касается ragel и cmake, то они уже имеются в пакетных
репозитариях Gentoo, Ubuntu, CentOS в достаточно свежих версиях.

  • Boost
  • Ragel
  • Hyperscan
  • Snort Boost Нужен Boost выше 1.57. В наиболее ожидаемом случае, если версия буста в используемом дистрибутиве ниже, то надо будет установить более свежую копию. Для этого надо скачать актуальную версию и установить её локально. tar xf ~/tmp/boost_1_61_0.tar.bz2 cd boost_1_61_0 ./bootstrap.sh -prefix=$HOME/opt/boost/ ./b2 --ignore-site-config install --ignore-site-config требуется для устранения потенциальных конфликтов с системной версией Boost: игнорирование текущих настроек при сборке локальной версии буста в домашней директории пользователя. Ragel Далее нужен ragel, этот компилятор доступен в стандартных репозитариях всех распространённых дистрибутивов. Поэтому инсталляция проста: emerge ragel или же apt-get install ragel, yum install ragel итп итд HyperScan Сборка библиотеки стандартна для проектов использующих cmake: tar xf ~/tmp/hyperscan-4.2.0.tar.gz cd hyperscan-4.2.0/ mkdir build cd build cmake .. -DBOOST_ROOT=$HOME/opt/boost/ -DCMAKE_INSTALL_PREFIX=$HOME/opt/hp make install Предполагается, что будет использован локальный буст, установленный в $HOME/opt/boost. Все переменные сборки можно проверить и перезадать при помощи "ccmake ." или же через аргументы cmake. В случае использования системного буста указывать -DBOOST_ROOT не следует. Snort Подходит кодовая база Snort любой из 2.9.8.* версий: 2.9.8.0, 2.9.8.2. В статье используется последний стабильный релиз: 2.9.8.3. Добавление поддержки HyperScan производится патчем версии v1: https://01.org/sites/default/files/downloads/hyperscan/snort-2982-hyperscan-v1.tar_0.gz распаковываем исходники Snort: tar xf ~/tmp/snort-2.9.8.3.tar.gz cd snort-2.9.8.3/ накладываем патч: tar xf ~/tmp/snort-2982-hyperscan-v1.tar_0.gz gunzip -c snort-2982-hyperscan-v1/snort-2982-hyperscan-v1.patch.gz| patch -p2 На всех трёх доступных мне машинах с CentOS, Gentoo, Ubuntu этого было недостаточно для сборки: при линковке snort возникали ошибки вида /opt/hp/lib/libhs.a(mpvcompile.cpp.o): In function 'operator--': /usr/include/c++/4.8/bits/stl_tree.h:204: undefined reference to 'std::_Rb_tree_decrement(std::_Rb_tree_node_base*)' /opt/hp/lib/libhs.a(mpvcompile.cpp.o): In function '__gnu_cxx::new_allocator<ue2::raw_puff>::deallocate(ue2::raw_puff*, unsigned long)': /usr/include/c++/4.8/ext/new_allocator.h:110: undefined reference to `operator delete(void*)' требуется добавление -lstdc++ к списку библиотек в configure.in. Поэтому открываем любимым редактором файл configure.in, ищем в нём строчку, где задаётся "-lhs" и заменяем на "-lhs -lstdc++": - LIBS="${LIBS} -lhs" + LIBS="${LIBS} -lhs -lstdc++" Собираем Snort: autoreconf -fi ./configure --enable-intel-hyperscan --with-intel-hyperscan-includes=$HOME/opt/hp/include/hs --with-intel-hyperscan-libraries=$HOME/opt/hp/lib --prefix=$HOME/usr/opt298hp make install Настройка Собранный таким образом снорт уже будет немного быстрее оригинального, так как для поиска контента будут использоваться SIMD инструкции. Но прирост будет малозаметен. Для реального ускорения детектирования необходимо задать движок hyperscan в опции config detection конфигурационного файла snort.conf: config detection: search-method hyperscan Если использовать актуальный большой набор правил, например открытый набор от [[https://rules.emergingthreats.net/open/snort-2.9.0/ Emerging Threats]], то начальная загрузка снорта значительно замедлится. Чтобы избежать этого без особых потерь в ускорении можно использовать опцию split-any-any, таким образом результирующая строка config detection будет выглядеть так: config detection: search-method hyperscan split-any-any При этом будет наблюдаться выигрыш как в производительности сравнительно со снортом без hyperscan), так и по использованию памяти, точные данные зависят от набора правил. На наборах ET это около 10 процентов (~520 мб и 470 мб в top соответственно). Без опции split-any-any снорт будет анализировать трафик с максимальной скоростью, но будет гораздо дольше стартовать и будет гораздо более заметен в потреблении памяти системы. Таким образом, для сравнения получаются 4 системы с одним набором правил от ET:
  • чистый Snort 2.9.8.3 без модификаций
  • Snort, собранный с Hyperscan, без изменений конфигураци, то есть использующий библиотеку только для простого поиска контента
  • Snort с Hyperscan и включённым движком детектирования hyperscan
  • Snort с включенным движком hyperscan и опцией split-any-any Результаты Скорость проще всего оценивается по времени обработки pcap-файлов. Результирующее ускорение зависит от новизны CPU. Так, на одноядерном Celeron M560 от старого ноутбука, выигрыш будет в районе считанных процентов: с гиперсканом дамп будет обрабатываться за 300 секунд, без гиперскана за 310. Получше результаты на более современном Intel(R) Core(TM) i7-2600:
  • Время обработки 100+ mb pcap файла без hyperscan: Run time for packet processing was 39.578298 seconds
  • Время обработки того же 100+ mb pcap файла c hyperscan: Run time for packet processing was 35.190397 seconds
  • Время обработки 100+ mb pcap файла с движком hyperscan + split-any-any: Run time for packet processing was 24.616165 seconds
  • Время обработки 100+ mb pcap файла с движком hyperscan: Run time for packet processing was 22.323232 seconds Было бы интересно сравнить на Xeon. Видно, что при использовании данной библиотеки и хорошего железа можно ускорить обработку пакетов, пролетающих через Snort IDS, практически двукратно.
  •  
    18.07.2016 , Автор: Владимир Кунщиков , Источник: http://kunschikov.blogspot.ru/2016/...
    Ключи: snort, regex, speed, optimization, hyperscan / Лицензия: CC-BY
    Раздел:    Корень / Администратору / Сетевая подсистема, маршрутизация / Пакетные фильтры и фаерволы / Пакетный фильтр в FreeBSD: ipfw, IP-Filter

    Обсуждение [ RSS ]
     
  • 1, AdVv, 12:25, 20/07/2016 [ответить] [смотреть все]
  • +/
    Последние два пункта в сравнении выходят за рамки логики. Поидее 3-й должен быть БЕЗ hyperscan + split-any-any, а 4-й с hyperscan + split-any-any
     
     
  • 2, автор, 14:51, 20/07/2016 [^] [ответить] [смотреть все]
  • +/
    Snort в финальном отчёте рассчитывает время обработки пакетов без учёта времени загрузки правил. Правила грузились час, работал 5 секунд, 'Run time for packet processing' будет 5 seconds.  Если я правильно понял ваше сообщение.
    Хотелось бы отзывов вида "на ксеоне такие-то показатели", или же "такое-то правило перестало сработать, патч неприемлем".
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:




      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor