Связка с flow-tools
Материал из BiTel WiKi
Прежде всего нужно инсталировать flow-tools.
Для этого в gentoo достаточно набрать от root одну команду emerge flow-tools
Вариант 1
вот текст программы которая конвертирует файлы в формате flow-tools в формат бгбиллинга
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <arpa/inet.h> #include "ftlib.h" /* $Id: $ */ #pragma pack(1) typedef struct { unsigned long fromAddr; unsigned long toAddr; short int fromIface; short int toIface; short int fromPort; short int toPort; unsigned long amount; } bitel; /* parameters * dstfile router_ip [dstfile router] sb srcfile [srcfile..] */ int main (int argc, char *argv[]) { int i = 0; int fd = 0; int str_count = 0; FILE *fp; FILE *out; struct ftio ftio; struct ftprof ftp; struct fts3rec_offsets fo; struct ftver ftv; char *rec; u_int32 last_time; u_int32 tm; bitel b_rec; if (argc < 3) { fprintf (stderr, "Usage: %s out_file in_file1 in_file2 in_file3 ... \n", argv[0]); return 1; } if ((out = fopen (argv[1], "wb")) == NULL) { perror ("Cannot create file %m"); return 2; } for (i = 2; i < argc; i++) { if ((fp = fopen (argv[i], "rb")) == NULL) { perror ("Cannot open file %m"); return 1; } fd = fileno (fp); fterr_setid (argv[0]); ftprof_start (&ftp); if (ftio_init (&ftio, fd, FT_IO_FLAG_READ) < 0) { perror ("Error in initialization ftio structure:%m"); return 0; } ftio_get_ver (&ftio, &ftv); fts3rec_compute_offsets (&fo, &ftv); last_time = 0; while ( (rec = ftio_read (&ftio)) ) { str_count++; tm = *((u_int32 *) (rec + fo.unix_secs)); if (last_time != tm) { b_rec.fromAddr = 0; b_rec.toAddr = 0; b_rec.fromIface = htons (0xff77); b_rec.toIface = htons (0xff77); b_rec.fromPort = htons ((u_int16) ((tm >> 16) & 0xFFFF)); b_rec.toPort = htons ((u_int16) (tm & 0xFFFF)); b_rec.amount = 0; fwrite (&b_rec, sizeof (bitel), 1, out); last_time = tm; } b_rec.fromAddr = htonl (*((u_int32 *) (rec + fo.srcaddr))); b_rec.toAddr = htonl (*((u_int32 *) (rec + fo.dstaddr))); b_rec.fromIface = htons (*((u_int16 *) (rec + fo.input))); b_rec.toIface = htons (*((u_int16 *) (rec + fo.output))); b_rec.fromPort = htons (*((u_int16 *) (rec + fo.srcport))); b_rec.toPort = htons (*((u_int16 *) (rec + fo.dstport))); b_rec.amount = htonl (*((u_int32 *) (rec + fo.dOctets))); fwrite (&b_rec, sizeof (bitel), 1, out); } ftio_close (&ftio); fclose (fp); } fclose (out); fprintf (stderr, "Total lines: %d\n", str_count); return 0; }
программа собирается так gcc -Wall -o f2b f2b.c -lz -lft
Как агрумент программа берет файл в который нужно записать данные в формате бгбиллинга и список файлов в формате flow-tools из которых брать исходные данные
вот пример скрипта который вызывается по крону каждый час и конвертит данные. скрипт берет данные из файлов /mnt/flow_export/имя_наса/2008-05-01/ft-v05.2008-05-01.110503+0900 (это стандартный формат имени для flow-tools) конвертит их и переносит в /mnt/flow_export_converted/source_id/2008/05/01/log_11
запущеный без параметра скрипт обрабатывает все данные за предыдущий час. Скрипт можно вызывать с параметром число часов которые нужно отступить назад.
#!/bin/bash export JAVA_HOME=/etc/java-config-2/current-system-vm indir=/mnt/flow_export outdir=/mnt/flow_export_converted convprog=f2b load_prog=/usr/local/BGIPNNetflowCollector/netflow.sh flowload=/var/log/flowload.log umask 027 hours_ago=$1 [[ -z "${hours_ago}" ]] && hours_ago=1 year=`date --date="${hours_ago} hour ago" +"%Y"` month=`date --date="${hours_ago} hour ago" +"%m"` day=`date --date="${hours_ago} hour ago" +"%d"` hour=`date --date="${hours_ago} hour ago" +"%H"` echo `date` >>$flowload for nas in nas1 nas2 nas3 nas4 nas5 do case "$nas" in nas1) nas_num=5;; nas2) nas_num=6;; nas3) nas_num=7;; nas4) nas_num=8;; nas5) nas_num=9;; *) echo "unknown nas $nas" exit 1;; esac if [ ! -d "$indir/$nas/$year-$month-$day" ] then echo "Data dir $indir/$nas/$year-$month-$day not found" exit 1 fi echo ==== $nas start >>$flowload mkdir -p $outdir/source_$nas_num/$year/$month/$day sleep 2 echo . $nas/$year-$month-$day >>$flowload $convprog $outdir/source_$nas_num/$year/$month/$day/log_$hour $indir/$nas/$year-$month-$day/ft-v05.????-??-??.$hour* >>$flowload 2>&1 echo == add $nas $year-$month-$day-$hour >>$flowload $load_prog isload $nas_num $year-$month-$day-$hour >>$flowload echo ==== $nas stop >>$flowload done exit 0
--Blib 17:27, 9 мая 2008 (UTC)
Вариант 2
Данный вариант более старый, в нем не поддержана генерация меток времени, что не позволяет предоставлять по данным файлам детализацию по сессиям DialUP модуля. Приведенное описание любезно предоставлено Примаковым Антоном из "Synterra Ural", за что ему большое спасибо.
- flow2bitel.cpp - собственно, перекодировщик (как его собирать - ниже). Программа может перекодировать исходные файлы flow-tools (собранные flow-capture) в файлы для BGIPNNetflowCollector, при этом разделяя данные исходных файлов по ip адресам роутеров (в терминах bitel - ip адреса источников), т.е. в одном исходном файле могут собираться данные с нескольких маршрутизаторов, конвертер корректно разделит эти данные по нескольким источникам BGIPNNetflowCollector'а.
- flow2bitel.sh - скрипт для запуска конвертации автоматом по закрытию файла утилитой flow-capture из пакета flow-tools при устанволенной опции генерировать 24 файла в сутки (т.е. делать переключение на новый файл каждый час)
- flow2bitel-15min.sh - скрипт для запуска конвертации автоматом по закрытию файла утилитой flow-capture из пакета flow-tools при устанволенной опции генерировать 96 файлов в сутки (т.е. делать переключение на новый файл каждые 15 минут, так стоИт по умолчанию)
Для компиляции flow2bitel.cpp необходим g++ компилятор (думаю, любой, никаких привязок я в коде не обнаружил). Кроме того, необходимо иметь скомпилированный код flow-tools любой версии с сохранением дерева исходников (flow2bitel.cpp требует 2 библиотеки из flow-tools для чтения и распаковки сохранённых файлов).
В примере компиляции исходники flow-tools распакованы в /usr/local/src/flow-tools-0.66. Теперь собсно строка для сборки ковертера flow2bitel.bin:
g++ -I/usr/local/src/flow-tools-0.66/lib -L/usr/local/src/flow-tools-0.66/lib flow2bitel.cpp -lft -lz -o flow2bitel.bin </souce> Имя '''flow2bitel.bin''' обязательно (оно используется в скриптах). Параметры: <source lang="bash"> ./flow2bitel.bin <log1> <ip1> <log2> <ip2> ... sb <src_file1> <src_file2> ...
где:
- <log1> -- полное имя файла, в которое нужно записать сконвертированные данные для источника 1
- <ip1> -- ip адрес источника 1
- sb -- разделитель (hardcoded into cpp) между списком dst и src файлов
- <src_file1> -- исходный файл 1, сгенерированный flow-capture
Теперь о скриптах. Необходимо отредактировать значения переменных:
- flow_sources -- указать список базовых каталогов, куда сообираются файлы утилитой flow-capture
- bg_prefix -- базовый каталог данных модуля BGIPNNetflowCollector; он же должен быть сконфигурирован в самОм BGIPNNetflowCollector
- bg_loader -- полный путь к скрипту для обращения к коллектору
Необязательные для редактирования параметры:
- bg_converter -- имя конвертора, который нужно запускать (по умолчанию -- имя_скрипта.bin, т.е. в данном случае flow2bitel.bin, конвертер должен быть расположен в том же каталоге, что и скрипт).
- LOG -- куда писать лог (по умолчанию -- в тот же каталог, где стоИт скрипт с именем имя_скрипта.log)
Скрипт привязывается к коллектору следующим образом:
/usr/local/netflow/bin/flow-capture -w /u02/flows.PE -n 23 -R /usr/local/sbin/flow2bitel.sh 0/0/9999
В данном случае
- -w /u02/flows.PE -- базовый каталог, куда flow-capture будет сохранять файлы,
- -n 23 -- переключать файлы каждый час,
- -R /usr/local/sbin/flow2bitel.sh -- запускать скрипт /usr/local/sbin/flow2bitel.sh по переключению файла.
Если не менять настроек способа сохранения файлов в flow-capture, то скрипту /usr/local/sbin/flow2bitel.sh на вход подаётся имя только что закрытого файла в виде $year/$year-$mon/$year-$mon-$day/$flow_filename
ВНИМАНИЕ!!! Если запущено несколько коллекторов flow-capture (как у нас), то запуск скрипта по закрытию файла нужно указывать только в одном коллекторе! Скрипт по имени файла и по данным из переменной $flow_sources сам "найдёт" все нужные файлы для конвертации.
У нас сейчас все коллекторы запускаются следующим образом:
/usr/local/netflow/bin/flow-capture -w /u02/flows.192.168.3.248 -n 23 0/192.168.3.248/9990 /usr/local/netflow/bin/flow-capture -w /u02/flows.192.168.3.250 -n 23 0/192.168.3.250/9991 /usr/local/netflow/bin/flow-capture -w /u02/flows.192.168.4.10 -n 23 0/192.168.4.10/9992 /usr/local/netflow/bin/flow-capture -w /u02/flows.PE -n 23 -R /usr/local/sbin/flow2bitel.sh 0/0/9999
Скрипт занимается следующим:
- Получает идентификаторы и ip адреса источников из BGIPNNetflowCollector
- Строит список источников BGIPNNetflowCollector <log> <ip> для передачи в кач-ве параметров flow2bitel.bin
- Находит все исходные файлы от flow-capture по совпадающим времени/дате переданного в кач-ве параметра имени файла во всех базовых каталогах-приёмниках, сконфигурированных в $flow_sources
- Запускает конвертер
- "Дёргает" BGIPNNetflowCollector, чтобы передать задание на обработку каждого сконвертированного файла для всех источников. Все действия пишутся в лог-файл $LOG.
Требуемые файлы: Медиа:Flow_to_bitel.zip