Установка Asterisk 16 на Debian 10 или Centos 7, 8

установка subversion, speex-devel, wget, bzip2, pjproject, nano

yum install epel-release gcc gcc-c++ subversion speex-devel wget bzip2 pjproject nano openssl

отключить SELINUX:

nano /etc/selinux/config
SELINUX=disabled

перезагрузить

reboot now

загрузить asterisk

# cd /usr/src
# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz

распаковка

# tar xzvf asterisk-16-current.tar.gz

перейти в распакованную директорию

# cd asterisk-16.*

 

Установка зависимостей

Установка пакетов для шифрования TLS:

# yum install http://repo.okay.com.mx/centos/7/x86_64/release/okay-release-1-1.noarch.rpm
# yum install libsrtp-devel

или скачать и установить:

для Centos 7:

libsrtp-1.4.4-11.20101004cvs.el7.x86_64.rpm

libsrtp-devel-1.4.4-10.20101004cvs.el7.x86_64.rpm

для Centos 8:

libsrtp-1.5.4-8.el8.x86_64.rpm

libsrtp-devel-1.5.4-8.el8.x86_64.rpm

 

Установка jansson:

# yum install https://disweb.ru/files/rpm/jansson-2.11-2.2.x86_64.rpm https://disweb.ru/files/rpm/jansson-devel-2.11-2.2.x86_64.rpm

 

установить все зависимости

# contrib/scripts/install_prereq install

При установке на Centos 7 не было найдено 3 пакета: speexdsp-devel, iksemel-devel, hoard

Вместо speexdsp-devel, установить пакет speex-devel.

Для установки пакета iksemel-devel не нашел решения.

скачать исходники mp3

# contrib/scripts/get_mp3_source.sh

 

Установка

подготовка исходников к компиляции

# ./configure

На Centos 7 подготовка исходников закончилась с ошибкой:

configure: *** Asterisk requires libjansson >= 2.11 and no system copy was found.
configure: *** Please install the 'libjansson' development package or
configure: *** use './configure --with-jansson-bundled'

При проверке на существование пакета:

# rpm -qa | grep jansson
jansson-2.10-1.el7.x86_64
jansson-devel-2.10-1.el7.x86_64

Версия пакетов не подходит.

Установка подходищих версий:

# yum install https://disweb.ru/files/rpm/jansson-2.11-2.2.x86_64.rpm https://disweb.ru/files/rpm/jansson-devel-2.11-2.2.x86_64.rpm

 

выбрать компоненты asterisk для установки

# make menuselect
  • на первой вкладке выбрать format_mp3.
  • вкладка Core Sound Packages выбрать RU-WAV
  • вкладка Extras Sound Packages выбрать EN-WAV

Для работы TLS нужно проверить, что установлено Resource Modules -> res_srtp

нажать Save & Exit

запуск компиляции (-j<количество задействованных ядер процесора>)

# make -j2

ошибка при компиляции:

[CC] res_hep.c -> res_hep.o
   [CC] res_ari_device_states.c -> res_ari_device_states.o
   [CC] ari/resource_device_states.c -> ari/resource_device_states.o
   [CC] res_sorcery_memory_cache.c -> res_sorcery_memory_cache.o
   [CC] res_srtp.c -> res_srtp.o
   [CC] res_pjsip_outbound_publish.c -> res_pjsip_outbound_publish.o
   [CC] res_timing_timerfd.c -> res_timing_timerfd.o
   [CC] res_fax_spandsp.c -> res_fax_spandsp.o
res_fax_spandsp.c: In function ‘set_logging’:
res_fax_spandsp.c:452:2: warning: passing argument 2 of ‘span_log_set_message_handler’ from incompatible pointer type [enabled by default]
  span_log_set_message_handler(state, spandsp_log);
  ^
In file included from /usr/include/spandsp.h:53:0,
                 from res_fax_spandsp.c:67:
/usr/include/spandsp/logging.h:123:20: note: expected ‘message_handler_func_t’ but argument is of type ‘void (*)(int,  const char *)’
 SPAN_DECLARE(void) span_log_set_message_handler(logging_state_t *s, message_handler_func_t func, void *user_data);
                    ^
res_fax_spandsp.c:452:2: error: too few arguments to function ‘span_log_set_message_handler’
  span_log_set_message_handler(state, spandsp_log);
  ^
In file included from /usr/include/spandsp.h:53:0,
                 from res_fax_spandsp.c:67:
/usr/include/spandsp/logging.h:123:20: note: declared here
 SPAN_DECLARE(void) span_log_set_message_handler(logging_state_t *s, message_handler_func_t func, void *user_data);
                    ^
res_fax_spandsp.c: In function ‘set_ecm’:
res_fax_spandsp.c:482:44: error: ‘T30_SUPPORT_T4_1D_COMPRESSION’ undeclared (first use in this function)
  t30_set_supported_compressions(t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
                                            ^
res_fax_spandsp.c:482:44: note: each undeclared identifier is reported only once for each function it appears in
res_fax_spandsp.c:482:76: error: ‘T30_SUPPORT_T4_2D_COMPRESSION’ undeclared (first use in this function)
  t30_set_supported_compressions(t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
                                                                            ^
res_fax_spandsp.c:482:108: error: ‘T30_SUPPORT_T6_COMPRESSION’ undeclared (first use in this function)
  t30_set_supported_compressions(t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
                                                                                                            ^
res_fax_spandsp.c: In function ‘spandsp_fax_start’:
res_fax_spandsp.c:969:2: warning: passing argument 2 of ‘t30_set_phase_e_handler’ from incompatible pointer type [enabled by default]
  t30_set_phase_e_handler(p->t30_state, t30_phase_e_handler, s);
  ^
In file included from /usr/include/spandsp.h:122:0,
                 from res_fax_spandsp.c:67:
/usr/include/spandsp/t30_api.h:557:20: note: expected ‘t30_phase_e_handler_t’ but argument is of type ‘void (*)(struct t30_state_t *, void *, int)’
 SPAN_DECLARE(void) t30_set_phase_e_handler(t30_state_t *s, t30_phase_e_handler_t handler, void *user_data);
                    ^
res_fax_spandsp.c: In function ‘load_module’:
res_fax_spandsp.c:1259:2: error: too few arguments to function ‘span_set_message_handler’
  span_set_message_handler(NULL);
  ^
In file included from /usr/include/spandsp.h:53:0,
                 from res_fax_spandsp.c:67:
/usr/include/spandsp/logging.h:125:20: note: declared here
 SPAN_DECLARE(void) span_set_message_handler(message_handler_func_t func, void *user_data);
                    ^
make[1]: *** [res_fax_spandsp.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [res] Error 2

устранил данную ошибку отключив библиотеку: Resource Modules -> res_fax_spandsp

 

установка asterisk и всех его модулей

# make install

формирование образцов файлов конфигурации

# make samples

создание init скрипта

# make config

обновить кэш используемых динамических библиотек

# /sbin/ldconfig

 

Запуск

создать пользователя

# /sbin/adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk" asterisk
# /sbin/usermod -a -G dialout,audio asterisk

для Centos

# useradd --system --home-dir /var/lib/asterisk --no-create-home --comment "Asterisk" asterisk
# usermod -a -G dialout,audio asterisk

раскомментировать в конфиге: Centos: /etc/sysconfig/asterisk; Ubuntu: /etc/default/asterisk

AST_USER="asterisk"
AST_GROUP="asterisk"

назначить пользователю права на директории asterisk

# chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk

запуск  астериска

# systemctl start asterisk

проверка статуса работы

# systemctl status asterisk

добавить в автозапуск

# systemctl enable asterisk

Открыть CLI консоль астериска:

# /usr/sbin/asterisk -rvvvvv

 

Firewalld

Открыть в Firewall (в большинстве случаев используются эти порты):

firewall-cmd --zone=public --add-port=5060/tcp --permanent
firewall-cmd --zone=public --add-port=5060/udp --permanent
firewall-cmd --zone=public --add-port=5061/tcp --permanent
firewall-cmd --zone=public --add-port=5061/udp --permanent
firewall-cmd --zone=public --add-port=4569/udp --permanent
firewall-cmd --zone=public --add-port=5038/tcp --permanent
firewall-cmd --zone=public --add-port=10000-20000/udp --permanent

Применить изменения:

firewall-cmd --reload

ИЛИ можно разрешить порты через скрипт BASH (firewalld-asterisk.sh):

#!/bin/bash

PORTS=('5060/tcp' '5060/udp' '5061/tcp' '5061/udp' '4569/udp' '5038/tcp' '10000-20000/udp')
SERVICE_FILE="/etc/firewalld/services/asterisk.xml"

if [ ! -e "${SERVICE_FILE}" ]; then
    firewall-cmd --permanent --new-service=asterisk
fi

for PORT in ${PORTS[@]}; do
    firewall-cmd --permanent --service=asterisk --add-port=${PORT}
done

firewall-cmd --permanent --zone=public --add-service=asterisk
firewall-cmd --reload
firewall-cmd --list-all-zones

 

iptables

Открыть порты, если UDP:

iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 5061 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT

Для TCP:

iptables -A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5061 -j ACCEPT

Пример разрешение с определенных IP:

iptables -A INPUT -p udp -m udp -s 123.123.123.123 --dport 5060 -j ACCEPT

Пример с определенной подсети:

iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 5060 -j ACCEPT

Применить изменения:

service iptables save

 

Настройка NAT в Asterisk, нет звука или звук есть в одну сторону

 

Ошибки

если в статусе есть ошибка:

radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory

в /etc/asterisk/cdr.conf раскомментировать и отредактировал строки:

[radius]
radiuscfg => /etc/radcli/radiusclient.conf

то же самое в /etc/asterisk/cel.conf:

[radius]
radiuscfg => /etc/radcli/radiusclient.conf

перезагрузить астериск и проверить статус

# systemctl restart asterisk
# systemctl status asterisk

 

При попытки открыть консоль CLI:

# asterisk -rvvvvv
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)

Для решения данного вопроса нужно открыть на редактирование:

# nano /etc/selinux/config

Отключить SELINUX

SELINUX=disabled

перезагрузить компьютер:

# reboot

 

Ошибка при звонке:

Matched device setup to use SRTP, but request was not!

Если подключаеться другая Asterisk то параметрах пользователя установить:

encryption=yes

 

Ошибка при подключении SIP клиента:

[Jun 26 15:35:03] WARNING[2194]: chan_sip.c:17118 parse_register_contact: Domain '192.168.0.100:5060' disallowed by contact ACL (violating IP 192.168.0.100)

В параметрах sip.conf или у пользователя к примеру в user.conf установлено ограничение для подключаемой подсети:

contactpermit=192.168.1.0/255.255.255.0

Нужно добавить в исключение IP адрес или подсеть (в данном случае посеть):

contactpermit=192.168.0.0/255.255.255.0

 

Нет прав у Apache выполнить команды CLI Asterisk

к примеру данный запрос с Apache возвращает пустой результат:

asterisk -rx "sip show peers"

для решения данной ситуации нужно открыть файл конфигурации /etc/asterisk/asterisk.conf и раскоментировать данные строки:

;...
[files]
astctlpermissions = 0660
astctlowner = root
astctlgroup = apache
astctl = asterisk.ctl

при необходимости можно указать иных пользователей для кого будут доступны CLI команды