Связка с flow-tools

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
Строка 2: Строка 2:
Для этого в [http://www.gentoo.org/ gentoo] достаточно набрать от root одну команду <code>emerge flow-tools</code>
Для этого в [http://www.gentoo.org/ gentoo] достаточно набрать от root одну команду <code>emerge flow-tools</code>
 +
== Вариант 1 ==
вот текст программы которая конвертирует файлы в формате flow-tools в формат бгбиллинга
вот текст программы которая конвертирует файлы в формате flow-tools в формат бгбиллинга
Строка 180: Строка 181:
--[[Участник:Blib|Blib]] 17:27, 9 мая 2008 (UTC)
--[[Участник:Blib|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:
 +
 +
<source lang="bash">
 +
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> ...
 +
</source>
 +
 +
где:
 +
* <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)
 +
 +
Скрипт привязывается к коллектору следующим образом:
 +
<source lang="bash">
 +
/usr/local/netflow/bin/flow-capture -w /u02/flows.PE -n 23 -R /usr/local/sbin/flow2bitel.sh 0/0/9999
 +
</source>
 +
 +
В данном случае
 +
*-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 сам "найдёт" все нужные файлы для конвертации.
 +
 +
У нас сейчас все коллекторы запускаются следующим образом:
 +
<source lang="bash">
 +
/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
 +
</source>
 +
 +
Скрипт занимается следующим:
 +
 +
# Получает идентификаторы и ip адреса источников из BGIPNNetflowCollector
 +
# Строит список источников BGIPNNetflowCollector <log> <ip> для передачи в кач-ве параметров flow2bitel.bin
 +
# Находит все исходные файлы от flow-capture по совпадающим времени/дате переданного в кач-ве параметра имени файла во всех базовых каталогах-приёмниках, сконфигурированных в $flow_sources
 +
# Запускает конвертер
 +
# "Дёргает" BGIPNNetflowCollector, чтобы передать задание на обработку каждого сконвертированного файла для всех источников. Все действия пишутся в лог-файл $LOG.
 +
 +
Требуемые файлы: [[Медиа:Flow_to_bitel.zip]]

Версия 09:45, 15 мая 2008

Прежде всего нужно инсталировать 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

Скрипт занимается следующим:

  1. Получает идентификаторы и ip адреса источников из BGIPNNetflowCollector
  2. Строит список источников BGIPNNetflowCollector <log> <ip> для передачи в кач-ве параметров flow2bitel.bin
  3. Находит все исходные файлы от flow-capture по совпадающим времени/дате переданного в кач-ве параметра имени файла во всех базовых каталогах-приёмниках, сконфигурированных в $flow_sources
  4. Запускает конвертер
  5. "Дёргает" BGIPNNetflowCollector, чтобы передать задание на обработку каждого сконвертированного файла для всех источников. Все действия пишутся в лог-файл $LOG.

Требуемые файлы: Медиа:Flow_to_bitel.zip

Личные инструменты