Новости
Обзоры и тесты
Техно
Советы
Разное
Главная » Главное, Обзоры и тесты

Обзор Homer 5

Добавлено на 16.06.2018 – 01:07

Всем известно, что Гомер Симпсон (Homer Simpson) любит есть, Гомер, о котором пойдёт речь сегодня, также обожает есть, но не пончики, а SIP-трафик и то, что к нему полагается. И фамилия у нашего Гомера, могла бы быть SIPson.
Итак, Homer это БЕСПЛАТНОЕ решение, предназначенное для захвата, анализа и мониторинга SIP и RTCP-трафика с широкими возможностями масштабирования способное «перемалывать» огромные объёмы трафика свойственные VoIP-операторам малого или среднего размера.

Эта система призвана облегчить инженерам поиск и устранение неисправностей в VoIP-сетях при помощи мощного анализа и визуализации SIP-диалогов между узлами и детальный просмотр всех SIP-сообщений. Решение позволяет сохранять выгружать SIP-трейсы вызовов в виде pcap дампов или текстовых файлов. Еще одним преимуществом решения является возможность разнесения компонентов системы по разным узлам, что позволяет масштабировать систему.

Обзор похожего, но платного решения, разработка которого, к сожалению, давно прекращена можно найти по данной ссылке – Мониторинг сети VoIP с помощью VQManager
Решение Homer состоит из нескольких  подсистем. Рассмотрим эти подсистемы и механизм их взаимодействия межу собой.

image

В составе Homer можно выделить три основные подсистемы:

  • HOMER CAPTURE AGENT – агент захватывает трафик из VoIP-сети, копирует и инкапсулирует  SIP и RTCP пакеты  при помощи протокола HEP/EPP и передаёт их на CAPTURE SERVER, причём агент может представлять из себя как модуль для SIP-сервера (Asterisk, Freeswith, Kamailio,OpenSIPS), так и сервис захвата «сырого» трафика с сетевого интерфейса, который может зеркалироваться с порта(-ов) ethernet-коммутатора куда подключен SIP-сервер (например, модуль транзита трафика РТУ МТТ) на порт(-ы) CAPTURE AGENT.
  • HOMER CAPTURE SERVER – сервер на базе SIP маршрутизатора Kamailio с базой данных MySQL, где аккумулируется и хранятся SIP и RTCP пакеты полученные от CAPTURE AGENT
  • HOMER USER INTERFACE – веб-интерфейс для поиска, анализа и визуализации SIP-трейсов которые хранятся в CAPTURE SERVER.

Итак, общая схема работы  Homer выглядит так:
CAPTURE AGENT — это системная служба которая постоянно запущена на узле. Через узел проходит VoIP-трафик требующий анализа. CAPTURE AGENT захватывает трафик и создает копии сигнальных SIP-сообщений, затем инкапсулирует эти копии пакетов в формат HEP/ EEP и передаёт их по сети в коллектор сервера CAPTURE SERVER, сервер получает SIP и RTCP пакеты, разбирает их и помещает в базу данных MySQL. Фактически все SIP-сообщения целиком хранятся в базе данных, но естественно не просто так, а с метаданными, которые и позволяют существенно ускорить поиск и отображение запрашиваемой из веб-интерфейса информации.
Веб-интерфейс USER INTERFACE подключается к базе данных CAPTURE SERVER и загружает данные запрашиваемые пользователем веб-интерфейса.

Основные функции компонентов Homer

Capture Server

  • Высокая производительность – тысячи пакетов в секунду
  • Поддержка нескольких баз данных
  • Мощный пользовательский интерфейс для поиска и фильтрации
  • Визуальные диалоги SIP  и возможность их вызгрузки в pcap-файлы
  • Графики со статистикой и аналитикой
  • Поддержка REST API и виджетов
  • Авторизация пользователей по RADIUS и LDAP
  • Angular/JS интерфейс пользователя

Capture Agent

  • HEP3 инкапсуляция
  • Шифрование и сжатие содержимого
  • Модульный дизайн
  • SIP,RTP/RTCP,Журналы,CDRs
  • Поддержка TLS
  • Высокопроизводительный
  • Поддержка Linux,Solaris,BSD/OSX,Win32

Функции  Ядра

  • Протокол HEP/EEP
  • SIP-сигналинг
  • WebRTC-сигналинг
  • Протокол RTCP
  • Протокол RTCP-XR
  • Коллектор журналов
  • Гео-меппинг
  • Поддержка Docker

Варианты использования Homer

На сайте Homer по адресу sipcapture.org предлагают два метода.
Первый – облачный(cloud), заказчик устанавливает у себя в сети HEP Capture Agent который копирует VoIP-трафик из сети заказчика, упаковывает в HEP пакеты, если надо шифрует при помощи SSL/TLS и отправляет в облако SIPCAPTURE.IO где находится Capture Server и Homer UI – веб-интерфейс Homer. В таком случае заказчику не придётся думать о поддержке и обновления Homer. Услуга конечно же не бесплатная, и в зависимости от пакета составляет от 80 до 500 евро в месяц.
HOMER VOIP

 

Второй – в сети заказчика(on-permise), заказчик инсталлирует, обслуживает и обновляет все компоненты Homer в своей сети. Мы рассмотрим второй вариант.

 

Требования к программному обеспечению Homer 5

  • Apache2 or Nnginx
  • PHP-5, MySQL + InnoDB (barracuda) ( >= 5.6)
  • Kamailio + sipcapture
  • Homer-API + Homer-UI

Аппаратные требования и тестирование производительности

Каких-либо официальных аппаратных требований на сайтах sipcapture.org или github.com/sipcapture я не нашёл. Для тестирования производительности, решил сравнить две копии Homer запущенные на разных серверах но с абсолютно одинаковым реальным трафиком следующего объёма:
Зеркалируемый узел: 310 одновременных вызовов в среднем. CPS  в среднем 3,48 макс 19 вызовов в секунду, все данные за сутки.
Вызовов за 24 часа примерно 650000
В основном SIP-вызовы без SIP-регистраций, OPTIONS и других сообщений свойственным терминалом.
Узел 1:
— Сервер: HP Proliant DL380 G5
— 1 CPU Xeon E5420 4 2.5 GHz 4 Cores
— RAM 8 GB DDR2 677Mhz ECC
— RAID0 2 x 2.5 SAS 10K RPM  + Controller P400 256Mbt
— 2NIC 1000Mb\sec

 HOMER VOIP
Нагрузка на машину не большая, хотя она молотит. Ниже вывод htop.

HOMER VOIP

# :/var/lib/mysql# date;du -h -c
Thu Apr 20 14:12:49 MSK 2017
676K    ./sys
22M     ./mysql
1.1M    ./performance_schema
439M    ./homer_statistic
1.1M    ./homer_configuration
71G     ./homer_data
72G     .
72G     total

72 Гигабайта за 10 дней.

Узел 2:

— Система виртуализации VMWare ESX6.5
Виртуальная машина с максимально возможными ресурсами.
— Сервер: Intel S3210SH
— Система виртуализации VMWare ESX5.5
— 1 CPU Intel Core 2 Quad Q6700 2.66 Mhz 4 Cores
— RAM 8GB DDR2 677Mhz nonECC
— 2 DISK Seagate 3.5 SATA 7.2K RPM
— 2 NIC 1000Mb\sec

На нём виртуальна машина со следующими ресурсами:
— 4 ядра процессора
— RAM 5GB

Под эту виртуальную машину зарезервирован отдельный физический диск под виртуальную машину.

HOMER VOIP

Постоянное число регистраций: 8 тысяч и 149 одновременных вызовов в среднем.

# :/var/lib/mysql# date;du -h -c
Thu Apr 20 14:11:52 MSK 2017
100G    ./homer_data
22M     ./mysql
1.1M    ./performance_schema
2.7G    ./homer_statistic
676K    ./sys
1.1M    ./homer_configuration
103G    .
103G    total

103 Гигабайта за 10 дней.

В течение двух месяцев работы система показала отличные результаты как по скорости работы так и по аппаратным ресурсам необходимым для работы.
Через несколько месяцев на второй машине накрылся жесткий диск SATA 7200
Данный диск был заменен на новый, но его через месяц постигла та же участь.
Поэтому при большой нагрузке рекомендую использовать SAS + RAID 0

Или попробовать вынести файлы базы данных Mysql на отдельный диск

Например, подклюаем отдельный диск с точкой монтирования /var/lib/mysql

cat /etc/fstab
UUID=4a439b75-c7aa-4bd6-ad27-88ff5f44d38d /var/lib/mysql  ext4    defaults        0       2

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       397G  1.9G  375G   1% /
udev             10M     0   10M   0% /dev
tmpfs           1.6G  8.6M  1.6G   1% /run
tmpfs           4.0G     0  4.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           4.0G     0  4.0G   0% /sys/fs/cgroup

# /etc/init.d/mysql stop
# mv /var/lib/mysql /var/lib/mysql_temp
# mkdir /var/lib/mysql
# mount /var/lib/mysql
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       397G  1.9G  375G   1% /
udev             10M     0   10M   0% /dev
tmpfs           1.6G  8.5M  1.6G   1% /run
tmpfs           4.0G     0  4.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           4.0G     0  4.0G   0% /sys/fs/cgroup
/dev/sdb1       413G  264M  392G   1% /var/lib/mysql

# cp -r /var/lib/mysql_temp/* /var/lib/mysql
# chown mysql:mysql -R /var/lib/mysql
# chmod 755 /var/lib/mysql
# /etc/init.d/mysql start
[ ok ] Starting mysql (via systemctl): mysql.service.
# /etc/init.d/mysql status
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled)
   Active: active (running) since Tue 2017-12-26 15:00:11 MSK; 12s ago
  Process: 12878 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
  Process: 12842 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 12881 (mysqld)
   CGroup: /system.slice/mysql.service
           └─12881 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Dec 26 15:00:11 Homer-2 systemd[1]: Started MySQL Community Server.

Если mysql запустится нормально и все файлы на месте, то можно удалить временную директорию.

# rm -rf /var/lib/mysql_temp

Инсталляция Homer

Установка состоит из двух этапов.
Первый этап. Установка самого Homer состоящего из “HEP-коллектора” в виде SIP машрутизатора Kamailio, который складывает полученные от него пакеты в БД, плюс к этому, сервер Apache2 на котором находятся файлы API-скриптов и GUI-интерфейса Homer. Именно GUI -интерфейс используя API  Homer фильтрует и «рисует» SIP-трейсы, графики и выводит прочую информацию.
Второй этап. Установка агента, который перерабатывает трейсы и статистику, приходящую из специального модуля программных SIP-серверов, таких как Asterisk, Freeswitch, Kamailio и OpenSIPS и передает по протоколу HEP в коллектор Homer. Также возможен вариант установки агента, который берет данные от зеркалированного на порты коммутатора VoIP-трафика, в таком случае неважно какой SIP-сервер используется и никакие модули на него не нужно устанавливать.

Для VMWare, создаём VM и сети.

HOMER VOIP

Создаём сети:

HOMER VOIP

Причем для Mirror-Interface, на вкладке Security для Promiscuous Mode ставим галку и выбираем Accept.

Для установки используем дистрибутив Debian 8.7(jessie), также оттестировано на Debian 9.2.

/etc/network/interfaces
source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
#iface eth0 inet dhcp
iface eth0 inet static
        address 172.17.36.37/26
        gateway 172.17.36.26
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 84.52.107.107 195.177.123.1
        post-up /sbin/route add -net 192.168.133.0/24 gw 172.17.36.62
allow-hotplug eth1
iface eth1 inet static
address 0.0.0.0

Самый простой способ и лёгкий способ выполнить команды:

#aptitude install curl (если у вас он не установлен)
# bash <( curl -s https://cdn.rawgit.com/sipcapture/homer-installer/master/homer_installer.sh )

С сайта будет автоматически загружен и выполнен скрипт homer_installer.sh, который сам всё скачает и установит. Нужно будет задать пользователя и пароль пользователя Mysql, который будет работать с БД Homer.

Сервисы:

  • Kamailio
  • Apache2
  • Сервер MySQL

Будут автоматически добавлены в автозагрузку. Диалог инсталляции будет выглядеть примерно так:

**************************************************************

      ,;;;;;,       HOMER SIP CAPTURE (http://sipcapture.org)
     ;;;;;;;;;.     Single-Node Auto-Installer (beta 5.0.1)
   ;;;;;;;;;;;;;
  ;;;;  ;;;  ;;;;   <--------------- INVITE ---------------
  ;;;;  ;;;  ;;;;    --------------- 200 OK --------------->
  ;;;;  ...  ;;;;
  ;;;;       ;;;;   WARNING: This installer is intended for
  ;;;;  ;;;  ;;;;   dedicated/vanilla OS setups without any
  ,;;;  ;;;  ;;;;   customization and with default settings
   ;;;;;;;;;;;;;
    :;;;;;;;;;;     THIS SCRIPT IS PROVIDED AS-IS, USE AT
     ^;;;;;;;^      YOUR *OWN* RISK, REVIEW LICENSE & DOCS

**************************************************************
OS: Dectecting System....
OS: DEBIAN detected
This script expect a Vanilla OS and will override settings. Continue (y/N)? y

Затем установка таких пакетов, как apache2,php5, git, cpp, gcc и  вспомогательных библиотек.	

Module php5 already enabled
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart
Generating a 2048 bit RSA private key
..................+++
.............+++
writing new private key to '/etc/ssl/localcerts/apache.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:Saint-Petersburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Westcall LTD
Organizational Unit Name (eg, section) []:Homer-1
Common Name (e.g. server FQDN or YOUR name) []:Ignat
Email Address []:i.kudryavtsev@somemail.com

Далее будут сгенерированы сертификаты для ssl.
Далее будут установлены пакеты Kamailio и БД MySQL.
После успешной установки, скрипт предложит сконфигурировать БД MySQL.

База данных: Homer_1
Пользователь БД: Homer_1
Пароль: БД:121212badrebZL

Если всё ок, в конце установки будет нечто похожее:

cp: omitting directory ‘/usr/src/homer-api/scripts/old’
cp: omitting directory ‘/usr/src/homer-api/scripts/pgsql’
no crontab for root
Enter the SQL User details for the HOMER Client: Homer_1
MYSQL Homer User: (empty for default) Homer_1_password

MYSQL Homer Pass: (empty for randomized) 121212badrebZL _
WARNING: Choose a password for MySQL ROOT account (empty by default!)
Beginning initial data load....
Starting mysqld
Starting mysql (via systemctl): mysql.service.
Creating Databases...
Creating Tables...
ERROR 1062 (23000) at line 1: Duplicate entry '1' for key 'PRIMARY'
Setting root password....
Patching Homer configuration...
Restarting apache2 (via systemctl): apache2.service.
Restarting kamailio (via systemctl): kamailio.serviceroot@homer:~# .
*************************************************************
      ,;;;;,
     ;;;;;;;;.     Congratulations! HOMER has been installed!
   ;;;;;;;;;;;;
  ;;;;  ;;  ;;;;   <--------------- INVITE ---------------
  ;;;;  ;;  ;;;;    --------------- 200 OK --------------->
  ;;;;  ..  ;;;;
  ;;;;      ;;;;   Your system should be now ready to rock!
  ;;;;  ;;  ;;;;   Please verify/complete the configuration
  ,;;;  ;;  ;;;;   files generated by the installer below.
   ;;;;;;;;;;;;
    :;;;;;;;;;     THIS SCRIPT IS PROVIDED AS-IS, USE AT
     ;;;;;;;;      YOUR *OWN* RISK, REVIEW LICENSE & DOCS

*************************************************************

     * Verify configuration for HOMER-API:
         '/var/www/html//api/configuration.php'
         '/var/www/html//api/preferences.php'

     * Verify capture settings for Homer/Kamailio:
         '/etc/kamailio/kamailio.cfg'

     * Start/stop Homer SIP Capture:
         '/sbin/kamctl start|stop'

     * Access HOMER UI:
         http://192.168.85.150 or http://192.168.85.150
         [default: admin/test123 or test1234]

     * Send HEP/EEP Encapsulated Packets:
         hep://192.168.85.150:9060

**************************************************************

 IMPORTANT: Do not forget to send Homer node some traffic! ;)
 For our capture agents, visit http://github.com/sipcapture
 For more help and information visit: http://sipcapture.org

**************************************************************
 Installer Log saved to: /tmp/homer_installer.log

Как следует из журнала установки коллектор HEP это 192.168.85.150:9060

Доступ на веб-интерфейс Homer http://192.168.85.150

Также на странице sipcapture сайта github описана ручная установка Homer. Если кратко, то она состоит из следующих этапов:
С github качаем файлы homer-api и homer-ui, ставим Apache2, копируем эти файлы в директорию Apache2. Далее, ставим MySQL-сервер, затем добавляем базы данных homer_data, homer_users, homer_configuration, homer_statistic и создаём в них структуру из соответствующих шаблонах в .sql файлах. Затем создаём пользователя mysql и даём ему полные права на эти БД, затем конфигурируем Homer API путём редактирования php файла к с конфигурацией /var/www/html/api/configuration.php, дополнительно настраиваем ротацию данных в БД homer по времени. Теперь ставим kamailio, настраиваем файл конфигурации kamailio.cfg (копируем из примера), запускаем Kamailio. Проверяем что он запущен и порт коллектора HEP, например, 9060 открыт. Проверяем, что веб-интерфейс работает, открыв IP-адрес сервера в веб-браузере. Логин и пароль по умолчанию:  admin / test123 его можно поменять в БД или посмотреть в файле шаблона schema_configuration.sql

Установка Сaptagent

Дистрибутив Linux Debian 8.7 (jessie). Установим дополнительные пакеты:

#apt-get install libexpat-dev libpcap-dev libjson0-dev libtool automake flex bison libuv-dev make

Клонирование при помощи git и компиляция:

 #cd /usr/src
 #git clone https://github.com/sipcapture/captagent.git captagent
 #cd captagent
 #./build.sh
 #./configure

Если всё ок, то будет такой результат: Если всё ок, то будет такой результат:

captagent 6.2.0.2

Build directory............. :
Installation prefix......... : /usr/local/captagent
HEP Compression............. : no
IPv6 support.................: no
HEP SSL/TLS................. : no
Flex........................ : flex
Bison....................... : bison -y

Build with REDIS............ : no
Build with MySQL............ : no
Build with PCRE............. : no
Build with LibUV............ : yes

Далее, последние команды для сборки и установки:

# make && make install

Если всё ок, ошибок не будет, по окончании будут сообщения что библиотеки успешно инсталлированы:

Libraries have been installed in:
   /usr/local/captagent/lib/captagent/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
make[5]: Leaving directory '/usr/src/captagent/src/modules/interface/http'
make[4]: Leaving directory '/usr/src/captagent/src/modules/interface/http'
make[3]: Leaving directory '/usr/src/captagent/src/modules/interface/http'
make[2]: Leaving directory '/usr/src/captagent/src'
make[1]: Leaving directory '/usr/src/captagent/src'
Making install in include
make[1]: Entering directory '/usr/src/captagent/include'
make[2]: Entering directory '/usr/src/captagent/include'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/usr/src/captagent/include'
make[1]: Leaving directory '/usr/src/captagent/include'
make[1]: Entering directory '/usr/src/captagent'
make[2]: Entering directory '/usr/src/captagent'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/usr/src/captagent'
make[1]: Leaving directory '/usr/src/captagent'

 

Настройка Captagent

Модули ядра загружаются через основной файл конфигурации captagent.xml, таким образом, они могут быть легко объединены для создания нескольких независимых цепей захвата трафика. Графически это можно представить следующим образом:

HOMER CAPTAGENT

SOCKET -> PROFILE -> CAPTURE PLAN <—> MODULES (функции)

Те мы используем, например, pcap захват трафика, тогда в файле socket_pcap.xml, прописываем в нём «ловить» SIP и  RTCP на определенном интерфейсе и определённых портах. И указываем планы захвата трафика sip_capture_plan.cfg и rtcp_capture_plan.cfg для способа захвата через pcap.

  • Файлы конфигурации: /usr/local/etc/captagent
  • Файлы Capture Plans: /usr/local/etc/captagent/captureplans
  • Файлы Modules: /usr/local/lib/captagent/modules

Итак, начнём настройку в указанной выше последовательности.

Исходные данные:

  • Устройство-приёмник для зеркалирования: eth1
  • Порт SIP: 9955
  • Порт RTCP: 10000-25999
  • Файл Capture Plan: sip_capture_plan.cfg

Настройка интерфейса eth1 для зеркалирования /etc/network/interfaces

allow-hotplug eth1
iface eth1 inet static
address 0.0.0.0

На коммутаторе Cisco 3750G

SW-3750#monitor session 1 source interface Gi1/0/2 - 7 , Gi1/0/9
SW-3750#monitor session 1 destination interface Gi1/0/25

Настройка PROFILE. Основная конфигурация находится в файле /usr/local/captagent/etc/captagent/captagent.xml. По умолчанию данный файл конфигурации редактировать не нужно.
Настройка SOCKET. Проверим и изменим конфигурацию в файле /usr/local/captagent/etc/captagent/socket_pcap.xml

<profile name="socketspcap_sip" description="HEP Socket" enable="true" serial="2014010402">
<settings>
<param name="dev" value="any"/>
<param name="promisc" value="true"/>
<param name="reasm" value="false"/> // comments here to explain the option?
<param name="tcpdefrag" value="false"/> // comments here to explain the option?
<param name="capture-plan" value="sip_capture_plan.cfg"/>
<param name="filter">
<value>portrange 9955</value>
</param>
</settings>
</profile>

Обращаю внимание, что значение может не сработать, тогда нужно указывать конкретный интерфейс, например, eth1. Если нужно поставить более точный фильтр можно сделать так:

portrange 9955 and host 90.90.90.90
portrange 5060-5090 and (host 10.0.0.1 or host 10.0.0.2)

Плюс к этому настроим RTCP статистику в том же файле:

<profile name="socketspcap_rtcp" description="RTCP Socket" enable="false" serial="2014010402">
<settings>
<param name="dev" value="eth1"/>
<param name="promisc" value="true"/>
<param name="reasm" value="false"/>
<!-- size in MB -->
<param name="ring-buffer" value="20"/>
<!-- for rtp && rtcp < 250 -->
<param name="snap-len" value="256"/>
<param name="capture-filter" value="rtcp"/>
<param name="capture-plan" value="rtcp_capture_plan.cfg"/>
<param name="filter">
<value>portrange 10000-25999 and len >=50 </value>
</param>
</settings>
</profile>
</module>
</document>

В данном файле указывается устройство dev=eth1 откуда снимать трафик и разрешить неразборчивый режим promisc=true. Также в строках:

<profile name="socketspcap_sip" description="HEP Socket" enable="true" serial="2014010402">
<profile name="socketspcap_rtcp" description="RTCP Socket" enable="false" serial="2014010402">

Параметр enable должен стоять «true» иначе не будет работать!!!

Примечание: В версии 6.2.11 если sip(порт 9955) и rtcp(10000-25999) включить одновременно, то возникает ошибка – по HEP не улетает ни одного сообщения в коллектор kamailio, хотя диапазоны портов не пересекаются. Если они пересекутся, то официально это не рабочая схема.
Настройка CAPTURE PLAN. Теперь переходим к /usr/src/captagent/conf/captureplans/sip_capture_plan.cfg

capture[pcap] {
# Perform checks against source/destination IP/port, message size
if(msg_check("size", "100")) {
if(source_ip(“10.0.0.99”)) { drop; }
# Parse the Message
if(parse_sip()) {
# Send using one or multiple profiles defined in transport_hep.xml
if(!send_hep("hepsocket")) {
clog("ERROR", "Error sending HEP!!!!");
}
}
}
drop;
}

Тут ничего менять не надо, если конфигурация по умолчанию устраивает. Здесь же, как и в файле captagent.xml, можно устанавливать фильтры на трафик, наподобие if(source_ip(“10.0.0.99”)) { drop; }

Настройка Transport Modules. Далее, переходим к конфигурации транспортного сокета. Транспортный сокет необходим для доставки инкапсулированных пакетов в коллектор сервера Homer. Файл конфигурации /usr/local/captagent/etc/captagent/transport_hep.xml В нашем случае, файл будет выглядеть так:

<?xml version="1.0"?>
<document type="captagent_module/xml">
<module name="transport_hep" description="HEP Protocol" serial="2014010402">
<profile name="hepsocket" description="Transport HEP" enable="true" serial="2014010402">
<settings>
<param name="version" value="3"/>
<param name="capture-host" value="127.0.0.1"/>
<param name="capture-port" value="9060"/>
<param name="capture-proto" value="udp"/>
<param name="capture-id" value="2001"/>
<param name="capture-password" value=" "/>
<param name="payload-compression" value="false"/>
</settings>
</profile>
</module>
</document>

То есть, конфигурация говорит, что коллектор сервера Homer находится по адресу 127.0.0.1, порт 9060, пароль пустой.

Настройка Protocol Modules. Модули протоколов загружаются из файла /usr/local/captagent/etc/captagent/captagent.xml

<configuration name="modules.conf" description="Modules">
<modules>
...
<load module="transport_hep" register="local"/>
<load module="protocol_sip" register="local"/>
<load module="database_hash" register="local"/>
<load module="protocol_rtcp" register="local"/>>
<load module="socket_pcap" register="local"/> 
...
</modules>
</configuration>

Тут можно всё оставить по умолчанию и проверить что загружаются модули SIP и RTCP. Теперь необходимо настроить ротацию данных в БД Homer, если этого не сделать, то на рабочей системе размеры БД могут достигнуть огромных размеров что скажется не только на объёме свободного на диске, но и на скорости обработки и выдачи поисковых запросов в веб-интерфейсе Homer. Для этого запускаем редактор cron, командой crontab -e, и проверяем наличие строки:

30 3 * * * /opt/homer/homer_rotate >> /var/log/cron.log 2>&1

которая указывает что нужно ежедневно, в 3-30 нужно выполнять скрипт ротации /opt/homer/homer_rotate. В данном скрипте, есть ссылка на /opt/homer/rotation.ini, где настраивается сколько дней какие данные требуется хранить. Нас интересует раздел, DATA_TABLE_ROTATION, в котором всё понятно без дополнительных комментариев.

[DATA_TABLE_ROTATION]
    #how long data keeps
    sip_capture_call = 10 #days
    sip_capture_registration = 10 # 10 days
    sip_capture_rest = 10 # 10 days
    rtcp_capture = 10 # days
    logs_capture = 10 # days
    report_capture = 10 # days
    webrtc_capture_all = 10 # days
    isup_capture_all = 10

Обращаю внимание, что в разделе [MYSQL] находятся данные для подключения к БД Homer, которые используются для ротации.
Запуск Captagent. Исполняемый файл находится по следующему пути:

/usr/local/captagent/sbin/captagent

Проверим версию:

#./captagent -v
version: 6.2.0.2

Параметры запуска могут быть следующие:

./captagent -h
usage: captagent <-vh> <-f config>
   -h  is help/usage
   -v  is version information
   -f  is the config file
   -D  is use specified pcap file instead of a device from the config
   -c  is checkout
   -d  is daemon mode
   -n  is foreground mode
   -K  is hardware key of your system

Самый простой вариант запуска:

#/usr/local/captagent/sbin/captagent -f /usr/local/captagent/etc/captagent/captagent.xml -n

Для отладки такой способ запуска полезен, вот пример запуска с ошибкой в конфигурации:

root@homer-1:/usr/local/captagent/sbin# ./captagent -f /usr/local/captagent/etc/captagent/captagent.xml
[NOTICE] Loaded core config
[ERR] socket_pcap.c:657 Failed to compile filter "portrange 9955,5060": illegal token: ,
[ERR] protocol_sip.c:377 sipPacket CALLID has 0 len
[ERR] protocol_sip.c:353 SIP PARSE ERROR [-1]

[ERR] protocol_sip.c:372 bad parsing
[ERR] protocol_sip.c:353 SIP PARSE ERROR [-1]

[ERR] protocol_sip.c:372 bad parsing
[ERR] protocol_sip.c:353 SIP PARSE ERROR [-1]

Или вот такая ошибка:

[ERR] protocol_sip.c:133 Couldnot find this call

IS RTCP

[DEBUG] database_hash.c:165 IP PORT: 192.168.250.250:10535
[DEBUG] database_hash.c:280 IP PORT: [192.168.250.250:10535]
[DEBUG] database_hash.c:280 IP PORT: [192.168.250.245:25363]

Тут проблема в том, что коллектор получает RTCP статистику и не может понять к чему она относится. В интернете чаще всего пишут, что причина в том, что диапазоны RTCP и SIP портов пересекаются. У меня проблема оказалось что по дебагу запуска captagent в профилях socketspcap_sip и socketspcap_rtcp, нужно выставить параметр enable=»true», а в конфигурации по умолчанию стояло false именно для SIP.

…
[DEBUG] socket_pcap.c:609 Activated device: [eth1]

[NOTICE] Using filter: (portrange 10000-25999 and len >=50 ) and (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80 and udp[9] >= 0xc8 && udp[9] <= 0xcc)
[DEBUG] conf_function.c:453 find_export_record: found  in module protocol_sip [/usr/local/captagent/lib/captagent/modules]
…

Явно грузился только RTCP фильтр в файле socket_pcap.xml. Плюс к этому, в основном файле конфигурации captagent.xml можно установить параметра более высокий, например, 9, тогда отладочные сообщения будут выводиться более детальными. Но это не очень удобно. Поэтому сделаем авто запуск captagent и добавим стартовый скрипт. Переходим в директорию, где находятся исходники captagent и копируем init.d скрипт, затем меняем права доступа к нему:
#cp /usr/src/captagent/init/deb/debian/captagent.init /etc/init.d/captagent
#chmod 755 /etc/init.d/captagent
В скрипте /etc/init.d/captagent проверим значения:

DAEMON=/usr/local/captagent/sbin/captagent
CFGFILE=/usr/local/captagent/etc/captagent/captagent.xml
#USER=captagent
#GROUP=captagent

Обращаю внимание что пользователь и группа закомментированы. Тк они не существуют. Также копируем конфигурационный файл для запуска captagent в /etc/default/
#cp /usr/src/captagent/init/deb/debian/captagent.default /etc/default/captagent
В данном файле /etc/default/captagent проверим настройки:

# Set to yes to enable captagent, once configured properly.
RUN_CAPTAGENT=yes

# Config file
CFGFILE=/usr/local/captagent/etc/captagent/captagent.xml

Добавим созданный скрпипт в автозапуск #update-rc.d captagent defaults Если требуется удалить скрипт из автозапуска:
# update-rc.d -f captagent remove
Теперь после перезагрузки системы captagent будет запускаться автоматически. Если требуется перезапустить вручную:
# /etc/init.d/captagent restart
[ ok ] Restarting captagent (via systemctl): captagent.service.
Советую перезагрузить машину и проверить сервис автоматически стартует. После успешного запуска, проверим корректность работы captagent 1) Что отзеркалированный трафик приходит на порт eth1:

root@homer: # tshark -i eth1 -f "port 9955" -Y "sip"
  3   0.605801 192.168.85.148 -> 84.52.103.XX SIP 485 Request: REGISTER sip:84.52.103.XX:9955  (remove 1 binding) |
  4   0.607631 84.52.103.XX -> 192.168.85.148 SIP 549 Status: 200 Ok  (removed 2 bindings) |
  5   1.879704 192.168.85.148 -> 84.52.103.XX SIP 585 Request: REGISTER sip:84.52.103.XX:9955  (1 binding) |
  6   1.881698 84.52.103.37 -> 192.168.85.148 SIP 534 Status: 401 Unauthorized |
  7   1.882641 192.168.85.148 -> 84.52.103.XX SIP 766 Request: REGISTER sip:84.52.103.XX:9955  (1 binding) |
  8   1.966359 84.52.103.XX -> 192.168.85.148 SIP 553 Status: 200 Ok  (1 binding) |

Отлично, трафик есть. Теперь, то, что captagent отправляет трафик в коллектор Homer:

#:/usr/local/captagent/etc/captagent# tshark -i lo -f "port 9060"
  1   0.000000    127.0.0.1 -> 127.0.0.1    UDP 590 Source port: 56044  Destination port: 9060
  2   0.000659    127.0.0.1 -> 127.0.0.1    UDP 654 Source port: 56044  Destination port: 9060
  3   1.191771    127.0.0.1 -> 127.0.0.1    UDP 690 Source port: 56044  Destination port: 9060
  4   1.193478    127.0.0.1 -> 127.0.0.1    UDP 639 Source port: 56044  Destination port: 9060

Трафик есть. Можно использовать команду с ключом (-V), чтобы убедиться, что приходит содержимое SIP-пакетов и RTCP-статистика. Также можно сравнить сколько сообщений на интерфейс:

tshark -i eth1 -f "host 109.167.135.20" -V | grep @192_168_1_169

И сколько отправлено по HEP:

tshark -i any -f "port 9060" -V | grep @192_168_1_169
mysql> select * from homer_data.sip_capture_call_20171110 where callid='62507640C928E0E9AD0249F00C4AF61B';
mysql>  select * from homer_data.sip_capture_call_20171110 where callid like '%192_168_1_169%';

На этом настройка закончена.

Поддержка  GeoIP

GeoIP позволяет отслеживать из каких стран от клиентов приходит SIP-трафик. В Debian, проверим что пакеты ниже установлены в системе:

# apt-get install geoip-database geoip-database-extra

В файле /etc/kamailio/kamailio.cfg находим

##!define WITH_HOMER_GEO

Проверяем что есть:

#!ifdef WITH_HOMER_GEO
modparam("geoip", "path", "/usr/share/GeoIP/GeoIPCity.dat")
#!endif

Для версии MySQL больше 5.7 в конфигурационном файле my.cnf редактируем его, в моём случае /etc/mysql/mysql.conf.d/mysqld.cnf

В секции [mysqld]
добавил
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLE

Плюс сразу же добавил
bind-address    = 172.17.36.37

В веб-интерфейсе Homer выглядит как карта с “температурой” количества регистраций по странам мира :

HOMER web interface

 

У себя на абонентском сервере я этот функционал в итоге отключил.

Возможные проблемы

Не подходит пароль по умолчанию. Установленный по умолчанию пароль можно посмотреть в шаблоне БД который копировался в БД Homer.

$GIT/homer-api/sql/schema_configuration.sql

Если вы зашли в в веб-интерфейс(admin / test123), а там «No Data Available».

HOMER web interface

При этом вы уверены в следующем: Трафик от агента поступает в коллектор и настройки фильтрации по временному интервалу для этого трафика установлены корректно. То нужно проверить следующее:
Настройки в Panels -> System Admin , апплет Admin Node. Здесь находим запись нужную нам, например, с id 1.

HOMER web interface

Затем, смотрим учётные данные.

HOMER web interface

Проверяем учётную запись:

# mysql -uhomer_user -pmysql_password
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'homer_user'@'localhost' (using password: YES)

Заходим под root и проверяем пользователей:

mysql> select User from mysql.user;
+-----------+
| User      |
+-----------+
| homer     |
| mysql.sys |
| root      |
+-----------+
3 rows in set (0.00 sec)

Видим, что такого пользователя нет.

mysql> show grants for homer;
+--------------------------------------------+
| Grants for homer@%                         |
+--------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'homer'@'%' |
+--------------------------------------------+
1 row in set (0.00 sec)

Посмотреть пароль для пользователя homer можно в конфигурации kamailio, файл /etc/kamailio/kamailio.cfg, строки:

#!substdef "!HOMER_DB_USER!homer!g"
#!substdef "!HOMER_DB_PASSWORD!0msFqy2RF!g"
#!substdef "!HOMER_DB_HOST!127.0.0.1!g"
#!substdef "!HOMER_LISTEN_PROTO!udp!g"
#!substdef "!HOMER_LISTEN_IF!0.0.0.0!g"
#!substdef "!HOMER_LISTEN_PORT!9060!g"

Пароль 0msFqy2RF

Проверяем:

# mysql -uhomer -p0msFqy2RF

Список БД:

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| homer_configuration |
| homer_data          |
| homer_statistic     |
| mysql               |
| performance_schema  |
| sys                 |
+---------------------+
7 rows in set (0.00 sec)

Заодно проверим сохраняются ли данные из коллектора:

mysql> homer_data;
mysql> select * from  homer_data.sip_capture_call_20170208 limit 1;

+----+---------------------+------------------+--------+--------------+-----------------------------------+-------------+--------------+-------------+--------------+----------------------------------+-------------+--------------+--------+----------+--------------+-----------+----------------------------------+-------------+-----------------------------------------------------------------------------------------+-------------------------------------------+--------------+-----------+--------+-----------------+------+-----------------+----------------+-------------+----------------+------------------+----------------+--------------+---------------+-----------------+---------+----------------------------------+---------------+---------------+---------------+-------+--------+----------+------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | date                | micro_ts         | method | reply_reason | ruri                              | ruri_user   | ruri_domain  | from_user   | from_domain  | from_tag                         | to_user     | to_domain    | to_tag | pid_user | contact_user | auth_user | callid                           | callid_aleg | via_1                                                                                   | via_1_branch                              | cseq         | diversion | reason | content_type    | auth | user_agent      | source_ip      | source_port | destination_ip | destination_port | contact_ip     | contact_port | originator_ip | originator_port | expires | correlation_id                   | custom_field1 | custom_field2 | |
+----+---------------------+------------------+--------+--------------+-----------------------------------+-------------+--------------+-------------+--------------+----------------------------------+-------------+--------------+--------+----------+--------------+-----------+----------------------------------+-------------+-----------------------------------------------------------------------------------------+-------------------------------------------+--------------+-----------+--------+-----------------+------+-----------------+----------------+-------------+----------------+------------------+----------------+--------------+---------------+-----------------+---------+----------------------------------+---------------+---------------+---------------+-------+--------+----------+------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  1 | 2017-02-08 14:52:50 | 1486554770263477 | INVITE |              | sip:79627277780@84.52.103.XX:9955 | 79627277780 | 84.52.103.XX | 327$td | 84.52.103.XX | 81d174040f934c7cbe2702c755b52a79 | 79627277780 | 84.52.103.XX |        |          | 327$td  |           | bee940acfd204d13a6b1347c34104daa |             | SIP/2.0/UDP 192.168.85.148:50933;rport;branch=z9hG4bKPj556ce0e730e84e38b7513b761e8005c4 | z9hG4bKPj556ce0e730e84e38b7513b761e8005c4 | 24262 INVITE |           |        | application/sdp |      | MicroSIP/3.11.0 | 192.168.85.148 |       50933 | 84.52.103.XX   |             9955 | 192.168.85.148 |        50933 |               |               0 |      -1 | bee940acfd204d13a6b1347c34104daa |               |               |               |     1 |      2 |          |    1 | homer01:0 | INVITE sip:79627277780@84.52.103.XX:9955 SIP/2.0
Via: SIP/2.0/UDP 192.168.85.148:50933;rport;branch=z9hG4bKPj556ce0e730e84e38b7513b761e8005c4
Max-Forwards: 70
From: ;tag=81d174040f934c7cbe2702c755b52a79
To: 
Contact: 
Call-ID: bee940acfd204d13a6b1347c34104daa
CSeq: 24262 INVITE
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Supported: replaces, 100rel, timer, norefersub
Session-Expires: 1800
Min-SE: 90
User-Agent: MicroSIP/3.11.0
Content-Type: application/sdp
Content-Length:   554

v=0
o=- 3695554377 3695554377 IN IP4 192.168.1.239
s=pjmedia
b=AS:84
t=0 0
a=X-nat:0
m=audio 4008 RTP/AVP 117 107 9 8 0 110 96 97 3 18 101
c=IN IP4 192.168.1.239
b=TIAS:64000
a=rtcp:4009 IN IP4 192.168.1.239
a=sendrecv
a=rtpmap:117 speex/16000
a=rtpmap:107 SILK/16000
a=rtpmap:9 G722/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:110 speex/8000
a=rtpmap:96 SILK/8000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=30
a=rtpmap:3 GSM/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
 |
+----+---------------------+------------------+--------+--------------+-----------------------------------+-------------+--------------+-------------+--------------+----------------------------------+-------------+--------------+--------+----------+--------------+-----------+----------------------------------+-------------+-----------------------------------------------------------------------------------------+-------------------------------------------+--------------+-----------+--------+-----------------+------+-----------------+----------------+-------------+----------------+------------------+----------------+--------------+---------------+-----------------+---------+----------------------------------+---------------+---------------+---------------+-------+--------+----------+------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select id,date,method from  homer_data.sip_capture_call_20170208 order by date desc limit 10;
+----+---------------------+--------+
| id | date                | method |
+----+---------------------+--------+
|  5 | 2017-02-08 14:52:50 | 100    |
|  6 | 2017-02-08 14:52:50 | 100    |
| 20 | 2017-02-08 14:53:02 | 100    |
| 22 | 2017-02-08 14:53:02 | 100    |
| 35 | 2017-02-08 14:53:34 | 100    |
| 36 | 2017-02-08 14:53:34 | 100    |
| 50 | 2017-02-08 14:55:03 | 100    |
| 51 | 2017-02-08 14:55:04 | 100    |
|  9 | 2017-02-08 14:52:52 | 200    |
| 12 | 2017-02-08 14:52:52 | 200    |
+----+---------------------+--------+
10 rows in set (0.00 sec)

mysql> select id,date,method from  homer_data.sip_capture_registration_20170208 order by date desc limit 10;
+----+---------------------+--------+
| id | date                | method |
+----+---------------------+--------+
|  2 | 2017-02-08 14:53:29 | 200    |
|  3 | 2017-02-08 14:58:24 | 200    |
|  5 | 2017-02-08 15:03:19 | 200    |
|  7 | 2017-02-08 15:08:14 | 200    |
|  9 | 2017-02-08 15:10:45 | 200    |
| 14 | 2017-02-08 15:10:46 | 200    |
| 15 | 2017-02-08 15:12:24 | 200    |
| 20 | 2017-02-08 15:12:26 | 200    |
| 21 | 2017-02-08 15:17:21 | 200    |
| 23 | 2017-02-08 15:22:16 | 200    |
+----+---------------------+--------+
10 rows in set (0.00 sec)

Теперь с учётом данных настроек, правим пользователя, также можно поправить имя ноды.

HOMER web interface

Вторую запись «external» – пример подключения ноды с БД MySQL находящуюся на внешнем сервере, можно деактивировать или удалить.

Включение HEP на Asterisk

Очень просто, но поддерживается только pjsip стек!!! С обычным sip который используется у многих HEP работать не будет!!! Asterisk версий 12+ в Проверяем что модули загружены:

asterisk*CLI> module show like res_hep
Module                         Description                              Use Count  Status      Support Level
res_hep.so                     HEPv3 API                                0          Running          extended
res_hep_rtcp.so                RTCP HEPv3 Logger                        0          Running           unknown

Далее, редактируем /etc/asterisk/hep.conf

;
; res_hep Module configuration for Asterisk
;

; All settings are currently set in the general section.
[general]
enabled = yes                       ; Enable/disable forwarding of packets to a
                                   ; HEP server. Default is "yes".
capture_address = 172.17.36.36:9060 ; The address of the HEP capture server.
capture_password = foo             ; If specified, the authorization passsword
                                   ; for the HEP server. If not specified, no
                                   ; authorization password will be sent.
capture_id = 1235                  ; A unique integer identifier for this
                                   ; server. This ID will be embedded sent
                                   ; with each packet from this server.
uuid_type = call-id                ; Specify the preferred source for the Homer
                                   ; correlation UUID. Valid options are:
                                   ; - 'call-id' for the PJSIP SIP Call-ID
                                   ; - 'channel' for the Asterisk channel name

Применяем конфигурацию:

asterisk*CLI> module reload res_hep.so
Module 'res_hep.so' reloaded successfully.
    -- Reloading module 'res_hep.so' (HEPv3 API)
  == Parsing '/etc/asterisk/hep.conf': Found
asterisk *CLI> module reload res_rtp_asterisk.so
Module 'res_rtp_asterisk.so' reloaded successfully.
    -- Reloading module 'res_rtp_asterisk.so' (Asterisk RTP Stack)

Отправка трафика в коллектор при помощи sngrep и sipgrep

sngrep -H udp:192.168.85.150:9060 -N –q
sipgrep  -H 192.168.85.150:9060

sngrep -H udp:172.17.36.36:9060 -N –q
sipgrep  -H 172.17.36.36:9060

Ограничение в выдаче поиска на 100 записей

Нужно добавить поле «Add Form Field» с именем Limit Query. По умолчанию оно равно 100, далее изменить на нужное значение. Пример ниже.

HOMER web interface

Что делать если Homer теряет пакеты

Ответ: увеличивать производительность. Чаще всего слабое место – дисковая подсистема. Если трафика много, то нагрузка на неё сильно возрастает. Самый простой способ посмотреть что происходит можно при помощи утилиты iotop:

#iotop
Total DISK READ :       0.00 B/s | Total DISK WRITE :       4.81 M/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       4.84 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
  328 be/3 root        0.00 B/s    0.00 B/s  0.00 % 95.36 % [jbd2/sdb1-8]
  630 be/4 mysql       0.00 B/s    0.00 B/s  0.00 %  4.54 % mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  921 be/4 mysql       0.00 B/s   92.40 K/s  0.00 %  4.44 % mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  635 be/4 mysql       0.00 B/s    4.29 M/s  0.00 %  3.04 % mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  932 be/4 mysql       0.00 B/s  161.70 K/s  0.00 %  0.76 % mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  925 be/4 mysql       0.00 B/s   80.85 K/s  0.00 %  0.61 % mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  927 be/4 mysql       0.00 B/s  100.10 K/s  0.00 %  0.18 % mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  929 be/4 mysql       0.00 B/s   88.55 K/s  0.00 %  0.17 % mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  607 be/4 root        0.00 B/s    3.85 K/s  0.00 %  0.00 % rsyslogd -n [rs:main Q:Reg]

Total DISK WRITE : 4.81 M/s

Способ 0. Не писать не нужные пакеты.

Для этого отключим запись OPTIONS, Notify и всё остальное. Также GeoIP Все метоты типа OPTIONS и другие сливаются в таблицы ip_capture_rest_годмесяцдень. Посмотрим такую таблицу:

mysql> select date,method  from sip_capture_rest_20180510 ORDER BY date desc limit 5;
+---------------------+-----------+
| date                | method    |
+---------------------+-----------+
| 2018-05-10 14:04:57 | 501       |
| 2018-05-10 14:04:57 | NOTIFY    |
| 2018-05-10 14:04:57 | 404       |
| 2018-05-10 14:04:57 | SUBSCRIBE |
| 2018-05-10 14:04:56 | 501       |
+---------------------+-----------+
5 rows in set (0.01 sec)

Видим, что туда оно и пишется. Открываем kamailio.cfg и меняем строки:

route[STORE] {

        if($rm == "REGISTER") {
                $var(table) = "sip_capture_registration";.......
	drop; #DROP registrations!!!
        }
        else if($rm =~ "(INVITE|UPDATE|BYE|ACK|PRACK|REFER|CANCEL)$")
        {
                $var(table) = "sip_capture_call";
        }.
        else if($rm =~ "(NOTIFY)$" && is_present_hf("Event") && $hdr(Event)=~"refer;")
        {
        #        $var(table) = "sip_capture_call";
	drop; # DROP NOTIFY PACKETS!
        }
        else if($rm =~ "(INFO)$")
        {
                $var(table) = "sip_capture_call";
        }
        else if($rm =~ "(OPTIONS)$" )
        {
        #    $var(table) = "sip_capture_rest";
	drop; # DROP OPTIONS PACKETS!
        }
        else {...
        #    $var(table) = "sip_capture_rest";
	drop; #DROP OTHER!!!!
        }

Можно также частично или полностью отключить регистрации Например, не принимать пакеты REGISER из локальных сетей, редактируем kamailio.cfg:

              if($rm == "REGISTER") {

if(src_ip=~ "192.168.|172.2|10.25") {
drop;
}
                $var(table) = "sip_capture_registration";
#drop; #DROP registrations!!!
        }

Проверяем:

use homer_data;
mysql> select date,method,source_ip  from sip_capture_registration_20180510 ORDER BY date desc limit 20;
+---------------------+----------+----------------+
| date                | method   | source_ip      |
+---------------------+----------+----------------+
| 2018-05-10 17:37:27 | REGISTER | XX.250.251.34  |
| 2018-05-10 17:37:27 | REGISTER | XX.244.27.158  |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | REGISTER | XX.187.187.229 |
| 2018-05-10 17:37:27 | REGISTER | XX.138.73.46   |
| 2018-05-10 17:37:27 | REGISTER | XX.203.170.220 |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | REGISTER | XX.249.183.10  |
| 2018-05-10 17:37:27 | REGISTER | XX.244.27.158  |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | REGISTER | XX.244.27.158  |
| 2018-05-10 17:37:27 | REGISTER | XX.244.27.158  |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | 401      | XX.52.103.50   |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | 200      | XX.52.103.50   |
| 2018-05-10 17:37:27 | REGISTER | XX.244.27.158  |
+---------------------+----------+----------------+
20 rows in set (0.00 sec)

Регистрации из серых сетей 192.168.|172.2|10.25 действительно исчезли.

Способ 1. Можно перенести БД на отдельный физический диск.

Способ 2. Частичное или полное отключение журналирования файловой системы.

О режимах журналирования ФС: О режимах: Режим data=writeback > файловая система не производит какого либо журналирования данных. При неожиданных перезагрузках системы это может вызвать потерю данных в обновляемых файлах. Данный режим обеспечивает самую высокую производительность. Режим data=ordered > файловая система журналирует только метаданные (данные и метаданные группируются в один модуль – транзакцию). Этот режим, хотя без гарантии, защищает данные при неожиданной перезагрузке, в отличие от предыдущего. Тем не менее полного журналирования не происходит. Производительность уступает data=writeback, но она гораздо быстрее полного журналирования. Режим data=journal > обеспечивает полное журналирование метаданных и самих данных. Данные сначала пишутся в журнал и потом только переносятся на постоянное место. При аварийных ситуациях журнал можно перечитать – приведя данные в непротиворичивое состояние. Данный режим самый медленный, но в отдельных случаях он показывает хорошие результаты. Он имеет преимущества при одновременных операциях ввода/вывода данных (при записи и одновременном чтении, скорость чтения в тестах была выше на порядок чем при других режимах). Попробуем:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       397G  2.2G  375G   1% /
udev             10M     0   10M   0% /dev
tmpfs           1.6G  149M  1.5G  10% /run
tmpfs           4.0G     0  4.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           4.0G     0  4.0G   0% /sys/fs/cgroup
/dev/sdb1       413G   17G  376G   5% /var/lib/mysql

# /etc/init.d/captagent stop
[ ok ] Stopping captagent (via systemctl): captagent.service.
# /etc/init.d/kamailio stop
[ ok ] Stopping kamailio (via systemctl): kamailio.service.
# /etc/init.d/mysql stop
[ ok ] Stopping mysql (via systemctl): mysql.service.

В /etc/fstab выставляем data=ordered для нашего раздела mysql

UUID=4a439b75-c7aa-4bd6-ad27-88ff5f44d38d /var/lib/mysql  ext4    defaults,data=ordered        0       2

# umount /dev/sdb1
# tune2fs -o journal_data_ordered /dev/sdb1
# tune2fs 1.42.12 (29-Aug-2014)
# e2fsck -f /dev/sdb1
# e2fsck -f /dev/sdb1
e2fsck 1.42.12 (29-Aug-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdb1: 485/27475968 files (13.2% non-contiguous), 5957890/109886720 blocks

Проверить как работает:

# dumpe2fs /dev/sdb1 | more
Default mount options:    journal_data_ordered user_xattr acl

# mount /dev/sdb1

# cat /var/log/messages
Dec 28 17:00:02 Homer-2 kernel: [174342.839424] EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)

# /etc/init.d/mysql start
# /etc/init.d/kamailio start
# /etc/init.d/captagent start

Режим отключения журналирования.

Очень осторожно, операционная система может не загрузиться. Если мы меняем настройку – ключ ядра, то после старта система пытается проверять раздел sdb и в итоге не грузится вообще. С режимом полного отключения журналирования в журалируемой ФС надо быть крайне осторожным.

# nano /etc/default/grub.cfg

Добавляем в существующие строки:

GRUB_CMDLINE_LINUX="rootflags=data=writeback"

Обновляем grub.

sudo update-grub

Правим fstab:

mcedit /etc/fstab

В моём случае, добавляем data=writeback:

# /var/lib/mysql was on /dev/sdc1 during installation

 UUID=4a439b75-c7aa-4bd6-ad27-88ff5f44d38d /var/lib/mysql ext4 defaults,data=writeback 0 2
 
Выполняем:

  tune2fs -o journal_data_writeback /dev/sdb1

Проверяем:

tune2fs -l /dev/sdb1

Этот метод чреват тем, что можете потерять некоторые данные при неожиданном выключении системы, например если у вас неожиданно отключилось питание(мне это не грозит, поскольку у меня ещё батарея есть)

Веб-интерфейс Homer

Открываем IP-адрес сервера в веб-браузере, логин и пароль по умолчанию:  admin / test123.
После успешной авторизации мы попадаем в главное меню где размещаются настраиваемые виджеты

HOMER web interface

 

Виджет вверху слева – быстрый поиск, справа – график количества различных SIP-сообщений за указанный интервал. Сам интервал выбирается в верхнем правом углу. С выбором интервала нужно быть очень внимательным. Система запоминает какой  интервал был выбран даже после повторной авторизации. Так, после повторного входа через месяц установиться временной интервал месячной давности. Он же будет использован при поиске SIP-трейсов и отображения статистики, со всеми вытекающими “No Data Available”.

Меню выбора даты выглядит вот так:

HOMER web interface

Выставляем нужный интервал и интервал по шаблону. Можно выставить авто обновление диапазона времени. Основное меню выглядит следующим образом:

HOMER web interface

SIP-search – меню поиска по сохранённым SIP-трейсам. Ниже форма поиска, она настраивается.

HOMER web interface

Поиск можно осуществлять как по одному из полей так и по их комбинации “И”. Можно использовать не точный поиск  наподобие %7962727%.
Значение параметра Limit Query определяет какое максимальное количество результатов будет выдаваться за раз. Обращаю внимание на параметр DB Node. В Homer можно подключить кроме локальной БД, любое количество внешних БД и одновременно искать в них нужные трейсы. Например, у меня есть две инсталляции Homer с двумя отдельными БД, я подключил обе БД в веб-интерфейсе и могу искать нужные мне вызовы или в одной или сразу в двух БД. Это очень удобно. Таким образом можно агрегировать огромный объём трафика и разделить нагрузку и ускорить поиск нужных данных.

Не забыть проверить:

root@homer-2:/etc/mysql/conf.d#  netstat -anp | grep mysql
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      12015/mysqld

nano /etc/mysql/mysql.conf.d/mysqld.cnf

#bind-address = 127.0.0.1
bind-address = 0.0.0.0


root@homer-2:/etc/mysql/mysql.conf.d# /etc/init.d/mysql restart
[ ok ] Restarting mysql (via systemctl): mysql.service.
root@homer-2:/etc/mysql/mysql.conf.d# netstat -anp | grep mysql
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      12219/mysqld

Ищем по двум БД:

HOMER web interface

Получаем следующий вывод:

HOMER web interface

Мы нашли SIP-трейсы для указанного номера на двух узлах. При нажатии на CallID вызова всплывает модальное окно с детальным обменом SIP-сообщениями.

HOMER web interface

Здесь есть 3 вкладки, собственно Call-Flow это сам трейс. Он представлен в графическом виде, стрелками указаны направления сообщений – кто инициатор и кто получатель. При нажатии на каждое из SIP-сообщений диалога открывается его полный листинг(вкладка Messages)

HOMER web interface

На вкладке Details представлены все поля по которым может быть найдено сообщение. В примере ниже на изображении часть из них.

HOMER web interface

Рассмотрим другие вкладки.

Вкладка QoS Reports показывает RTP статистику:

HOMER web interface

Вкладка Export служит для экспорта вызова в различных форматах

HOMER web interface

  • PCAP дамп
  • Текстовый файл
  • Изображение png
  • Архивом
  • Share Cloud и Share Link крайне удобно чтобы просто отправить ссылку но настраивается отдельно.

Следующий пункт меню Alarm Settings.

Здесь можно добавить оповещение администратора о том что превышена заданное число тех или иных сообщений

HOMER web interface

Пункт Geo Chart отображает статистику по IP-адресам на карте мира.
Пункт Get Started – краткий обзор веб-интерфейса
Пункт Stats: VoIP Traffic – статистика по трафику за заданный интервал.

HOMER web interface

Пункт System Admin. Здесь настраиваются:

  • Пользователи и их права. Каждый пользователь может настроить персонально виджеты и их расположение.
  • Алиасы узлов, например, чтобы в выдаче поиска вместо его IP-адреса 10.10.10.10 Homer показывал алиас 3053_CCM6-pub
  • БД Homer

HOMER web interface

Вкладка IP-network показывает статистику по IP.

HOMER web interface

 

Homer также имеет API при помощи которых можно получить нужную информацию путём HTTP запросов в формате JSON.

Выводы

Homer является отличным бесплатным решением для анализа SIP-трафика. Уже сегодня  активно используется различными компаниями и операторами связи.

Плюсы

  • Простота установки и настройки
  • Отсутствие лицензирования
  • “Перемалывает” большие объёмы трафика
  • Хорошая визуализация SIP-трейсов
  • Возможность экспорта SIP-трейсов в различные форматы

Минусы

  • Отсутствие подробной документации
  • Требователен к дисковой подсистеме
  • “Тихая” потеря трафика при высокой нагрузке

Автор: Игнат Кудрявцев

Tags: , , ,

Оставить комментарий

Напишите Ваш комментарий ниже. Также Вы можете подписаться на комментарии к материалу через RSS

Вы можете использовать следующие теги:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Мы поддерживаем Gravatar.

Контроль спама: *