Еще один get_nf_direct

Технические вопросы по UTM 5.0
Закрыто
littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Еще один get_nf_direct

Сообщение littlesavage »

Представляю ya_get_nf_direct - еще один вариант утилиты выдирания детальной статистики UTM.


Cовместима по параметрам с имеющимя в UTM get_nf_direct'ом. Основные улучшения:
  • Прозрачная распаковка gz/bzip2/lzma/xz архивов
  • Возможность экспорт результатов в SQlite3 базу данных.
  • Расширенные правила фильтрации с использованием полей БД, операторов =,!=,<,>, скобок и логических операторов И/ИЛИ/НЕ
  • Возможность чтения данных с stdin (для этого и переписывалось).
  • В качестве времени (-from, -to) можно указывать время в формате ГГГГ-ММ-ДД[TЧЧ:ММ:СС]
  • По SIGINFO/SIGUSR1 показывает текущий статус
  • Open source :)
Из зависимостей - libarchive >= 1.8. На большинстве систем придется его обновлять/доустанавливать.

Код на github: https://github.com/littlesavage/ya_get_nf_direct

Код: Выделить всё

$ ./ya_get_nf_direct --help
ya_get_nf_direct - UTM ya_get_nf_direct module.
$Revision&#58; 0.1, 23-sep-2010 $
Usage&#58; ya_get_nf_direct &#91;-h&#93; &#91;options&#93;
Options&#58;
    -D, --directory             Directory, default&#58; /netup/utm5/db/
    -b, --database              Database name, &#40;- - stdin&#41;, default&#58; /netup/utm5/db/iptraffic_raw.dbs
    -a, --account_id            Account ID, default&#58; none
    -s, --src_ip=<addr>&#91;/mask&#93;  Source Address, default&#58; none
    -d, --dst_ip=<addr>&#91;/mask&#93;  Destination Address, default&#58; none
    -p, --src_port              Source port, default&#58; none
    -P, --dst_port              Destination port, default&#58; none
    -c, --tclass                Traffic class, default&#58; none
    -f, --from=timestamp        From timestamp/datetime, default&#58; 0
    -t, --to=timestamp          To timestamp/datetime, default&#58; current timestamp
    -l, --limit                 Max count of rows, default&#58; unlim
    -e, --extended              Print stats in extended format
    -F, --filter=<filter>       Apply extended filter
    -S, --sqlite=<db>           Dump to Sqlite database db
    -h, --help                  Help
    -v, --version               Show version

Extended filters&#58;
    Logical operators&#58;                  ||, &&, !, &#40;&#41;
    Comprarsion operators&#58;              ==, !=, >, >=, <, <=
    Supported expressions&#58; 
        fw_id      &#91;==&#93;    addr&#91;/mask&#93;  Netup Firewall ID
        src_addr   &#91;==&#93;    addr&#91;/mask&#93;  Source IP/Network
        dst_addr   &#91;==&#93;    addr&#91;/mask&#93;  Destination IP/Network
        next_hop   &#91;==&#93;    addr&#91;/mask&#93;  Next Hop IP/Network
        i_ifx      &#91;compr&#93; num          Source interface index
        o_ifx      &#91;compr&#93; num          Destination interface index
        packets    &#91;compr&#93; num          Number of packets in a flow
        octets     &#91;compr&#93; num          Number of octets in a flow
        s_port     &#91;compr&#93; num          Source port
        d_port     &#91;compr&#93; num          Destination port
        flags      &#91;==&#93;    num          TCP flags
        prot       &#91;compr&#93; num          IP Protocol
        tos        &#91;compr&#93; num          IP TOS
        src_as     &#91;compr&#93; num          Source AS
        dst_as     &#91;compr&#93; num          Destination AS
        slink_id   &#91;compr&#93; num          UTM service link ID
        account_id &#91;compr&#93; num          UTM account ID
        account_ip &#91;==&#93;    addr&#91;/mask&#93;  UTM accounted IP
        tclass     &#91;compr&#93; num          UTM traffic class
        timestamp  &#91;compr&#93; num|datetime UTM timestamp
        router_ip  &#91;==&#93;    addr&#91;/mask&#93;  Netflow Router IP

Example&#58; '&#40;timestamp >= 2010-01-01T12&#58;00 && src_addr 192.168.1.0/24&#41; || &#40;dst_addr 192.168.2.0/24 && ! account_id 5&#41;'
Последний раз редактировалось littlesavage Пн ноя 05, 2012 14:34, всего редактировалось 1 раз.

Rav
Сообщения: 70
Зарегистрирован: Пт июн 29, 2007 17:02

Сообщение Rav »

Я так понимаю, что эта утилита только для старого формата хранения статистики?

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

А фильтрация содержимого там многопоточная?

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

Утилита только для нового формата.
Распаковка и фильтрация там однопоточная.

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Вот фильтрацию не мешало бы разделить на число ядер в системе.

Для четырех тредов

1) читаем из потока кратное 4 число записей (или что осталось, если близко к концу файла) и складываем во входной массив
2) стартуем треды со следующими параметрами: первый тред стартует с нулевой записи, второй - с первой, третий - со второй, четвертый - с третьей, и идут до конца массива с шагом 4, каждому треду передается указатель на свой выходной массив, в который складываются номера отфильтрованных записей
3) когда все треды отрабатывают, главный тред выбирает из входного массива записи согласно номерам из четырех выходных массивов и так собирает урожай

Главное преимущество такого решения - скорость за счет работы только с оперативной памятью и полного отсутствия синхронизации тредов. Да, все блоки динамической памяти создавайте до запуска тредов и ни в коем случае не внутри них - это будет ударом по производительности. К примеру, если будете использовать std::vector<int> в качестве выходного массива, установите ему размер до запуска треда, чтобы во время работы треда он не делал движений по изменению своего размера (а они неявные).

Кроме того, текстовое выражение фильтра лучше скомпилировать в некий байткод, быстрее будет отрабатывать. Разбор текстового выражения применительно к каждой записи - операция довольно тяжелая, и на миллионах записей это будет заметно.

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

Фильтрация выполняется значительно быстрее распаковки, она там вообще незаметна. Разбора текста там нет, выражение вначале преобразуется во внутреннее представление.
Вот распаковку можно распаралеллить. Хотя сейчас оно уже особо никому не надо :) За 2 года мне самому понадобилось воспользоваться этим фильтрм всего 1-2 раза.

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Тогда и распаковку в треды. Операция ведется над группой файлов, или списком. Точно так же обработать список с шагом, равным количеству тредов. На выходе, правда, каша получится, но можно отсортировать как надо.

Закрыто