Обзор Homer 5
Всем известно, что Гомер Симпсон (Homer Simpson) любит есть, Гомер, о котором пойдёт речь сегодня, также обожает есть, но не пончики, а SIP-трафик и то, что к нему полагается. И фамилия у нашего Гомера, могла бы быть SIPson.
Итак, Homer это БЕСПЛАТНОЕ решение, предназначенное для захвата, анализа и мониторинга SIP и RTCP-трафика с широкими возможностями масштабирования способное «перемалывать» огромные объёмы трафика свойственные VoIP-операторам малого или среднего размера.
Эта система призвана облегчить инженерам поиск и устранение неисправностей в VoIP-сетях при помощи мощного анализа и визуализации SIP-диалогов между узлами и детальный просмотр всех SIP-сообщений. Решение позволяет сохранять выгружать SIP-трейсы вызовов в виде pcap дампов или текстовых файлов. Еще одним преимуществом решения является возможность разнесения компонентов системы по разным узлам, что позволяет масштабировать систему.
Обзор похожего, но платного решения, разработка которого, к сожалению, давно прекращена можно найти по данной ссылке – Мониторинг сети VoIP с помощью VQManager
Решение Homer состоит из нескольких подсистем. Рассмотрим эти подсистемы и механизм их взаимодействия межу собой.
В составе 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 евро в месяц.
Второй – в сети заказчика(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
Нагрузка на машину не большая, хотя она молотит. Ниже вывод htop.
# :/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
Под эту виртуальную машину зарезервирован отдельный физический диск под виртуальную машину.
Постоянное число регистраций: 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 и сети.
Создаём сети:
Причем для 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, таким образом, они могут быть легко объединены для создания нескольких независимых цепей захвата трафика. Графически это можно представить следующим образом:
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.
$GIT/homer-api/sql/schema_configuration.sql
Если вы зашли в в веб-интерфейс(admin / test123), а там «No Data Available».
При этом вы уверены в следующем: Трафик от агента поступает в коллектор и настройки фильтрации по временному интервалу для этого трафика установлены корректно. То нужно проверить следующее:
Настройки в Panels -> System Admin , апплет Admin Node. Здесь находим запись нужную нам, например, с id 1.
Затем, смотрим учётные данные.
Проверяем учётную запись:
# 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)
Теперь с учётом данных настроек, правим пользователя, также можно поправить имя ноды.
Вторую запись «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 теряет пакеты
Ответ: увеличивать производительность. Чаще всего слабое место – дисковая подсистема. Если трафика много, то нагрузка на неё сильно возрастает. Самый простой способ посмотреть что происходит можно при помощи утилиты 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.
После успешной авторизации мы попадаем в главное меню где размещаются настраиваемые виджеты
Виджет вверху слева – быстрый поиск, справа – график количества различных SIP-сообщений за указанный интервал. Сам интервал выбирается в верхнем правом углу. С выбором интервала нужно быть очень внимательным. Система запоминает какой интервал был выбран даже после повторной авторизации. Так, после повторного входа через месяц установиться временной интервал месячной давности. Он же будет использован при поиске SIP-трейсов и отображения статистики, со всеми вытекающими “No Data Available”.
Меню выбора даты выглядит вот так:
Выставляем нужный интервал и интервал по шаблону. Можно выставить авто обновление диапазона времени. Основное меню выглядит следующим образом:
SIP-search – меню поиска по сохранённым SIP-трейсам. Ниже форма поиска, она настраивается.
Поиск можно осуществлять как по одному из полей так и по их комбинации “И”. Можно использовать не точный поиск наподобие %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
Ищем по двум БД:
Получаем следующий вывод:
Мы нашли SIP-трейсы для указанного номера на двух узлах. При нажатии на CallID вызова всплывает модальное окно с детальным обменом SIP-сообщениями.
Здесь есть 3 вкладки, собственно Call-Flow это сам трейс. Он представлен в графическом виде, стрелками указаны направления сообщений – кто инициатор и кто получатель. При нажатии на каждое из SIP-сообщений диалога открывается его полный листинг(вкладка Messages)
На вкладке Details представлены все поля по которым может быть найдено сообщение. В примере ниже на изображении часть из них.
Рассмотрим другие вкладки.
Вкладка QoS Reports показывает RTP статистику:
Вкладка Export служит для экспорта вызова в различных форматах
- PCAP дамп
- Текстовый файл
- Изображение png
- Архивом
- Share Cloud и Share Link крайне удобно чтобы просто отправить ссылку но настраивается отдельно.
Следующий пункт меню Alarm Settings.
Здесь можно добавить оповещение администратора о том что превышена заданное число тех или иных сообщений
Пункт Geo Chart отображает статистику по IP-адресам на карте мира.
Пункт Get Started – краткий обзор веб-интерфейса
Пункт Stats: VoIP Traffic – статистика по трафику за заданный интервал.
Пункт System Admin. Здесь настраиваются:
- Пользователи и их права. Каждый пользователь может настроить персонально виджеты и их расположение.
- Алиасы узлов, например, чтобы в выдаче поиска вместо его IP-адреса 10.10.10.10 Homer показывал алиас 3053_CCM6-pub
- БД Homer
Вкладка IP-network показывает статистику по IP.
Homer также имеет API при помощи которых можно получить нужную информацию путём HTTP запросов в формате JSON.
Выводы
Homer является отличным бесплатным решением для анализа SIP-трафика. Уже сегодня активно используется различными компаниями и операторами связи.
Плюсы
- Простота установки и настройки
- Отсутствие лицензирования
- “Перемалывает” большие объёмы трафика
- Хорошая визуализация SIP-трейсов
- Возможность экспорта SIP-трейсов в различные форматы
Минусы
- Отсутствие подробной документации
- Требователен к дисковой подсистеме
- “Тихая” потеря трафика при высокой нагрузке
Автор: Игнат Кудрявцев
Похожие материалы:
Tags: Monitoring, SIP, Voice Quality Monitoring, VoIP