Утилита приема IPFIX потоков данных

Введение

Утилита предназначена для приема потока данных от устройств по протоколу IPFIX и сохранением данных в виде файла для последующей обработки их другими средствами.

Инсталляция и обновление

CentOS6

подключите репозитарий VAS Experts аналогично п.1 инструкции установки DPI.

установите ipfixreceiver:

yum install -y ipfixreceiver

проверьте изменения в конфигурационных файлах на соответствие версии см. раздел "Важные изменения"

CentOS7

подключите репозиторий VAS Experts аналогично п.1 инструкции установки DPI.

установите репозиторий epel

yum -y install epel-release

установите репозиторий forensics

rpm --import https://forensics.cert.org/forensics.asc
rpm -Uvh https://forensics.cert.org/cert-forensics-tools-release-el7.rpm

установите ipfixreceiver:

yum install -y ipfixreceiver

проверьте изменения в конфигурационных файлах на соответствие версии см. раздел "Важные изменения"

Важные изменения в версии 1.0.3 по отношению к 1.0.2

изменен конфигурационный файл в части преобразования IP адресов, с версии 1.0.3 необходимо указывать decodeipv4, decodeipv6 в экспортной модели, пример:

source_ip4, decodeipv4

destination_ip4, decodeipv4

сохранение информации в файл вынесено в отдельный процесс, учитывайте что при большом количестве сессий (>25k сес/сек) процесс будет полностью загружать 2 ядра процессора. Для проверки, что процесс успевает обработать весь поток данных в режиме DEBUG добавлены сообщения
(a)cnt=NNNNN - отправлен буфер с данным номером
(b)cnt=YYYYY - сохранен буфер с данным номером.

введен параметр buffer_size - размер буфера обмена между процессом приема и записи в файл, используется в разделе [dump], по умолчанию значение параметра 100000 записей (ориентировано на 20Гбит трафика или 25 000 сессий в сек). Если к-во сессий в секунду значительно меньше, то обязательно пропорционально измените данный параметр.

Файлы поставки

примеры конфигурации:

/etc/dpiui/ipfixreceiver.conf - пример конфигурации для clickstream (http запросы)
/etc/dpiui/ipfixreceiverflow.conf - пример конфигурации для получения информации о сессиях (аналог netflow)
/etc/dpiui/ipfixreceiversip.conf - пример конфигурации для получения информации о sip соединениях

файлы программы располагаются в директории:

/usr/local/lib/ipfixreceiver.d/

вспомогательные файлы:

/etc/dpiui/port_proto.txt - информация о трансляции идентификатора протокола в наименование,
используется в утилите для получения текстового имени протокола

ссылки на исполняемый модуль:

/usr/local/bin/ipfixreceiver -> линк на /usr/local/lib/ipfixreceiver.d/ipfixreceiver

Дополнительные настройки ОС

настройте iptables для приема внешних данных
Для работы ipfixreceiver'а требуется открыть порты которые так же будут использоваться в конфигурации в разделе [connect]
Например вами используются протокол TCP, 1500 порт и IP=212.12.11.10

[connect]
protocol=tcp
host=212.12.11.10
port=1500

Для приема IPFIX потока у вас в /etc/sysconfig/iptables должно быть следующее правило:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 1500 -j ACCEPT

Не забудьте что после внесения правила в iptables требуется перезапуск:

service iptables restart

настройте ротацию логов
Пример ротации для лог файла /var/log/dpiuiflow.log, создайте в директории /etc/logrotate.d/ файл flowlog следующего содержания

/var/log/dpiui*.log {
rotate 5
missingok
notifempty
compress
size 10M
daily
copytruncate
nocreate
postrotate
endscript
}

Обратите внимание на использование метода copytruncate, иначе файл будет пересоздан и запись лога из процесса прекратится.
Соответственно в конфигурации ipfixreceiver у вас в разделе [handler_ipfixreceiverlogger] указано следующее:

args=('/var/log/dpiuiflow.log', 'a+')

Настройте удаление старых файлов. Например удаление старых архивов (более 31 дня) с записями о сессиях запакованных gzip:

15 4 * * * /bin/find /var/dump/dpiui/ -name url_\*.dump.gz -cmin +44640 -delete > /dev/null 2>&1

Измените строчку под ваши требования и добавьте в файл /var/spool/cron/root.

Параметры запуска программы

Утилита ipfixreceiver имеет следующие параметры запуска :

usage: ipfixreceiver start|stop|restart|status|-v [-f <config file>]
где
start - запуск в режиме сервиса
stop - останов сервиса
state - состояние работы сервиса
restart - перезапуск сервиса
-v - вывести информацию о версии
-f <config file> - указать файл конфигурации для запуска сервиса
Пример:
ipfixreceiver start -f /etc/dpiui/ipfixreceiverflow.conf

Конфигурация

По умолчанию используется файл конфигурации /etc/dpiui/ipfixreceiver.conf .
Больше информации о конфигурировании логирования можно найти по ссылке Logging

Служебные разделы

loggers - определяет используемые лог идентификаторы

handlers - определяет используемые обработчики для сохранения лога

formatters - определяет используемые форматы для лога

logger_root

level - определяет уровень логирования (верхний уровень)
Возможные значения:

CRITICAL - только критические ошибки, минимальный уровень сообщений
ERROR - включая ошибки
WARNING - включая предупреждения
INFO - включая информацию
DEBUG - включая отладочные
NOTSET - Все, максимальный уровень сообщений (включая все выше перечисленные)

Пример:

level=DEBUG

handlers - используемые обработчики сообщений
Пример:

handlers=ipfixreceiverlogger

handler_ipfixreceiverlogger

class - класс обработчика
Пример:

class=FileHandler

level - уровень сообщений

level=DEBUG

formatter - наименование формата сообщений

formatter=ipfixreceiverlogger

args - параметры обработчика

args=('/var/log/dpiuiflow.log', 'a+')

formatter_ipfixreceiverlogger

format - описание формата сообщения
Пример:

format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
где
%(name)s - имя лога
%(levelname)s - уровень сообщения ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').
%(asctime)s - дата, по умолчанию формат “2003-07-08 16:49:45,896” (поле запятаой указаны миллисекунды).
%(message)s - сообщение

datefmt - описание формата даты
Пример:

datefmt='%m-%d %H:%M'

connect

protocol - протокол (tcp или udp).

protocol=udp

host - IP или имя сервера.

host=localhost

port - номер порта.

port=9996

dump

rotate_minutes - период в минутах, по прошествии которого временный файл в dumpfiledir/<port>.url.dump будет перемещен в архив (mv) и создан новый временный файл.

rotate_minutes=10

processcmd - команда которая будет запущена по окончании ротации файла, параметр имя файла с путем к нему.

processcmd=gzip %%s

dumpfiledir - директория куда будут сохраняться файлы с принятыми данными.

dumpfiledir=/var/dump/dpiui/ipfixflow/

buffer_size - размер буфера обмена между процессом приема и записи в файл, по умолчанию значение параметра 100000 записей (ориентировано на 20Гбит трафика или 25 000 сессий в сек). Если к-во сессий в секунду значительно меньше, то обязательно пропорционально измените данный параметр.

InfoModel

Блок описывает получаемые данные по IPFIX протоколу.

InfoElements - параметр с описанием элементов информационной модели для IPFIX

InfoElements = octetDeltaCount, 0, 1, UINT64, True
packetDeltaCount, 0, 2, UINT64, True
protocolIdentifier, 0, 3, UINT8
session_id, 43823, 2000, UINT64, True
где,
session_id - наименование поля из описания IPFIX см. разделы
43823 - уникальный номер организации (enterprise number)
1 - уникальный номер поля
UINT64 - тип поля
True - использовать обратный порядок байт (endian). Значения - True или пусто.

Типы полей:

Type	Length	Type IPFIX
OCTET_ARRAY	VARLEN	octetArray
UINT8	1	unsigned8
UINT16	2	unsigned16
UINT32	4	unsigned32
UINT64	8	unsigned64
INT8	1	signed8
INT16	2	signed16
INT32	4	signed32
INT64	8	signed64
FLOAT32	4	float32
FLOAT64	8	float64
BOOL	1	boolean
MAC_ADDR	6	macAddress
STRING	VARLEN	string
SECONDS	4	dateTimeSeconds
MILLISECONDS	8	dateTimeMilliseconds
MICROSECONDS	8	dateTimeMicroseconds
NANOSECONDS	8	dateTimeNanoseconds
IP4ADDR	4	ipv4Address
IP6ADDR	16	ipv6Address

Наименование полей и описание можно взять по ссылкам:

Шаблон экспорта Netflow в формате IPFIX

Шаблоны экспорта clickstream и SIP

Шаблон экспорта AAA в формате IPFIX

Дополнительная информация:
Information Model for IP Flow Information Export

ExportModel

определяет параметры модели для экспорта, зарезервировано для будущего использования.

Mode - тип используемого экспорта

Mode = File

ExportModelFile

Описание модели экспорта File.

Delimiter разделитель полей в строке ( \t - табуляция, еще примеры - |,;)

Delimiter = \t

ExportElements - описание полей которые будут сохранены в файл.

ExportElements = timestamp, seconds, %%Y-%%m-%%d %%H:%%M:%%S.000+03
login
source_ip4
destination_ip4
host, decodehost
path, decodepath
referal, decodereferer
session_id
где поля в каждой строке:
имя - наименование поля из информационной модели [InfoModel] (login, session_id и т.п.)
обработчик - процедура обработки поля перед выводом
seconds - поле в секундах, ожидается формат
milliseconds - поле в милисекундах, микросекундах, наносекундах ожидается формат
decodehost - перекодировать из punycode в UTF-8
decodepath - перекодировать из urlencoding в UTF-8
decodereferer - перекодировать из (punycode,urlencoding) в UTF-8
decodeproto - перекодировать идентификатор протокола в строку
формат - описание формата для seconds, milliseconds.
Пример: %%Y-%%m-%%d %%H:%%M:%%S.%%f+0300
Результат: 2016-05-25 13:13:35.621000+0300

Создаем сервис в Centos7

Создание сервиса в centos7 по шагам, название сервиса ipfix1, используемая конфигурация /etc/dpiui/ipfixreceiver.conf, используемый порт 1500.
Создаем файл /etc/systemd/system/ipfix1.service следующего содержания:

[Unit]
Description=ipfix test restart
After=network.target
After=syslog.target
[Service]
Type=forking
PIDFile=/tmp/ipfixreceiver.1500.pid
ExecStart=/usr/local/bin/ipfixreceiver start -f /etc/dpiui/ipfixreceiver.conf
ExecStop=/usr/local/bin/ipfixreceiver stop -f /etc/dpiui/ipfixreceiver.conf
ExecReload=/usr/local/bin/ipfixreceiver restart -f /etc/dpiui/ipfixreceiver.conf
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target

Выполняем:

systemctl enable ipfix1.service
systemctl start ipfix1.service
systemctl daemon-reload

Проверяем:

systemctl status ipfix1.service -l

не забудьте проверить поднятие сервиса после перезагрузки

Проблемы и решения

как получить версию утилиты?
Используйте следующие команды:

ipfixreceiver -v

yum info ipfixreceiver

можно ли на один порт отправлять IPFIX потоки с разных DPI?
Да. Единственное в записываемом потоке их будет не различить.

как понять, что утилита работает?
a) проверьте, что порт из конфигурации прослушивается утилитой, например 1500:

netstat -nlp | grep 1500

b) проверьте лог, нет ли ошибок
c) Проверьте, что запись в промежуточный файл происходит, например для 9996 порта (директория для файлов - /var/dump/dpiui/ipfixurl):

tail -f /var/dump/dpiui/ipfixurl/9996.url.dump

все проверено, но приема сообщений нет?
a) забыли открыть порт в iptables.
b) инициализировали ipfixreceiver с неверным IP сервера.

с DPI идет большое количество сессий (более 2 млн сессий/мин), при включенном DEBUG режиме видно, что счетчик обмена буферами не успевает записать до получения следующего блока записей, что можно сделать?
a) удалите преобразование даты в строку, это уменьшит процессорное время на обработку и дополнительно получите уменьшение объема результирующего файла
b) удалите преобразование decodeipv4, не значительно, но так же получите ускорение записи файла
c)настройте buffer_size при к-ве сес /сек более 30к совместно с п.d
d) увеличьте частоту процессора и объем памяти