8(499)-709-97-83
Работаем с 8:00 до 19:00

Ловим NetFlow при помощи Nfdump и Nfsen

  • 18 июня 2015

NetFlow — сетевой протокол, предназначенный для учёта сетевого трафика, разработанный компанией Cisco Systems. Является фактическим промышленным стандартом и поддерживается не только оборудованием Cisco, но и многими другими устройствами (в частности, Juniper, MikroTik и Enterasys). Также существуют свободные реализации для UNIX-подобных систем.


Существует несколько версий протокола, наиболее распространёнными из которых на 2011 год являются версии 5 и 9. На основе версии 9 также был разработан открытый стандарт под названием IPFIX (Internet Protocol Flow Information eXport, экспорт информации о потоках IP).


Для сбора информации о трафике по протоколу NetFlow требуются следующие компоненты:


Сенсор. Собирает статистику по проходящему через него трафику. Обычно это L3-коммутатор или маршрутизатор, хотя можно использовать и отдельно стоящие сенсоры, получающие данные путем зеркалирования порта коммутатора.

Коллектор. Собирает получаемые от сенсора данные и помещает их в хранилище.

Анализатор. Анализирует собранные коллектором данные и формирует пригодные для чтения человеком отчёты (часто в виде графиков).


От теории перейдем к практике.


Исходные данные: сервер Ubuntu 14.10, коммутатор Cisco. На Cisco настроена передача NetFlow в сторону Ubuntu по 9-й версии протокола.


Для сбора NetFlow была выбрана связка NFDump(Netflow Dump) и NFSen(Netflow Sensor). NFDump будет играть роль коллектора, а NFSen будет играть роль анализатора. В отличие от многих своих конкурентов, данная связка поддерживает 9-ю версию протокола и периодически обновляется. Подробное описание программы можно прочитать на официальном сайте: NFDump, NFSen.


Необходимые зависимости:


1) PHP и Perl:

NfSen написан на PHP и Perl и должен работать на *NIX системах.

Рекомендованные версии Perl 5.6.0 и PHP выше 4.1.

2) Perl Modules:

Для NfSen необходима установка следующих Perl модулей:

Mail::Header, Mail::Internet

3) RRD tools

Для всех графиков NfSen необходим пакет RRD.


Перейдем к установке:


1) Делаем апдейт системы.

sudo apt-get update

2) Ставим зависимости.

sudo apt-get install apache2 perl libapache2-mod-php5 libmailtools-perl gcc flex bison librrd-dev rrdtool librrds-perl php5-common libio-socket-ssl-perl libtool build-essential mrtg php5

В Ubuntu RRD ставится из пакетов.


Если установка ведется не в Ubuntu, то лучше поставить RRD из исходных кодов. Делается это следующими командами:

cd /usr/src
sudo wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.5.3.tar.gz
sudo tar xzfv rrdtool-1.5.3.tar.gz
cd rrdtool-1.5.3.tar.gz/
sudo ./configure -prefix=/usr/local/rrdtool -disable-tcl
sudo make
sudo make install

3) Далее устанавливаем утилитку NFDump.


Первый вариант, установить из пакетов:

sudo apt-get install nfdump

Но такой вариант установки не устроил NFSen, поэтому будем устанавливать из исходных кодов:

cd /usr/src
sudo wget http://sourceforge.net/projects/nfdump/files/stable/nfdump-1.6.13/nfdump-1.6.13.tar.gz
sudo tar zxvf nfdump-1.6.13.tar.gz
cd nfdump-1.6.13/
sudo ./configure --enable-nfprofile --enable-nftrack --enable-sflow
sudo make
sudo make install

4) Установим необходимые модули для Perl.

sudo perl -MCPAN -e 'install Socket6'
sudo perl -MCPAN -e 'install Mail::Header'
sudo perl -MCPAN -e 'install Mail::Internet'

5) Далее переходим к настройке установке NFSen.


Создадим каталог /data и /var/www/nfsen

sudo mkdir /data/nfsen
sudo mkdir /var/www/nfsen

Изменим права доступа для созданных каталогов

sudo chmod -R 777 /data/nfsen
sudo chmod -R 777 /var/www/nfsen

Скачаем и установим NFSen.

cd /usr/src
sudo wget http://sourceforge.net/projects/nfsen/files/stable/nfsen-1.3.7/nfsen-1.3.7.tar.gz
sudo tar zxvf nfsen-1.3.7.tar.gz
sudo cp /usr/src/nfsen-1.3.7/etc/nfsen-dist.conf /etc/nfsen.conf

Теперь необходимо настроить основной конфигурационный файл nfsen.conf, командой выше мы перенесли его в каталог /etc.

sudo nano /etc/nfsen.conf

Отредактируем файл:

  • $BASEDIR = "/data/nfsen"; - корневой каталог для хранения файлов NFSen
  • $HTMLDIR = "/var/www/nfsen/"; - корневой каталог для файлов, связанных с web интерфейсом
  • $PREFIX = '/usr/local/bin'; - указываем где лежат бинарники NFDump
  • $USER = "www-data"; - пользователь для запуска nfcapd - демона-коллектора
  • $WWWUSER = "www-data"; - пользователь для работы с web
  • $WWWGROUP = "www-data"; - группа пользователей для работы с web
  • $MAIL_FROM = 'mycompanyname@ya.ru'; - от какого имени буду отправляться сообщения
  • $SMTP_SERVER = 'localhost'; - ваш smtp сервер

В этом же файле мы настраиваем устройства, на котором слушать входящий трафик. Тут два варианта:


1-й вариант, разнести устройства по портам:

%sources = (
'Cisco' => { 'port' => '9995', 'col' => '#0000ff', 'type' => 'netflow' },
'Mikrotik' => { 'port' => '9996', 'col' => '#ff0000', 'type' => 'netflow' },
);

2-й вариант, разнести устройства по IP адресам:

%sources = (
'Cisco' => { 'port' => '9996', 'col' => '#ff0000', 'IP' => '192.168.15.1' },
'Mikrotik' => { 'port' => '9996', 'col' => '#0000ff', 'IP' => '192.168.16.1' },
);

Итоговый файл получается в следующем виде:

##############################
#
# NfSen master config file
#
# $Id: nfsen-dist.conf 22 2007-11-20 12:27:38Z phaag $
#
# Configuration of NfSen:
# Set all the values to fit your NfSen setup and run the 'install.pl'
# script from the nfsen distribution directory.
#
# The syntax must conform to Perl syntax.
#
##############################
#
# NfSen default layout:
# Any scripts, modules or profiles are installed by default under $BASEDIR.
# However, you may change any of these settings to fit your requested layout.

#
# Required for default layout
$BASEDIR = "/data/nfsen";

#
# Where to install the NfSen binaries
$BINDIR="${BASEDIR}/bin";

#
# Where to install the NfSen Perl modules
$LIBEXECDIR="${BASEDIR}/libexec";

#
# Where to install the config files
$CONFDIR="${BASEDIR}/etc";

#
# NfSen html pages directory:
# All php scripts will be installed here.
# URL: Entry point for nfsen: http:///nfsen/nfsen.php
$HTMLDIR = "/var/www/nfsen/";

#
# Where to install the docs
$DOCDIR="${HTMLDIR}/doc";

#
# Var space for NfSen
$VARDIR="${BASEDIR}/var";

# directory for all pid files
# $PIDDIR="$VARDIR/run";
#
# Filter directory
# FILTERDIR="${VARDIR}/filters";
#

# FORMATDIR for custom printing formats
# FORMATDIR="${VARDIR}/fmt";
#

# The Profiles stat directory, where all profile information
# RRD DBs and png pictures of the profile are stored
$PROFILESTATDIR="${BASEDIR}/profiles-stat";

#
# The Profiles directory, where all netflow data is stored
$PROFILEDATADIR="${BASEDIR}/profiles-data";

#
# Where go all the backend plugins
$BACKEND_PLUGINDIR="${BASEDIR}/plugins";

#
# Where go all the frontend plugins
$FRONTEND_PLUGINDIR="${HTMLDIR}/plugins";

#
# nfdump tools path
$PREFIX = '/usr/local/bin';

#
# nfsend communication socket
# $COMMSOCKET = "$PIDDIR/nfsen.comm";

# BASEDIR unrelated vars:
#
# Run nfcapd as this user
# This may be a different or the same uid than your web server.
# Note: This user must be in group $WWWGROUP, otherwise nfcapd
# is not able to write data files!
$USER = "www-data";

# user and group of the web server process
# All netflow processing will be done with this user
$WWWUSER = "www-data";
$WWWGROUP = "www-data";


# Receive buffer size for nfcapd - see man page nfcapd(1)
$BUFFLEN = 200000;

# list of extensions for each collector. See argument -T
# for nfcapd(1) for more detailes.
# defaults to empty -> compatible to nfdump-1.5.8
# $EXTENSIONS = '';
# Example:
# $EXTENSIONS = 'all';
# $EXTENSIONS = '+3,+4';
#
# Directory sub hierarchy layout:
# Possible layouts:
#
# 0 default no hierachy levels - flat layout - compatible with pre NfSen versions
# 1 %Y/%m/%d year/month/day
# 2 %Y/%m/%d/%H year/month/day/hour
# 3 %Y/%W/%u year/week_of_year/day_of_week
# 4 %Y/%W/%u/%H year/week_of_year/day_of_week/hour
# 5 %Y/%j year/day-of-year
# 6 %Y/%j/%H year/day-of-year/hour
# 7 %Y-%m-%d year-month-day
# 8 %Y-%m-%d/%H year-month-day/hour
$SUBDIRLAYOUT = 1;

# Compress flows while collecting 0 or 1
$ZIPcollected = 1;

# Compress flows in profiles 0 or 1
$ZIPprofiles = 1;

# Interrupt expire -- not yet enabled as not yet fully tested
#$InterruptExpire = 0;

# number of nfprofile processes to spawn during the profiling phase
# depends on how busy your system is and how many CPUs you have
# on very busy systems increase it to a higher value
$PROFILERS = 2;

# if the PROFILEDATADIR is filled up to this percentage, a warning message will be printed.
# set to 0 to disable the test
$DISKLIMIT = 98;

# number of nfprofile processes to spawn during the profiling phase
$PROFILERS = 6;

# Some Perl Versions/Builds have memory leaks for unknown reason.
# Therefore nfsend will increase its memory footprint over time.
# In order to reset nfsend, it automatically reloads after 1 day
# if PERL_HAS_MEMLEAK is set to 1
# $PERL_HAS_MEMLEAK=0;

# Netflow sources
# Define an ident string, port and colour per netflow source
#
# Required parameters:
# ident identifies this netflow source. e.g. the router name,
# Upstream provider name etc.
# port nfcapd listens on this port for netflow data for this source
# set port to '0' if you do not want a collector to be started
# col colour in nfsen graphs for this source
#
# Optional parameters
# type Collector type needed for this source. Can be 'netflow' or 'sflow'. Default is netflow
# optarg Optional args to the collector at startup
#
# Syntax:
# 'ident' => { 'port' => '', 'col' => '', 'type' => '' }
# Ident strings must be 1 to 19 characters long only, containing characters [a-zA-Z0-9_].

%sources = (
'Cisco' => { 'port' => '9996', 'col' => '#ff0000', 'IP' => '192.168.15.1' },
'Mikrotik' => { 'port' => '9996', 'col' => '#0000ff', 'IP' => '192.168.16.1' },
);

#
# Low water mark: When expiring files, delete files until
# size = $low_water % of max_size
# typically 90
$low_water = 90;

# syslog facility for periodic jobs
# nfsen uses level 'debug', 'info', 'warning' and 'err'
# Note: nfsen is very chatty for level 'debug' and 'info'
# For normal operation, you may set the logging level in syslog.conf
# to warning or error unless you want to debug NfSen
$syslog_facility = 'local3';

#
# SYSLOG mess
# Log socket type: Most *NIX such as LINUX and *BSD are fine with 'unix'
# which is the default. You need to change that to 'stream' or 'inet' for
# some Solaris version 8/9, AIX and others ..
# You may set it to undef to prevent calling Sys::Syslog::setlogsock at all
# ( works for Solaris 10 and newer Sys::Syslog module
#
# If not defined at all, 'unix' is assumed unless for Solaris, which defaults to 'stream'
# $LogSocket = 'unix';

#
# Plugins
# Plugins extend NfSen for the purpose of:
# Periodic data processing, alerting-condition and alerting-action
# For data processing a plugin may run for any profile or for a specific profile only.
# Syntax: [ 'profile list', 'module' ]
# profile list: ',' separated list of profiles ( 'profilegroup/profilename' ),
# or '*' for any profile, '!' for no profile
# module: Perl Module name, equal to plugin name
# The profile list '!' make sense for plugins, which only provide alerting functions
#
# The module follows the standard Perl module conventions, with at least one
# function: Init(). See demoplugin.pm for a simple template.
#
# A file with the same name in the FRONTEND_PLUGINDIR and .php extension is automatically
# recongized as frontend plugin.
#
# Plugins are installed under
# $BACKEND_PLUGINDIR and $FRONTEND_PLUGINDIR

@plugins = (

# profile # module
# [ '*', 'demoplugin' ],
);

%PluginConf = (
# For plugin demoplugin
demoplugin => {
# scalar
param2 => 42,
# hash
param1 => { 'key' => 'value' },
},
# for plugin otherplugin
otherplugin => [
# array
'mary had a little lamb'
],
);

#
# Alert module: email alerting:
# Use this from address
$MAIL_FROM = 'mycompanyname@ya.ru';

# Use this SMTP server
$SMTP_SERVER = 'localhost';

# Use this email body:
# You may have multiple lines of text.
# Var substitution:
# @alert@ replaced by alert name
# @timeslot@ replaced by timeslot alert triggered
$MAIL_BODY = q{
Alert '@alert@' triggered at timeslot @timeslot@
};

######################################################
#
# For the NfSen simulator include the section below.
#
######################################################
#
# Nfsen Simulator
# The simulator requires, that you have already installed
# and configured NfSen. The simulation is based on already
# pre-colleted data, which you may get from another live
# NfSen system.
#
# Steps to setup the NfSen simulator:
# 1. Configure the sources of the live profile with the
# same names of the NfSen system, you take netflow data
# for the simulation. Set the port for each netflow source
# to 0 to prevent a collector to be started.
# Install NfSen with this config in a seperate directory
# 2. Copy the pre-collected data into the appropriate
# netflow directory of the live profile.
# 3. Configure the simulator using the parameters below
# Enable Simulation mode => $SIMmode = 1
# Configure the time window of the pre-collected data.
# tstart => Start of time window. yyyymmddhhmm
# tbegin => Optional parameter. Start of simulation
# profile exists already between tstart - tbegin
# tend => End of time window. yyyymmddhhmm
# cycletime => simulation time in seconds of a 5min slot
# Setting cycletime = 0 processes the cycles as fast as
# possible. Please note, if you test plugings, your
# cycletime needs to be at least the time required to
# process all plugins.
# 4. Start nfsen: ../nfsen start
# Simulation starts
#
# The simulator runs from tstart to tend and stops when tend
# is reached. You may stop the simulation at any given time
# using ./nfsen stop. To continue the simulation start NfSen
# again: ./nfsen start. You may reset the simulator at any
# given time using ./nfsen abort-reset. This stops the sumulation
# and rolls back to tstart. All profiles/alerts are deleted,
# so you may start from scratch again.
#
# Configure simulator parameters

#
# $SIMmode = 1;
# %sim = (
# 'tstart' => '200707100000', # Simulation data available from July 10th 2007 00:00
# 'tbegin' => '200707110000', # Simulation begins at July 11th 2007 00:00
# 'tend' => '200707112355', # Simulation ends at July 11th 2007 23:55
# 'cycletime' => '30', # 30s per 5min slot
# );

1;

Далее переходим к непосредственной установке NFSen.

cd /usr/src/nfsen-1.3.7/
sudo ./install.pl /etc/nfsen.conf

Сделаем ссылку для корректной работы Apache

sudo ln -s /var/www/nfsen/nfsen.php /var/www/nfsen/index.php

Далее запускаем процесс командой:

/data/nfsen/bin/nfsen start

6) Теперь наведем немного лоска. Добавим NFSen в автозагрузку.

sudo ln -s /data/nfsen/bin/nfsen /etc/init.d/nfsen
sudo update-rc.d nfsen defaults 20
sudo /data/nfsen/bin/nfsen restart

У меня на Apache крутится несколько средств для мониторинга трафика, поэтому я сделал некоторую доработку. Создадим файл /etc/apache2/conf-available/nfsen.conf

sudo nano /etc/apache2/conf-available/nfsen.conf

и внесем в него следующую информацию:


Alias /nfsen /var/www/nfsen



Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

По-умолчанию доступ открыт всем, необходимо запаролить доступ к WEB интерфейсу NFSen. для этого делаем следующие шаги:


- устанавливаем утилитку apache2-utils, она необходима для генерации паролей.

sudo apt-get install apache2-utils

Далее вводим команду

sudo htdigest -c /var/www/nfsen/.htpasswd nfsen_public nfsenadmin

и вводим два раза необходимы пароль.


Поясним, что мы сделали.

  • Ключ "-с" - означает, что необходимо создать новый файл с ключами и пользователями (если вы будите добавлять еще одного пользователя, то данный ключ писать не надо).
  • Строка "/var/www/nfsen/.htpasswd" говорит о том, где будет находится файл с ключами и пользователями.
  • "nfsen_public" - realm название, используется для авторизации.
  • "nfsenadmin" - создаваемый пользователь.

После того как мы создали файл с ключами, необходимо подправить /etc/apache2/conf-available/nfsen.conf. В итоговом виде файл должен выглядеть так:


Alias /nfsen /var/www/nfsen



Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
AuthType Digest
AuthName nfsen_public
AuthUserFile /var/www/nfsen/.htpasswddg
Require valid-user

Для корректной работы авторизации, необходимо, чтобы был загружен модуль mod_auth_digest. Для этого введите следующую команду:

sudo ln -s /etc/apache2/mods-available/auth_digest.load /etc/apache2/mods-enabled/

Перезагружаем Apache.

sudo service apache2 restart

Подсказки:


1) В Ubuntu 12.04 LTS с Perl 5.14 и nfsen 1.3.6p1 нет import Socket6. В файлах «libexec/AbuseWhois.pm» и «libexec/Lookup.pm» заменить:

use Socket6;

на

Socket6->import(qw(pack_sockaddr_in6 unpack_sockaddr_in6 inet_pton getaddrinfo));

Данную подсказку взяли на сайте Ubuntu, но у меня на версии 14.10 таких проблем не возникло.


2) Как исправить следующие ошибки:


ERROR: nfsend connect() error: Permission denied!


ERROR: nfsend connect() error: No such file or directory!


ERROR: nfsend - connection failed!!


ERROR: Can not initialize globals!



В файле  необходимо найти следующие строки:

                        return undef; 
}
chmod 0660, $socket_path;
chown $NfConf::UID, $NfConf::GID, $socket_path;
} else {
# TCP Internet socke

Меняем местами строчки:

               chmod 0660, $socket_path; 
chown $NfConf::UID, $NfConf::GID, $socket_path;

Сохраняем и выходим из файла.

Далее отредактируем файл php.ini, найдите его командой:

sudo find / -name "php.ini"

Находим строку short_open_tag и устанавливаем значение в On.

short_open_tag = On

3) Как добавить новый хост в NFSen.

Редактируем файл /etc/nfsen.conf, добавляем хосты, как это было описано выше.

sudo nano etc/nfsen.conf

Останавливаем процесс NFSen.

sudo /etc/init.d/nfsen stop

Запускаем конфигурационный скрипт.

sudo ./install.pl /etc/nfsen.conf

Перечитаем созданные конфиги.

sudo /etc/init.d/nfsen reconfig

Запускаем NFSen.

sudo /etc/init.d/nfsen start

Примечание: NFSen может не захотеть читать новые конфиги. Для этого придется удалить информацию по старым хостам в каталоге /data/nfsen/profiles-data/live/, при этом вы потеряете всю полученную информацию.

sudo rm -Rf /data/nfsen/profiles-data/live/Ciscosudo rm -Rf /data/nfsen/profiles-data/live/Mikrotik

Далее выполняем:

sudo /etc/init.d/nfsen reconfigsudo /etc/init.d/nfsen start

На этот раз все должно пройти нормально.

 
Powered by SEO CMS ver.: 23.1 TOP 2 (opencartadmin.com)
 
Метки: Linux, Mikrotik, Cisco