Thank you for reading this post, don't forget to subscribe!
Asterisk PBX поддерживает возможность хранения конфигурации в различных СУБД. В нашей инструкции рассмотрим связку с MariaDB (MySQL) на Linux CentOS 7. Мы будем использовать ODBC коннектор и метод обработки RealTime или в реальном времени (после изменения конфигурации в базе, нам не нужно будет перезапускать сервер телефонии, чтобы применить настройки).
Подготовка сервера
Перед установкой телефонии выполним предварительные действия.
1. Устанавливаем необходимые программы
Обновляем пакеты:
yum update
Устанавливаем пакеты:
yum install gcc wget ntpdate automake libtool
* gcc нужен для сборки исходников, wget — для загрузки файлов из командной строки; ntpdate — синхронизации времени; automake — участвует в создании Makefile при запуске configure; libtool — обеспечивает процесс сборки и использования динамических библиотек.
2. Настраиваем время
Устанавливаем временную зону:
timedatectl set-timezone Europe/Moscow
* в данном примере московское время.
Устанавливаем утилиту для синхронизации времени и запускаем ее:
yum install chrony
systemctl enable chronyd --now
3. Настройка безопасности:
Создаем новый сервис в брандмауэре:
firewall-cmd --permanent --new-service=asterisk
Добавим в сервис нужные порты:
firewall-cmd --permanent --service=asterisk --add-port=5060/tcp
firewall-cmd --permanent --service=asterisk --add-port=5060/udp
firewall-cmd --permanent --service=asterisk --add-port=5061/tcp
firewall-cmd --permanent --service=asterisk --add-port=5061/udp
firewall-cmd --permanent --service=asterisk --add-port=4569/udp
firewall-cmd --permanent --service=asterisk --add-port=5038/tcp
firewall-cmd --permanent --service=asterisk --add-port=10000-20000/udp
* где 5060 — SIP, 5061 — SIP over TLS, 4569 — IAX, 5038 — AMI (Asterisk Manager Interface), 10000-20000 — диапазон для динамических портов.
Теперь добавляем созданный сервис как разрешенный:
firewall-cmd --permanent --add-service=asterisk
и перезапускаем фаервол:
firewall-cmd --reload
Установка Asterisk
Установка астериска выполняется путем сборки исходников. Сама процедура проходит в 3 этапа:
- Установка DAHDI (драйверов плат интерфейсов);
- Установка LibPRI (библиотека для работы с потоковыми TDM-интерфейсами);
- Собственно, сборка и установка Asterisk.
1. Сборка DAHDI
Устанавливаем исходники для используемого ядра:
yum install "kernel-devel-uname-r == $(uname -r)"
Загружаем исходник, распаковываем его и переходим в распакованный каталог:
wget https://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
tar -xvf dahdi-linux-complete-current.tar.gz
cd dahdi-linux-complete-*/
Выполняем сборку и установку:
make
make install
make install-config
Выходим из каталога с исходником:
cd ..
2. Сборка LibPRI
Процедура, во многом, похожа на сборку DAHDI. Загружаем исходник, распаковываем его и переходим в распакованный каталог:
wget https://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz
tar -xvf libpri-current.tar.gz
cd libpri-*/
Выполняем сборку и установку:
make
make install
Выходим из каталога с исходником:
cd ..
3. Установка самого астериска
Для начала, загружаем исходник на сервер. Так как мы планируем установить LTS версию, заходим на страницу https://www.asterisk.org/downloads/asterisk/all-asterisk-versions, раздел «Long Term Support (LTS) Releases» и копируем ссылку на загрузку пакета:
* Certified Asterisk — бизнес версия с поддержкой для коммерческих клиентов.
Используя ссылку, скачиваем на сервер программу:
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
Распаковываем архив и переходим в него:
tar -xvf asterisk-*.tar.gz
cd asterisk-*
Используем встроенный скрипт, чтобы установить зависимости для астериска:
./contrib/scripts/install_prereq install
./contrib/scripts/install_prereq install-unpackaged
Чистим образовавшиеся временные файлы:
make distclean
Добавляем библиотеку для работы с mp3:
./contrib/scripts/get_mp3_source.sh
Конфигурируем исходник:
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 --with-dahdi --with-pri --with-iconv --with-libcurl --with-speex --with-mysqlclient --with-jansson-bundled --with-pjproject-bundled
* полный перечень опция и что они означают можно посмотреть командой ./configure -h.
Продолжаем настройку:
make menuselect
Выбираем необходимые компоненты (в данном примере res_config_mysql, app_mysql, cdr_mysql):
Запускаем сборку и установку:
make
make install
Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:
make config
make samples
Установка завершена!
Базовая настройка и запуск
Открываем конфигурационный файл:
vi /etc/asterisk/asterisk.conf
Снимаем комментарии и редактируем следующие пункты:
1 2 3 4 |
runuser = asterisk rungroup = asterisk defaultlanguage = ru documentation_language = ru_RU |
Создаем учетную запись:
useradd asterisk -m
Задаем права на следующие каталоги:
chown -R asterisk:asterisk /var/run/asterisk
chown -R asterisk:asterisk /etc/asterisk
chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk
chown -R asterisk:asterisk /usr/lib64/asterisk
chown -R asterisk:asterisk /var/log/asterisk
Открываем файл:
vi /etc/asterisk/modules.conf
Добавляем две опции:
1 2 |
require = chan_sip.so require = chan_pjsip.so |
Проверяем настройки:
asterisk -c
Если программа запустится, мы увидим Asterisk Ready:
* все ошибки и предупреждения можно проигнорировать, но правильнее их исправить, отключив неиспользуемые модули.
Теперь можно запустить астериск как службу:
systemctl enable asterisk
systemctl start asterisk
Заведение пользователя
Создадим наш первый диалплан (правило обработки звонков):
vi /etc/asterisk/extensions.conf
Допишем в него следующее:
1 2 |
[outcaling] exten => _XXX,1,Dial(SIP/${EXTEN},,m) |
* в данном примере мы создаем контекст с именем outcaling для трехзначных номеров (XXX) с вызовом по SIP по внутреннему номеру.
Теперь создадим два внутренних номера:
vi /etc/asterisk/sip.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[public](!) type=friend context=outcaling host=dynamic disallow=all allow=alaw allow=ulaw language=ru qualify=yes canreinvite=yes call-limit=4 nat=no [101](public) regexten=101 secret=1234 callerid="101" <101> callgroup=1 pickupgroup=1 [102](public) regexten=102 secret=5678 callerid="102" <102> callgroup=1 pickupgroup=1 |
* сначала мы создали шаблон public, в который занесли общие параметры. Шаблон мы применили к создаваемым коротким номерам.
* где:
- [101], [102] — имена для обозначения номеров.
- type — типы проверки номеров. Могут быть peer, user или friend. Peer — вызовы сопоставляются с IP-адресами и номерами портов. User — проверка username. Friend — включает возможности peer и user (проверка username и IP-адреса источника) и лучше всего подходит для телефонов и телефонных программ.
- regexten — добавочный номер. Если не задан, используется имя.
- secret — пароль для аутентификации.
- context — контекст или группа правил.
- host — IP-адрес или имя клиента. Для автоматической регистрации используем dynamic.
- callerid — идентификатор пользователя при звонке.
- disallow — запрещает кодеки (задается перед параметром allow).
- allow — разрешает кодеки. alaw и ulaw — алгоритмы для кодеков g711.
- language — код используемого языка.
- callgroup — задает группу устройства (для возможности перехвата).
- pickupgroup — задает перечень групп, которые можно перехватывать.
- qualify — включает или отключает периодическую проверку подключенного клиента.
- canreinvite — включает или отключает прохождение голосового RTP трафика через Asterisk. Устанавливать, только если клиент поддерживает функцию SIP re-invites.
- call-limit — ограничение количества одновременных вызовов.
- nat — устанавливается в yes, если клиент находиться за NAT.
Перезапускаем наш сервис:
systemctl restart asterisk
Подключение телефона и проверка
Для проверки сервера устанавливаем софт-телефон на компьютер. Например, а качестве SIP-клиента под Windows можно установить бесплатную программу 3CX Phone, для Android — Zoiper.
Пример настройки клиента 3CX Phone:
Настраиваем подключение с логином и паролем 101 / 1234, второй — 102 / 5678. Пробуем позвонить.
Исправление ошибок
Рассмотрим процесс устранения предупреждений и ошибок во время запуска Asterisk.
Из-за неиспользуемых модулей
Для устранения данных проблем необходимо просто отключить данные модули.
Открываем файл:
vi /etc/asterisk/modules.conf
И в зависимости от ошибок, добавляем нижеперечисленные исправления…
res_phoneprov … Unable to find a valid server address or name
Отключаем res_phoneprov:
noload => res_phoneprov.so
res_config_ldap … No directory URL or host found
Отключаем res_config_ldap:
noload => res_config_ldap.so
res_config_pgsql … PostgreSQL RealTime: Failed to connect database asterisk on 127.0.0.1
Отключаем res_config_pgsql:
noload => res_config_pgsql.so
cel_pgsql … CEL pgsql config file missing global section
Отключаем cel_pgsql:
noload => cel_pgsql.so
cel_tds … cel_tds module had config problems; declining load
Отключаем cel_tds:
noload => cel_tds.so
Другие ошибки
ari/config … No configured users for ARI
ARI предоставляет API для Asterisk REST Interface. В данном примере, отключаем поддержку:
vi /etc/asterisk/ari.conf
Находим параметр enabled и меняем его значение на no:
1 |
enabled = no |
Установка СУБД
yum install mariadb-server
Разрешаем автозапуск сервиса и запускаем его:
systemctl enable mysql --now
Ставим пароль для суперпользователя СУБД:
mysqladmin -u root password
Сборка Asterisk
Если Asterisk уже установлен и изначально не собирался с учетом MySQL, необходимо выполнить сборку снова. Сначала смотрим версию установленного Asterisk:
asterisk -V
Переходим в каталог, куда будем загружать исходник:
cd /usr/src
Переходим по ссылке https://downloads.asterisk.org/pub/telephony/asterisk и копируем ссылку на нашу версию продукта. После скачиваем ее, например:
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
Распаковываем архив и переходим в каталог с распакованным содержимым:
tar -xvf asterisk-*.tar.gz
cd asterisk-*
Конфигурируем исходник:
./configure … --with-mysqlclient
* где … — опции + with-mysqlclient, который отвечает для работу с MySQL.
Например:
1 |
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 --with-dahdi --with-pri --with-iconv --with-libcurl --with-speex --with-jansson-bundled --with-pjproject-bundled --with-mysqlclient |
Открываем окно дополнительных настроек:
make menuselect
В разделе Add-ons ставим все опции, связанные с mysql:
Выбираем Save & Exit.
Собираем исходник и устанавливаем его:
make
make install
Настройка
СУБД
Подключаемся к MariaDB:
mysql -u root -p
Создаем базу данных и пользователя:
1 2 3 |
> CREATE DATABASE asterisk DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; > GRANT ALL PRIVILEGES ON asterisk.* TO 'asteruser'@'localhost' IDENTIFIED BY 'asterpassword123'; |
* данными командами мы создали базу данных asterisk и предоставили к ней доступ пользователю asteruser с паролем asterpassword123.
Загружаем данные в базу:
1 2 3 4 5 6 7 |
> use asterisk > source /usr/src/asterisk-18.13.0/contrib/realtime/mysql/mysql_config.sql > source /usr/src/asterisk-18.13.0/contrib/realtime/mysql/mysql_cdr.sql > source /usr/src/asterisk-18.13.0/contrib/realtime/mysql/mysql_voicemail.sql |
* где /usr/src/asterisk-18.13.0 — путь до распакованного исходника.
> \q
ODBC коннектор
В нашем примере используется MariaDB, поэтому нам нужно установить коннектор данной СУБД. Для этого переходим по ссылке mariadb.com/downloads/connectors и выбираем для загрузки ODBC-коннектор и нашу версию операционной системы:
Ниже появится ссылка, которую нужно скопировать:
В командной строке скачиваем файл, воспользовавшись ссылкой:
wget https://dlm.mariadb.com/2338606/Connectors/odbc/connector-odbc-3.1.16/mariadb-connector-odbc-3.1.16-centos7-amd64.tar.gz
Распаковываем архив:
tar -xvf mariadb-connector-odbc-*.tar.gz
Копируем драйверы:
cp mariadb-connector-odbc-*-centos7-amd64/lib/mariadb/lib* /usr/lib/
Настраиваем odbc драйвер:
vi /etc/odbcinst.ini
Добавляем строки:
1 2 3 4 5 |
... [MariaDB] Description = ODBC for MariaDB Driver = /usr/lib/libmaodbc.so FileUsage = 1 |
Для подключения астериска к базе, создаем DSN:
vi /etc/odbc.ini
1 2 3 4 5 6 |
[Asterisk] Driver = MariaDB SERVER=127.0.0.1 DATABASE = asterisk UID=asteruser PWD=asterpassword123 |
* где MariaDB — имя драйвера, который мы создали на предыдущем шаге; asterisk, asteruser, asterpassword123 — соответственно, имя базы данных, имя пользователя и пароль для подключения к СУБД.
Делаем тестовое подключение:
1 2 3 4 5 6 7 8 9 10 |
isql Asterisk +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ |
Пробуем посмотреть список таблиц:
1 |
SQL> show tables |
Мы должны увидеть что-то на подобие:
1 2 3 4 5 6 7 8 9 |
+--------------------------------------------------------------------------+ | Tables_in_asterisk | +--------------------------------------------------------------------------+ | alembic_version | | cdr | | extensions | | iaxfriends | | meetme | ... |
Отключаемся:
SQL> quit
Asterisk
Открываем конфигурационный файл с настройкой модулей:
vi /etc/asterisk/modules.conf
Добавляем в него следующие строки:
1 2 |
preload => res_odbc.so preload => res_config_odbc.so |
Настраиваем подключение к базе через DSN:
vi /etc/asterisk/res_odbc.conf
1 2 3 4 5 6 7 8 |
[asterisk-conf] enabled => yes dsn => Asterisk username => asteruser password => asterpassword123 pre-connect => yes max_connections => 100 sanitysql => select 1 |
Перезапускаем Asterisk:
systemctl restart asterisk
Подключаемся к его консоли:
asterisk -r
Проверяем, что астер увидел odbc:
> odbc show
Мы должны увидеть что-то на подобие:
1 2 3 4 5 6 |
ODBC DSN Settings ----------------- Name: asterisk-conf DSN: Asterisk Number of active connections: 1 (out of 100) Logging: Disabled |
Добавление настроек в базу
На текущем шаге, Asterisk будет использовать конфигурационные файлы. Рассмотрим процесс настройки использования СУБД с добавлением настроек в базу.
Создание extensions
Редактируем файл extconfig.conf:
vi /etc/asterisk/extconfig.conf
1 2 3 |
[settings] sipusers => odbc,asterisk-conf,sippeers sippeers => odbc,asterisk-conf,sippeers |
* мы добавили две строчки в раздел settings, которые говорят астериску искать пиры через odbc, настройку asterisk-conf.
Перезапускаем астер:
systemctl restart asterisk
В дальнейшем, все номера, которые мы будем добавлять в базу данных начнут использоваться в режиме реального времени (без необходимости перезапускать телефонную станцию).
Подключаемся к базе данных:
mysql -uasteruser -p
* и вводим пароль (в нашем случае asterpassword123).
Добавим 4-е коротких номера:
1 2 3 4 5 6 7 |
> INSERT INTO asterisk.sippeers (`name`, `defaultuser`, `host`, `type`, `context`, `secret`, `nat`, `callgroup`, `language`, `disallow`, `allow`, `regexten`, `call-limit`) VALUES ('1001', '1001', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1001', '4'), ('1002', '1002', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1002', '4'), ('1003', '1003', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1003', '4'), ('1004', '1004', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1004', '4'); |
* в данном примере мы создаем 4 номера 1001, 1002, 1003, 1004 с правилом обработки вызова в диалплане outcalling и паролем 1234.
Обновить запись можно командой UPDATE, например:
1 |
> UPDATE asterisk.sippeers SET `secret`='password' WHERE `name`='1001'; |
Правила вызова (контекст)
Открываем следующий файл:
vi /etc/asterisk/extconfig.conf
Добавляем в раздел [settings]:
1 2 3 |
[settings] ... extensions => odbc,asterisk-conf,extensions |
Открываем файл extensions.conf:
vi /etc/asterisk/extensions.conf
Создаем диалплан (группу правил):
1 2 |
[outcalling] switch => Realtime/outcalling@extensions |
Перезапускаем астер:
systemctl restart asterisk
Подключаемся к базе и добавляем правило в диалплан outcalling:
1 2 3 |
mysql -uasteruser -pasterpassword123 > INSERT INTO asterisk.extensions VALUES (NULL, 'outcalling', '_XXXX', '1', 'DIAL', 'SIP/${EXTEN},,m'); |
Можно сделать тестовый звонок для проверки нашей настройки.
Call Detail Record (CDR)
Теперь настроем хранение журнала вызовов в базе данных.
Открываем следующий файл:
vi /etc/asterisk/cdr_adaptive_odbc.conf
Добавляем в самый низ:
1 2 3 4 5 6 7 |
[cdr] connection=asterisk-conf table=cdr alias src => source alias channel => source_channel alias dst => dest alias dstchannel => dest_channel |
Перезапускаем астериск:
systemctl restart asterisk
Пробуем позвонить через наш астериск и после звонка смотрим записи в базе:
mysql -uasteruser -pasterpassword123 -e "SELECT * FROM asterisk.cdr"
Получим примерно следующее:
1 2 3 |
| accountcode | src | dst | dcontext | clid | channel | dstchannel | lastapp | lastdata | start | answer | end | duration | billsec | disposition | amaflags | userfield | uniqueid | linkedid | peeraccount | sequence | +-------------+------+------+-----------+---------------+-------------------+-------------------+---------+-------------+---------------------+--------+---------------------+----------+---------+-------------+---------------+-----------+--------------+--------------+-------------+----------+ | NULL | 1001 | 1004 | outcaling | "1001" <1001> | SIP/1001-00000000 | SIP/1004-00000001 | Dial | SIP/1004,,m | 2017-12-07 16:11:24 | NULL | 2017-12-07 16:11:32 | 7 | 0 | NO ANSWER | DOCUMENTATION | NULL | 1512652284.0 | 1512652284.0 | NULL | 0 | |
Или в более читаемом виде:
Поле | Пример значения | Описание поля |
---|---|---|
accountcode | NULL | Дополнительное поле для идентификации клиента. Может использоваться, если не хватает стандартного набора параметров. |
src | 1001 | Кто звонит. |
dst | 1004 | Кому позвонили. |
dcontext | outcaling | Контекст (группа правил обработки звонка). |
clid | "1001" <1001> | Caller identification или CID. Состоит из имени и номера звонящего. |
channel | SIP/1001-00000000 | Канал, который принимает вызов. |
dstchannel | SIP/1004-00000001 | Канал исходящего вызова. |
lastapp | Dial | Dialplan обработки вызова. |
lastdata | SIP/1004,,m | Что передавалось в lastapp. |
start | 2017-12-07 16:11:24 | Начало звонка. |
answer | NULL | Время, за которое подняли трубку. NULL — трубку не подняли. |
end | 2017-12-07 16:11:32 | Дата и время окончания звонка. |
duration | 7 | Длительность звонка в секундах. |
billsec | 0 | Время разговора (с момента поднятия трубки). |
disposition | NO ANSWER | Состояние вызова. Возможные варианты: - ANSWERED - отвечен. - NO ANSWER - ответа нет. - CONGESTION / FAILED - ошибка вызова. - BUSY - занято. |
amaflags | DOCUMENTATION | Не используется. |
userfield | NULL | Пользовательские параметры для канала. |
uniqueid | 1512652284.0 | Уникальный идентификатор канала звонящего. |
linkedid | 1512652284.0 | Уникальный идентификатор канала звонящего. |
peeraccount | NULL | Код учетной записи канала Стороны 2. |
sequence | 0 | Номер последовательности канала. |
Также существуют продукты, позволяющие в графическом интерфейсе смотреть CDR. Например, веб-приложение Asterisk CDR Viewer Mod.