В данной статье я хотел бы описать процесс установки и настройки asterisk на Debian (Jessie). Asterisk будет работать с базой данных postgresql через ODBC.
Итак, мы установили asterisk, однако необходимо сделать ряд первичных действий.
Во-первых, asterisk работает из-под пользователя root - настроим работу от непривилегированного пользователя:
Установка asterisk:
-
Обновим систему до актуального состояния
apt-get update && apt-get dist-upgrade
-
Установим все необходимые зависимости для сборки asterisk
apt-get install gcc g++ uuid-dev libsqlite3-dev libxslt1-dev libjansson-dev libxml2-dev \ libncurses5-dev unixodbc-dev libnewt-dev libssl-dev libsqlite3-dev build-essential
-
Скачиваем последнюю версию asterisk. На момент написания статьи это 13 версия
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
-
Распаковываем архив и переходим в папку с исходным кодом
tar -xvf asterisk-13-current.tar.gz cd asterisk-13.6.0/
-
Запускаем процедуру проверки, собираем библиотеки и устанавливаем их в систему
./configure make make install
-
Установим скрипты запуска/останова
make config
-
Установим примеры конфигурационных файлов
make samples
-
Проверим что asterisk запускается через скрипты инициализации и подключимся к нему
service asterisk start asterisk -R
-
P.S. Если после запуска asterisk в логах /var/log/asterisk/messages проскакивают ошибки вида
ERROR[27158] ari/config.c: No configured users for ARI ERROR[27158] netsock2.c: getaddrinfo("debian-asterisk", "(null)", ...): Name or service not known
enabled = no ; When set to no, ARI support is disabled.
asterisk -rx 'module reload res_ari'
Итак, мы установили asterisk, однако необходимо сделать ряд первичных действий.
Во-первых, asterisk работает из-под пользователя root - настроим работу от непривилегированного пользователя:
-
Добавим системного пользователя и группу asterisk:
adduser --system --group --home /nonexistent --no-create-home asterisk
-
Изменим владельца и группу всех рабочих директорий asterisk
chown -R asterisk:asterisk /var/spool/asterisk/ chown -R asterisk:asterisk /var/run/asterisk/ chown -R asterisk:asterisk /var/log/asterisk/ chown -R asterisk:asterisk /var/lib/asterisk/ chown -R asterisk:asterisk /usr/lib/asterisk/
-
Укажем asterisk от имени какого пользователя пользователя и группы запускаться - эти параметры прописываются в файле /etc/asterisk/asterisk.conf
runuser = asterisk ; The user to run as. rungroup = asterisk ; The group to run as.
-
Перезапустим asterisk
service asterisk restart
-
По умолчанию, asterisk разрешает гостевые звонки сквозь себя без предварительной аутентификации вызываемой стороны. Гостевые вызовы запрещаются в /etc/asterisk/sip.conf одной строчкой
allowguest=no
-
Дополнительно изменим в /etc/asterisk/sip.conf контекст по умолчанию на default вместо public
context=default
и пропишем контекст default в /etc/asterisk/extensions.conf, добавив в него единственное правило запрета набора любых номеров. Вся работа по маршрутизации звонков будет происходить в других контекстах
-
Далее, отключим оповещения о неверном пароле - это необходимо чтобы asterisk "не засветил" валидных пользователей при попытках перебора паролей. При отключении данного оповещения ответ asterisk будет всегда однотипным независимо от того, валидный ли у нас пользователь или нет. В /etc/asterisk/sip.conf прописываем
alwaysauthreject=yes
-
После вышеприведенных изменений перезапустим перечитаем конфиги /etc/asterisk/sip.conf и /etc/asterisk/extensions.conf
asterisk -rx 'sip reload' asterisk -rx 'dialplan reload'
[default] exten => _X.,1,Hangup
-
Сначала перенастроим логирование asterisk в соответствие с форматом ISO 8601. Для этого нам нужен файл /etc/asterisk/logger.conf
dateformat=%F %T
-
Включим логирование security events в отдельный файл security
security => security
-
Перезапустим модуль логирования
asterisk -rx "logger reload"
-
Установим fail2ban
apt-get install fail2ban
-
Создадим "кастомный" файл /etc/fail2ban/jail.local и активируем в нем правила для asterisk
[asterisk] enabled = true filter = asterisk logpath = /var/log/asterisk/messages /var/log/asterisk/security port = 5060,5061 protocol = udp maxretry = 3 bantime = 86400 ; 1 day findtime = 3600 ; 1 hour ignoreip = 127.0.0.1/8
-
Прикажем fail2ban перечитать конфигурацию
service fail2ban reload
-
В случае успеха в iptables должны появиться соответствующие правила, наподобие следующих
root@debian-asterisk:~# iptables -L -vn Chain INPUT (policy ACCEPT 27 packets, 1844 bytes) pkts bytes target prot opt in out source destination 0 0 fail2ban-asterisk-security udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 5060,5061 0 0 fail2ban-asterisk udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 5060,5061 29 1948 fail2ban-ssh tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 18 packets, 2024 bytes) pkts bytes target prot opt in out source destination Chain fail2ban-asterisk (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 Chain fail2ban-ssh (1 references) pkts bytes target prot opt in out source destination 29 1948 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
-
Дополнительно настроим ротацию логов /var/log/asterisk/messages и /var/log/asterisk/security, так как они могут очень быстро наполняться. Для этого создадим в каталоге /etc/logrotate.d/ файл asterisk со следующим содержимом
/var/log/asterisk/messages /var/log/asterisk/security { weekly missingok rotate 4 compress nocreate postrotate /usr/sbin/asterisk -rx 'logger reload' endscript }
Настройка взаимодействия asterisk с postgresql через ODBC:
-
Установим postgresql-server
apt-get install postgresql
-
Создадим пользователя asterisk посредством которого мы будем подключаться и управлять базой данных. Для этого, сначала переключимся на пользователя postgres
su - postgres
postgres@debian-asterisk:~$ createuser --interactive -P asterisk Введите пароль для новой роли: Повторите его: Должна ли новая роль иметь полномочия суперпользователя? (y - да/n - нет) n Новая роль должна иметь право создавать базы данных? (y - да/n - нет) y Новая роль должна иметь право создавать другие роли? (y - да/n - нет) n
-
Создадим базу astersik и назначим ей в качестве владельца роль asterisk
createdb --owner=asterisk asterisk
-
Проверим подключение под ролью asterisk к базе данных
psql -h 127.0.0.1 -U asterisk Пароль пользователя asterisk: psql (9.4.5) SSL-соединение (протокол: TLSv1.2, шифр: ECDHE-RSA-AES256-GCM-SHA384, бит: 256, сжатие: выкл.) Введите "help", чтобы получить справку. asterisk=>
-
Если unixODBC не подтянулся по зависимостям, то установим его явно
apt-get install postgresql
-
Установим PostgreSQL ODBC connector
apt-get install odbc-postgresql
-
Настроим PostgreSQL ODBC driver, прописав в файл /etc/odbcinst.ini следующие данные
[PostgreSQL] Description=ODBC for PostgreSQL Driver=psqlodbca.so Setup=libodbcpsqlS.so FileUsage=1
-
Убедимся что система видит наш драйвер с помощью следующей команды. В случае успеха нам должна вернуться метка PostgreSQL
odbcinst -q -d [PostgreSQL]
-
Затем настроим файл /etc/odbc.ini, который используется для создания идентификатора, на который asterisk будет ссылаться в своей конфигурации
[asterisk-connector] Description = PostgreSQL connection to 'asterisk' database Driver = PostgreSQL Database = asterisk Servername = localhost Port = 5432 ReadOnly = No RowVersioning = No ShowSystemTables = No ShowOidColumn = No FakeOidIndex = No ConnSettings =
-
Проверим наше соединение к базе, использую программу isql. Вывод echo через канал направляется в isql, которое будет подключаться используя секцию asterisk-connector, ранее настроенную в /etc/odbc.ini. Подключение будет происходить под ранее созданной ролью asterisk с указанием пароля. В случае успеха, мы получим примерно следующий вывод
echo "select 1" | isql -v asterisk-connector asterisk some_secret_password +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select 1 +------------+ | ?column? | +------------+ | 1 | +------------+ SQLRowCount returns 1 1 rows fetched [PostgreSQL]
-
Теперь, когда мы настроили взаимодействие ODBC и postgresql, настроим asterisk к ODBC - для этого нам понадобится сконфигурировать файл /ect/asterisk/res_odbc.conf. Этот файл содержит набор параметров, которые различные модули asterisk'а используют для соединения с базой данных. Добавим в этот файл следующую секцию
[asterisk-conn] enabled => yes dsn => asterisk-connector username => asterisk password => asterisk pooling => no limit => 1 pre-connect => yes
Параметр dsn ссылается на соединение к базе данных, настроенное в /etc/odbc.ini. Параметр pre-connect говорит asterik'у подключиться к базе сразу же после загрузки модуля res_odbc.so.
-
Перезапустим модуль res_odbc
asterisk -rx 'module reload res_odbc.so'
-
Проверим подключение к базе дынных
asterisk -rx 'odbc show' ODBC DSN Settings ----------------- Name: asterisk-conn DSN: asterisk-connector Last connection attempt: 1970-01-01 05:00:00 Pooled: No Connected: Yes