====== Прием IPFIX данных ipfixreceiver ====== ===== Введение ===== Утилита предназначена для приема потока данных от устройств по протоколу IPFIX и сохранением данных в виде файла для последующей обработки их другими средствами. ===== Инсталляция и обновление ===== ==== CentOS6 ==== - подключите репозиторий VAS Experts rpm --import http://vasexperts.ru/centos/RPM-GPG-KEY-vasexperts.ru rpm -Uvh http://vasexperts.ru/centos/6/x86_64/vasexperts-repo-1-0.noarch.rpm - установите ipfixreceiver:\\ yum install -y ipfixreceiver - проверьте изменения в конфигурационных файлах на соответствие версии см. раздел "Важные изменения" ==== CentOS7 ==== - подключите репозиторий VAS Experts rpm --import http://vasexperts.ru/centos/RPM-GPG-KEY-vasexperts.ru rpm -Uvh http://vasexperts.ru/centos/6/x86_64/vasexperts-repo-1-0.noarch.rpm - установите репозиторий epel yum -y install epel-release - установка репозитория forencis: rpm --import https://forensics.cert.org/forensics.asc rpm -Uvh https://forensics.cert.org/cert-forensics-tools-release-el7.rpm - установите ipfixreceiver:\\ yum -y install libfixbuf --disablerepo=forensics yum -y install netsa-python netsa_silk yum -y install ipfixreceiver --disablerepo=forensics - проверьте изменения в конфигурационных файлах на соответствие версии см. раздел "Важные изменения" ===== Важные изменения в версии 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 ] где start - запуск в режиме сервиса stop - останов сервиса state - состояние работы сервиса restart - перезапуск сервиса -v - вывести информацию о версии -f - указать файл конфигурации для запуска сервиса Пример: ipfixreceiver start -f /etc/dpiui/ipfixreceiverflow.conf ===== Конфигурация ===== По умолчанию используется файл конфигурации /etc/dpiui/ipfixreceiver.conf.\\ :!:Больше информации о конфигурировании логирования можно найти по ссылке [[https://docs.python.org/2.6/library/logging.html | 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/.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 | Наименование полей и описание можно взять по ссылкам:\\ - [[dpi:dpi_options:opt_statistics:statistics_ipfix:start|Шаблон экспорта Netflow в формате IPFIX]] - [[dpi:dpi_options:opt_li:li_ipfix:start|Шаблоны экспорта clickstream и SIP]] - [[dpi:dpi_components:radius:radmon_acct_ipfix:start|Шаблон экспорта AAA в формате IPFIX]] Дополнительная информация:\\ [[https://tools.ietf.org/html/rfc5102.html | 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 -vyum 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) увеличьте частоту процессора и объем памяти