OpenBSD. Подсчет траффика c помощью netflow с последующей публикацией в блог на основе wordpress. Часть вторая.

3. Набор скриптов, необходимых для подсчета и публикации трафика в блог
3.1 Скрипт для формирования файлов со статистикой.
Для формирования файлов со статистикой используются утилиты из ранее установленного пакета flow-tools.

#!/bin/ksh

REPORT_YEAR=$(/bin/date +%Y)
REPORT_MONTH=$(/bin/date +%m)
REPORT_DAY=$(/bin/date +%d)

#--------summ trafic in------------
/usr/local/bin/flow-cat -p /var/log/netflows/$REPORT_YEAR/$REPORT_YEAR-$REPORT_MONTH/$REPORT_YEAR-$REPORT_MONTH-$REPORT_DAY/ | /usr/local/bin/flow-filter -Dn192 -f /etc/flow-tools/filter.acl | /usr/local/bin/flow-stat -f15 -p -S2 > /var/www/htdocs/tools/netflow_report/sum_day_in.txt

#--------summ trafic out-----------
/usr/local/bin/flow-cat -p /var/log/netflows/$REPORT_YEAR/$REPORT_YEAR-$REPORT_MONTH/$REPORT_YEAR-$REPORT_MONTH-$REPORT_DAY/ | /usr/local/bin/flow-filter -Sn192 -f /etc/flow-tools/filter.acl | /usr/local/bin/flow-stat -f15 -p -S2 > /var/www/htdocs/tools/netflow_report/sum_day_out.txt

#--------detail traffic in---------
/usr/local/bin/flow-cat -p /var/log/netflows/$REPORT_YEAR/$REPORT_YEAR-$REPORT_MONTH/$REPORT_YEAR-$REPORT_MONTH-$REPORT_DAY/ | /usr/local/bin/flow-filter -Dn192 -f /etc/flow-tools/filter.acl | /usr/local/bin/flow-report -s /etc/flow-tools/report.cfg -S localnet_in | /usr/local/bin/flow-rptfmt -f html -H > /var/www/htdocs/tools/netflow_report/full_day_in.html

#-------detail traffic out--------
/usr/local/bin/flow-cat -p /var/log/netflows/$REPORT_YEAR/$REPORT_YEAR-$REPORT_MONTH/$REPORT_YEAR-$REPORT_MONTH-$REPORT_DAY/ | /usr/local/bin/flow-filter -Sn192 -f /etc/flow-tools/filter.acl | /usr/local/bin/flow-report -s /etc/flow-tools/report.cfg -S localnet_out | /usr/local/bin/flow-rptfmt -f html -H > /var/www/htdocs/tools/netflow_report/full_day_out.html 

В этом скрипте используются следующие утилиты из пакета flow-tools:
  • flow-cat
  • Каталог с логами коллектора трафика имеет следующий формат — /путь к корневой директории каталога/YEAR/YEAR-MONTH/YEAR-MONTH-DAY/ В последней директории каталога /YEAR-MONTH-DAY/ хранятся сами лог-файлы. Поэтому для получения сведений о каком либо дне, месяце или годе необходимо их агрегировать друг с другом. Flow-cat и является таким агрегатором лог-файлов.
    В качестве параметра у него указывается следующее:
    -p /var/log/netflows/$REPORT_YEAR/$REPORT_YEAR-$REPORT_MONTH/$REPORT_YEAR-$REPORT_MONTH-$REPORT_DAY/ — путь к каталогам, файлы из которых мы хотим объеденить. В данном случае это текущий день.
    Man для этой утилиты можной найти здесь.
  • flow-filter
  • Эта утилита представляет собой фильтр применяемый к агрегированным файлам и позволяет делать достаточно сложные выборки из общего массива данных. В нашем случае она используется только для выборки локальных IP-адресов и разделения трафика на входящий и исходящий. Правила фильтрации берутся из /etc/flow-tools/filter.acl. В простейшем случае содержимое этого файла представляет из себя следующее:
    ip access-list standard n192 permit 192.168.1.0 0.0.0.255
    В качестве параметров у этой утилиты указывается следующее:
    -Dn192 — название правила указанное в файле с параметрами фильтрации. Приставка -D ли -S к имени правила указывает на направление трафика. Входящее или исходящее.
    -f /etc/flow-tools/filter.acl — путь к файлу с правилами фильтрации.
    Man для этой утилиты можно найти здесь.
  • flow-stat
  • Эта утилита выводит статистику на экран по заданным правилам. В нашем случае использовались следующие опции:
    -f15 — формируется отчет по форме 15. Это отчет о суммарном трафике за определенный период.
    -p — на экране отображается заголовочная информация.
    -S2 — сортировка по второму полю.
    Вывод этой утилиты перенаправлен в файл /var/www/htdocs/tools/netflow_report/sum_day_in.txt, который затем используется для формирования сообщения в блоге.
    Man для этой утилиты можно найти здесь.
  • flow-report
  • Эта утилита использовалась для формирования детального отчета по трафику и вызывалась со следующими параметрами:
    -s /etc/flow-tools/report.cfg — путь к конфигурационному файлу с описанием параметров выводимого отчета. В нашем случае он содержит в себе следующее описание правил формирования отчета:
    stat-report localnet_out
        type ip-source-address
        output
            format ascii
            options +header,+xheader,+totals
            fields +flows,+packets,+duration
            sort +packets
    
    stat-report localnet_in
        type ip-destination-address
        output
            format ascii
            options +header,+xheader,+totals
            fields +flows,+packets,+duration
            sort +packets
          
    stat-definition localnet_out
        report localnet_out
    
    stat-definition localnet_in
        report localnet_in

    -S localnet_in — название отчета, определенного ранее в файле /etc/flow-tools/report.cfg
    Man и подробное описание опций конфигурационного файла для этой утилиты можно найти здесь.
  • flow-rptfmt
  • Эта утилита используется для вывода сформированного отчета в html и использовалась со следующими опциями:
    -f html — формат выводимого файла
    -H — добавляем заголовок
    Man по этой утилите можно найти здесь.
Полный набор man'ов по flow-tools можно найти здесь.

3.2 Скрипт на perl для публикации статистики в блог

#/usr/bin/perl

use WordPress::XMLRPC;

#----------------------Подключение к серверу-------------------
my $wppost = WordPress::XMLRPC->new(
{
        username        => 'admin',
        password        => 'password',
        proxy           => 'http://192.168.1.101/xmlrpc.php',
}) or die "Error (1) - $!\n";
#-------------------------------------------------------------

my $messfile;
my @read_array = ();
my @split_result = ();

#-----------------Открытие файла с суммой дневного входящего трафика---------------
open $messfile, '<', '/var/www/htdocs/tools/netflow_report/sum_day_in.txt' or die "Fail not open: $!\n";
@read_array = <$messfile>;
@split_result = split /\s+/ , $read_array[@array-1];

$tmess = '<strong> Summary day traffic in</strong>';
$tmess = $tmess.'<table border cellspacing=0 cellpadding=5> <tr> <th> Octets </th> <th> Packets </th> <th> Mbytes </th> </tr>';
$tmess = $tmess.'<tr> <td>'.$split_result[0].'</td> <td>'.$split_result[1].'</td> <td>'.$split_result[2].' </td></tr></table>';

close $messfile;

#--------------------------------------------------------------------

@read_array = ();
@split_result = ();

#-----------------Открытие файла с суммой дневного исходящего трафика-------------
open $messfile, '<', '/var/www/htdocs/tools/netflow_report/sum_day_out.txt' or die "Fail not open: $!\n";
@read_array = <$messfile>;
@split_result = split /\s+/ , $read_array[@array-1];

$tmess = $tmess.'
</br><strong> Summary day traffic out</strong>';
$tmess = $tmess.'<table border cellspacing=0 cellpadding=5> <tr> <th> Octets </th> <th> Packets </th> <th> Mbytes </th> </tr>';
$tmess = $tmess.'<tr> <td>'.$split_result[0].'</td> <td>'.$split_result[1].'</td> <td>'.$split_result[2].' </td></tr></table>
</br><!--more-->';

close $messfile;
#-----------------------------------------------------------------------


#-----------------Открытие файла с детализацией дневного входящего трафика по IP-------------
open $messfile, '<', '/var/www/htdocs/tools/netflow_report/full_day_in.html' or die "Fail not open: $!\n";
$tmess = $tmess.'<strong> Detail day traffic in</strong>';

while(<$messfile>)
{
        $tmess = $tmess.$_;
}

close $messfile;
#-----------------------------------------------------------------------


#-----------------Открытие файла с детализацией дневного исходящего трафика по IP-------------
open $messfile, '<', '/var/www/htdocs/tools/netflow_report/full_day_out.html' or die "Fail not open: $!\n";
$tmess = $tmess.'
</br><strong> Detail day traffic out</strong>';

while(<$messfile>)
{
        $tmess = $tmess.$_;
}

close $messfile;
#-----------------------------------------------------------------------


#--------------------------Постим в блог------------------------------
my $npostin = {
        'title'         => localtime.' - daily trafic stat',
        'description'   => $tmess,
        'categories'    => [ 'trafstat' ],
};

my $ID = $wppost->newPost($npostin,1) or die "er(2) - $!\n";
#----------------------------------------------------------------------


4. Конечный результат.
В результате работы скриптов мы получаем такую запись в блоге

5 комментариев

avatar
В результате работы скриптов мы получаем такую запись в блоге
Какую?
  • Fray
  • 0
avatar
Ща, ща
avatar
А, простите :) Но уже плюсанул за старания ;)
avatar
Дак это, добавилиб тэги для таблиц, можно былоб и без скринов тогда обойтись.
avatar
Скрин-таки красивее и нагляднее ;)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.